软件工程

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

2
仅标头库更有效吗?
假设条件 C ++的仅标头库的优点之一是它们不需要单独编译。 inline仅当函数在头文件*中定义时,在C和C ++中才有意义。 传统上,在C中,使用.c / .h布局,其中标头代表翻译单元的最小公共接口。同样,.cpp / hpp。 题 仅标头库通常比传统布局在代码和执行时间上更有效吗?如果是这样,是否是因为进行了广泛的内联或其他优化? *-在标头中定义函数使编译器可以在编译任何翻译单元时查看实现,并且实际上使内联代码成为可能
48 c++  c  libraries 

15
干净的代码:很少参数的函数[关闭]
我读过罗伯特·C·马丁(Robert C. Martin)的“ 清洁代码”的第一章,在我看来,这很不错,但是我怀疑,在某种程度上,有人提到函数应该具有尽可能少的参数是很有意义的(认知上)甚至可能暗示3个或更多参数对于一个函数来说太过昂贵了(我发现它非常夸张和理想化),所以我开始怀疑... 使用全局变量和在函数上传递许多参数的实践都是不好的编程习惯,但是使用全局变量可以大大减少函数中参数的数量。 所以我想听听您对此的看法,使用全局变量减少函数参数的数量是否值得?在什么情况下会呢? 我认为这取决于几个因素: 源代码大小。 平均功能参数数。 功能数量。 使用相同变量的频率。 我认为,如果源代码的大小相对较小(例如少于600行代码),则有许多函数,将相同的变量作为参数传递,并且这些函数具有许多参数,那么使用全局变量将是值得的,但是我想知道... 你有我的看法吗? 您对源代码较大的其他情况有什么看法? PS。我看到了这篇文章,标题非常相似,但是他没有问我想知道什么。

