软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

14
即使在没有必要的情况下,我也应该在逻辑语句中使用括号吗?
假设我有一个布尔条件,a AND b OR c AND d并且我使用的语言中AND的操作先例比的先后顺序高OR。我可以编写以下代码行: If (a AND b) OR (c AND d) Then ... 但实际上,这等效于: If a AND b OR c AND d Then ... 是否有支持或反对包含多余括号的论点?实践经验是否表明值得将它们包括在内以提高可读性?还是表明开发人员需要真正坐下来并对他们的语言基础充满信心?

7
These修斯之船适用于GPL-如果我更换所有派生零件,是否可以重新许可我的程序?
我将 GPLv2 C程序翻译为Python,但发现很难按设计进行扩展并重写其中的大部分内容。该程序现在在结构上完全不同,但是有几个逐字翻译功能正在使用中。 These修斯悖论之船(如维基百科所述)“提出了这样一个问题,即已将其所有组成部分都替换掉的对象是否在根本上仍然是同一对象。” 如果我确实设法编写了逐字记录功能的替代品,那么我是否可以重新许可我偏爱的许可证? 相关,我是否可以将经过改进的体系结构提取出来并以其他许可证重新使用?我认为它本身将非常有用,但是不喜欢现在已被GPL许可证“污染”的想法。 后续:我决定与版权所有者联系并获得许可。有时,最好的方法是进行社交而非编程互动!
99 licensing  gpl 

5
当我们已经有了抽象类时,为什么要将默认方法和静态方法添加到Java 8的接口中?
在Java 8中,接口可以包含已实现的方法,静态方法和所谓的“默认”方法(实现类不需要重写)。 以我的观点(可能是幼稚的),不需要违反这样的接口。接口一直是您必须履行的合同,这是一个非常简单而纯粹的概念。现在,它是几件事情的混合体。在我看来: 静态方法不属于接口。它们属于实用程序类。 根本不应该在接口中允许使用“默认”方法。为此,您可以始终使用抽象类。 简而言之: 在Java 8之前: 您可以使用抽象和常规类来提供静态和默认方法。接口的作用很明显。 接口中的所有方法都应通过实现类来覆盖。 您不能在不修改所有实现的情况下在接口中添加新方法,但这实际上是一件好事。 在Java 8之后: 接口和抽象类之间几乎没有区别(除了多重继承)。实际上,您可以使用接口模拟常规类。 在对实现进行编程时,程序员可能会忘记覆盖默认方法。 如果类试图实现两个或多个具有默认方法且具有相同签名的接口,则会出现编译错误。 通过向接口添加默认方法,每个实现类都会自动继承此行为。这些类中的某些类可能并未在设计时考虑到该新功能,因此可能会引起问题。例如,如果有人将新的默认方法添加default void foo()到interface Ix,则不会编译Cx实现Ix并具有具有foo相同签名的私有方法的类。 进行此类重大更改的主要原因是什么?它们会带来哪些新的好处(如果有)?

14
编写依赖于编译器优化的代码是不好的做法吗?
我一直在学习一些C ++,并且经常不得不从该函数内创建的函数中返回大型对象。我知道有按引用传递,返回指针和返回引用类型的解决方案,但我还读到C ++编译器(和C ++标准)允许返回值优化,从而避免了通过内存复制这些大对象,从而节省所有时间和内存。 现在,当以值显式返回对象时,我感到语法更加清晰,并且编译器通常将使用RVO并使过程更高效。依靠这种优化是不好的做法吗?这对于用户来说使代码更清晰,更易读,这是非常重要的,但是我应该谨慎地假设编译器会抓住RVO的机会吗? 这是微优化,还是在设计代码时应牢记的一点?
99 c++  performance 

12
有人告诉我,异常仅应在例外情况下使用。我怎么知道我的案子是否特殊?
我在这里的特定情况是用户可以将字符串传递到应用程序中,应用程序将对其进行解析并将其分配给结构化对象。有时,用户可能输入了无效的内容。例如,他们的输入可能描述一个人,但他们可能说他们的年龄是“苹果”。在这种情况下,正确的行为是回滚事务并告诉用户发生了错误,他们将不得不再次尝试。可能需要报告我们在输入中发现的每个错误,而不仅仅是第一个。 在这种情况下,我认为我们应该抛出异常。他不同意,说:“例外应该是例外:应该预期用户可能会输入无效数据,所以这不是例外情况”,我真的不知道该如何辩驳,因为按照单词的定义,他似乎是正确的。 但是,据我了解,这就是为什么首先发明例外的原因。过去,您必须检查结果以查看是否发生错误。如果检查失败,可能会在您不注意的情况下发生不良情况。 无一例外,堆栈的每个级别都需要检查调用的方法的结果,如果程序员忘记检入这些级别之一,则代码可能会意外继续并保存无效数据(例如)。这种方式似乎更容易出错。 无论如何,请随时纠正我在这里所说的任何内容。我的主要问题是,如果有人说例外应该是例外,我怎么知道我的情况是否是例外?

12
如果执行TDD,是否应该避免使用私有方法?
我现在正在学习TDD。我的理解是,私有方法是不可测试的,不应担心,因为公共API将提供足够的信息来验证对象的完整性。 我了解OOP已有一段时间了。据我了解,私有方法使对象更易于封装,从而更能抵抗更改和错误。因此,默认情况下应使用它们,并且仅将对客户端重要的那些方法公开。 好吧,对于我来说,可以创建一个仅具有私有方法并通过侦听其他事件与其他对象进行交互的对象。这将被非常封装,但是完全不可测试。 另外,为了测试而添加方法也被认为是不好的做法。 这是否意味着TDD与封装不一致?适当的余额是多少?我现在倾向于公开大多数或所有方法...

6
Java中的堆栈和堆内存
据我了解,在Java中,堆栈内存保存了原语和方法调用,而堆内存则用于存储对象。 假设我有一堂课 class A { int a ; String b; //getters and setters } a类中的基元A将存储在哪里? 为什么堆内存根本存在?为什么我们不能将所有内容都存储在堆栈中? 当对象被垃圾回收时,与对象相关联的堆栈是否被破坏?

19
如何指导初级开发人员
这个标题有点宽泛,但是我可能需要提供一些背景知识才能正确地提出我的问题。 我知道已经在这里问 过类似的问题。但就我而言,我并不是问我是否应该指导某人,或者该人是否适合成为软件开发人员。那不是我的判断力。尚未直接询问我,但是很明显,我本人和其他资深开发人员将指导从这里开始的新开发人员。我对此没有任何问题,在很多情况下,它使我对事物有了新的认识,最终我在过程中学习了。另外,我还记得有人花一些时间教我一些东西,这对我职业生涯的开始是多么有益。 当我说“新开发人员”时,他们可能从大学刚毕业到拥有一两年的工作经验都可以。 最近我们有一些人从这里开始,他们似乎对开发/编程持不同的态度,这与我自己的态度不同,我很难调和。他们仅提取足够的信息来完成任务,但不能真正从中学习。我发现自己和他们反复讨论同样的问题。我知道其中的一部分可能是一种个性,但是我觉得尽自己最大的努力并在它们处于我的翅膀下时将它们推出巢穴是我的工作。 我该如何传递足够的信息,使他们能够学习但又不付出太多,无法为他们解决问题? 也许: 对那些旨在采取阻力最小的问题并从本质上强迫他们学习而不是走简单道路的问题,正确的回答是什么? 这些问题可能是更一般的教学问题,与软件开发没有太多关系。 注意:关于他们正在执行的任务,我没有任何发言权。管理人员将任务分配出去了,它可以是很简单的错误修复,也可以是自己启动整个应用程序。尽管这绝对不是理想的方法,并且显然提出了自己的挑战,但我认为这是剩下的另一个问题了。因此,我能做的最好的就是帮助他们解决当前的问题,并尝试将其分解为更简单的问题,并检查他们的提交日志并指出他们犯的错误。 我的主要目标是: 帮助他们,并为他们提供开始变得更加自力更生所需的工具。 引导他们朝正确的方向发展,并尽早打破不良的发展习惯。 减少我花在他们身上的时间(上述个性类型通常需要更多一对一的时间,并且在IM或电子邮件上效果不佳。虽然这通常很好,但我不能总是停止我的工作)我正在努力,大步向前,并帮助他们立即纠正错误;我有自己的项目需要完成)。
99 culture  mentor 