16
在for循环内,如果可能,是否应该将中断条件移到条件字段中?[关闭]
有时我需要循环,需要这样的中断: for(int i=0;i<array.length;i++){ //some other code if(condition){ break; } } 我对写作感到不舒服 if(condition){ break; } 因为它消耗3行代码。我发现循环可以重写为: ↓ for(int i=0;i<array.length && !condition;i++){ //some other code } 所以我的问题是,如果可能的话,将条件移至条件字段以减少代码行是否是一种好习惯?

4
如何处理GitHub中的遗弃问题?
如果有人在GitHub上发布问题,但询问并且从未给出更多信息来重现该错误,则正常程序是什么?实例。 作者在这里指出“导航中断”。虽然我相信它是固定的,但我希望作者能确保我们正在谈论同一件事。但有时候,问题的记者就消失了。为遗留的问题设置到期日期是一种好/常见的做法吗? 类似于以下情况: 对此问题提出了一个问题,以便能够对其进行调试。 自开发团队上一次未回答的问题/评论以来,已经过去了2到6个月。 错误在关闭时无法复制(出于任何原因,也许永远都无法复制)。 关闭警告前2周会发出警告。 项目通常做什么?我在Google上找不到任何东西。另外,我将如何记录呢?README.md中的简单注释是否详细说明了上述要点,并在问题中提供注释以说明为什么将其关闭就足够了? 注意:与该问题有所不同,因为该错误可能仍然是相关的(或无关),但是缺少信息。

8
什么时候不使用虚拟析构函数?
我相信我搜索了许多有关虚拟析构函数的内容,其中大多数提到虚拟析构函数的目的以及为什么需要虚拟析构函数。我还认为,在大多数情况下,析构函数必须是虚拟的。 然后的问题是:为什么c ++默认不将所有析构函数设置为虚拟?或其他问题: 什么时候不需要使用虚拟析构函数? 在这种情况下,我不应该使用虚拟析构函数? 即使我不需要虚拟析构函数,使用虚拟析构函数的成本是多少?

6
隐藏的AJAX请求伪造性能有多安全?
什么是隐藏的AJAX请求? 我注意到,旨在使用户操作立即发生的隐藏AJAX请求的使用率有所增加。我将这种类型的AJAX请求称为非阻塞。这是一个AJAX请求,用户没有意识到它正在发生,它是在后台执行的,它的操作是无声的(没有冗长的指示AJAX调用已成功完成)。目的是使操作看起来确实在尚未真正完成时立即发生。 这是非阻塞AJAX请求的示例; 用户单击电子邮件集合上的删除。这些项目会立即从其收件箱中消失,并且可以继续进行其他操作。同时,AJAX请求正在后台处理项目的删除。 用户填写新记录表格。单击保存。新项目将立即显示在列表中。用户可以继续添加新记录。 为了澄清起见,下面是阻止AJAX请求的示例; 用户单击电子邮件集合上的删除。出现沙漏光标。发出AJAX请求,并在响应时关闭沙漏光标。用户必须等待一秒钟才能完成操作。 用户填写新记录表格。单击保存。带有AJAX加载程序动画的表格会变成灰色。显示一条消息“您的数据已保存”,新记录出现在列表中。 上述两种情况之间的区别在于,非阻塞AJAX设置不提供操作执行的反馈,而阻塞AJAX设置提供。 隐藏的AJAX请求的风险 此类AJAX请求的最大风险是,当AJAX请求失败时,Web应用程序可能处于完全不同的状态。 例如,一个非阻塞示例; 用户选择一堆电子邮件。单击删除按钮。该操作似乎立即发生(项目从列表中消失)。然后,用户单击“撰写”按钮,并开始输入新电子邮件。这时JavaScript代码发现AJAX请求失败。该脚本可能会显示错误消息,但目前确实没有意义。 或者,一个阻塞的例子; 用户选择一堆电子邮件。单击删除按钮。看到一个沙漏,但是操作失败。他们收到一条错误消息,说“错误。等等等等”。它们将返回到电子邮件列表,并且仍然具有要删除的电子邮件。他们可以尝试再次删除它们。 执行非阻塞AJAX请求还存在其他技术风险。用户可以关闭浏览器,可以导航到另一个网站,并且他们可以导航到当前网络中的另一个位置,这使得任何错误响应的上下文都变得毫无意义。 那么为什么它变得如此受欢迎? Facebook,Google,Microsoft等。等等。所有这些大型域越来越多地使用非阻塞AJAX请求来使操作看起来像是立即执行的。我还看到没有保存或提交按钮的表单编辑器有所增加。离开字段或按Enter键。该值已保存。没有您的个人资料已更新消息或保存步骤。 AJAX请求不是确定的,在完成之前不应被视为成功,但是许多主要的Web应用程序正像这样运行。 这些使用非阻塞性AJAX调用来模拟响应式应用程序的网站是否冒着快速出现的代价冒着不必要的风险? 为了保持竞争力,我们所有人都应该遵循这种设计模式吗?

7
当单词既是名词又是动词时,如何命名变量
我在以下一般指导下遇到了一个极端情况: 变量名词 功能动词 具体地讲,我有一个情况下字是不明确的-它可以是一个动词或名词。在某些情况下,当我们讨论应用程序时,将在同一句子中同时使用这两种方法。 我的目的是确保当我几个月后返回代码部分时,该程序将对将来的开发人员以及我自己仍然可读。 例子之一是带有battery。A battery有一个charge,您也可以装charge()电池。 我认为,同时具有Battery.Charge和Battery.Charge(value)将是混乱的未来发展。 我当前的解决方案是为其中一种或两种情况(变量和函数)简单地选择一个不同的词。我用这种方法的问题是,Battery对象的变量和函数charge与涉及的设计讨论不一致Battery。 我的问题是在命名约定中是否存在另一种/更好的方法来处理此冲突? 关于该主题的一些其他阅读。没有人真正解决我的问题。 有意义的简洁方法命名准则 变量的命名约定 从https://softwareengineering.stackexchange.com/questions/14169/what-naming-guidelines-do-you-follow选择的答案
48 naming  variables 

1
MIT许可证中的条件到底意味着什么?
引用许可证本身: 版权(C)[年份] [版权所有者] 特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发,再许可和/或出售本软件的副本,并允许具有本软件的个人遵循以下条件: 以上版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。 我不确定粗体部分的含义。 可以说我正在创建一些库,并根据MIT许可证对其进行了许可。有人决定分叉该库并创建一个封闭源代码的商业版本。根据许可证,他应该可以自由地这样做。 但是,根据这些条款,他还需要做什么?相信我是创作者吗?我想“版权声明上方”是指“版权(C)[...”部分,但是,那不是将我列为他的代码的作者吗(尽管我从技术上说出了代码)? 而且,在我许可自己的图书馆的条件相同的情况下,现在他的图书馆实际上对它的许可中不包括“许可通知” 吗? 或者,我是否对此解释不正确?这是否表示我有义务包括版权和许可通知?

8
我是否应该期望我的团队对我们的源代码控制系统有更多的基本能力?
大约三个月前,我的公司从Subversion切换到Git。切换之前,我们已经提前了数周的通知。由于我以前从未使用过Git(或任何其他DVCS),因此我读了Pro Git,花了一些时间来整理自己的存储库并玩耍,这样当我们切换时,我将能够以最小的痛苦继续工作。现在,我默认为“ Git guy”。 除了几个例外,我的大多数团队仍然不知道Git的工作方式。例如,他们仍然将分支视为源代码的完整副本,甚至将克隆仓库克隆到多个文件夹中(每个分支一个)。他们通常将Git视为一个可怕的黑匣子。 鉴于源代码管理在我们日常工作中的基本本质(更不用说Git赋予我们的可笑的力量了),我认为任何未达到一定熟练程度的开发人员都应该承担责任。 我是否应该期望我的团队至少对Git的内部工作以及如何在最基本的拉/合并/推操作之外使用它有所了解?还是我只是一无所有?

3
Node.js有何独特之处?[关闭]
最近,Node.js得到了很多好评。我不是一个经常接触网络应用程序的开发人员。从对Nodes.js的裸露理解中,它的优点是:我们只有一个线程可以处理多个连接,提供基于事件的体系结构。 但是,例如在Java中,我只能使用NIO / AIO创建一个线程(据我的理解,这是非阻塞API),并使用该线程处理多个连接,并且我提供了一个基于事件的体系结构来实现数据处理逻辑(通过提供一些回调等不那么困难)? 鉴于JVM是比V8更成熟的VM(我希望它也可以运行得更快),并且基于事件的处理体系结构似乎很难创建,我不确定Node.js为何吸引了如此多的关注。我错过了一些要点吗?

14
在代码审查中,积极反馈的重要性如何?
重要的是在代码审查期间指出代码的好部分以及它为什么好?积极的反馈对于正在审核的开发人员以及参与审核的其他人员可能同样有用。 我们正在使用在线工具进行评论,因此开发人员可以在给定的时间段(例如1周)内打开其已提交代码的评论,其他人可以评论其代码。其他人可以评论该代码或其他评论者的评论。 正反馈和负反馈之间是否应该保持平衡?


8
LSP vs OCP / Liskov换人VS开盘关闭
我试图理解OOP的SOLID原则,并且得出的结论是LSP和OCP有一些相似之处(如果不多说的话)。 开放/封闭原则指出“软件实体(类,模块,功能等)应为扩展而开放,但为修改而封闭”。 LSP在简单的话指出,任何情况下Foo可以用的任何实例来代替Bar它源自Foo并计划将工作同样非常的方式。 我不是专业的OOP程序员,但在我看来,只有在Bar派生自LSP Foo不会更改其中任何内容而只能扩展它的情况下,LSP才是可能的。这意味着特别是程序LSP仅在OCP为true时才为true,而OCP仅在LSP为true时才为true。那意味着他们是平等的。 如果我错了纠正我。我真的很想了解这些想法。非常感谢您的回答。

9
单元测试或测试驱动的开发值得吗?
我的工作团队正在迁移到Scrum,其他团队也开始使用单元测试和用户接受测试来进行测试驱动的开发。我喜欢UAT,但是对于测试驱动的开发或通常测试驱动的开发,我不出售单元测试。 看来编写测试是一项额外的工作,使人们在编写实际代码时显得cr不休,而且可能并不经常有效。 我了解单元测试如何工作以及如何编写它们,但是任何人都可以证明这确实是一个好主意,值得付出时间和精力吗? 另外,还有什么使TDD特别适合Scrum的?

4
为什么Python中的迭代器会引发异常?
这是Java中迭代器的语法(C#中的语法有点相似): Iterator it = sequence.iterator(); while (it.hasNext()) { System.out.println(it.next()); } 有道理。这是Python中的等效语法: it = iter(sequence) while True: try: value = it.next() except StopIteration: break print(value) 我认为例外应该只在特殊情况下使用。 为什么Python使用异常来停止迭代?

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.