8
'\ n'和'\ r \ n'之间的区别
是的,我知道可以'\n'在UNIX 中写换行符,而对于Windows,则有两个字符序列:'\r\n'。从理论上讲,所有这些都很好,但是我的问题是为什么?为什么在Windows中回车符是多余的?如果UNIX可以做到这一点,\n为什么Windows则需要两个字符来完成呢? 我正在阅读David Beazley的Python书,他说: 例如,在Windows上,写入字符'\ n'实际上会输出两个字符的序列'\ r \ n'(并且在读回文件时,'\ r \ n'被转换回单个'\ n'字符)。 为什么要付出额外的努力? 我会说实话。我很早就知道它们之间的区别了,但是从来没有问过为什么。我希望今天能回答。 谢谢你的时间。



6
为什么不推荐使用<b>和<i>标签?
这个问题是在我的一门大学课程中提出的。教授只给出了一个更具描述性的答案,但是看起来&lt;b&gt;和&lt;i&gt;含义都相当明确,而且比&lt;strong&gt;和更容易键入&lt;em&gt;。 弃用这些标签的官方说法是什么?
98 html  deprecation 

11
使用模拟对象时,如何检测单元测试的依赖性问题?
您有一个X类,并且编写了一些验证行为X1的单元测试。还有一个类A,它把X作为依赖项。 为A编写单元测试时,您将模拟X。换句话说,在对A进行单元测试时,您将(假设)X的模拟行为设置为X1。时间的流逝,人们确实在使用您的系统,需要改变,X演变:您修改X以显示行为X2。显然,针对X的单元测试将失败,您需要对其进行调整。 但是A呢?修改X的行为后(由于X的模拟),针对A的单元测试不会失败。当使用“真实”(修改的)X运行时,如何检测A的结果会有所不同? 我期望得到以下答案:“这不是单元测试的目的”,但是单元测试有什么价值呢?它真的只是告诉您,当所有测试通过时,您还没有进行重大更改吗?当某个班级的行为发生变化时(有意或无意),您如何发现(最好以自动化方式)所有后果?我们不应该更多地关注集成测试吗?

9
为什么很难使Java程序“本机显示”?
大多数Java应用程序看起来与C / C ++应用程序不同。Swing可能被设计为具有独特的外观,但是根据我的阅读,例如SWT试图“看起来很自然”,但没有成功。 我的问题是: 对于Java语言的开发人员来说,为什么要设计出完全复制本机GUI 外观的GUI系统很困难?本机GUI有什么不同?设计不仅仅是看起来像“本机”按钮的按钮吗?还是比这更深入?
98 java  gui 

7
为什么控制反转以这种方式命名?
这些话invert或control根本不使用在我见过的定义来定义控制反转。 定义 维基百科 控制反转(IoC)是一种编程技术,在此以面向对象编程的形式表示,其中对象耦合在运行时由汇编程序对象绑定,通常在编译时使用静态分析是未知的。〜http://en.wikipedia.org/wiki/Inversion_of_control 马丁·福勒 控制反转是Java社区中的一种常见模式,可帮助连接轻量级容器或将来自不同项目的组件组装到一个内聚的应用程序中。〜基于 http://www.martinfowler.com/articles/injection.html (改写) 那么,为什么将控制反转称为控制反转?什么控制被颠倒了?有没有一种方法可以使用术语“ 反转和控制”来定义“控制反转”?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.