软件工程

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


1
是否有关于注释源代码对软件质量,可维护性和开发人员生产力的影响的经验研究?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 6年前关闭。 我主张对源代码进行评论并记录软件产品。根据我的个人经验和观察,在必须开发软件或维护软件的过程中,对经过严格注释的源代码进行的工作以不同的方式帮助了我。 但是,还有一个阵营说评论最终毫无价值,或者其价值值得怀疑。许多不加评论的编码支持者认为: 如果一段代码写得很好,那是自我解释,因此不需要注释 如果一段代码不是不言自明的,则对其进行重构并使其变得不言自明,以便它不需要任何注释 您的测试套件就是您的实时文档 随着时间的流逝,代码和注释不同步,这成为令人头疼的另一个原因 敏捷表示工作代码比大量文档更重要,因此我们可以放心地忽略编写注释 对我来说,这只是教条。再次,我个人的观察是,由才华横溢,经验丰富的开发人员团队编写的软件最终最终会产生大量不言自明的代码。 同样,Java API,Cocoa API,Android API等表明,如果您要编写和维护高质量的文档,则可以实现。 综上所述,基于个人信念的有关文档优缺点的讨论以及对源代码的评论通常不会以良好的结局而无法得出令人满意的结论。 因此,我正在寻找有关软件文档(尤其是注释源代码)对其质量和可维护性及其对团队生产力的影响的影响的学术论文和实证研究。 您是否偶然发现了此类文章?如果有的话,结果如何?

6
迭代方法是否可以降低循环复杂度并提高可支持性?
诸如C#,JavaScript之类的现代语言中常见的迭代方法以及Java 8中(希望如此)的迭代方法是否可以减少循环复杂性对代码的易读性和可支持性的影响? 例如,在C#中,我们可能具有以下代码: List<String> filteredList = new List<String>(); foreach (String s in originalList){ if (matches(s)){ filteredList.add(s); } } 这具有2的简单圈数复杂度。 我们可以轻松地将其重写为: List<String> filteredList = originalList.where(s => matches(s)); 其简单的圈复杂度为0。 这实际上会导致更受支持的代码吗?是否有关于该主题的实际研究?

4
命令模式设计
我有Command模式的旧实现。这是通过所有DIOperation实现传递一个Context的方法,但是后来我意识到,在学习过程中(永远不会停止),这并不是最佳的。我也认为这里的“访问”并不适合,只会造成混乱。 我实际上是在考虑重构我的代码,这也是因为一个Command对其他命令一无所知,并且现在它们都共享相同的键值对。很难维护哪个类拥有哪个键值,有时会导致变量重复。 用例示例:假设CommandB需要由CommandA设置的UserName。CommandA是否应该设置键UserNameForCommandB = John?还是应该共享一个公共的UserName = John键值?如果用户名被第三个命令使用怎么办? 如何改善设计?谢谢! class DIParameters { public: /** * Parameter setter. */ virtual void setParameter(std::string key, std::string value) = 0; /** * Parameter getter. */ virtual std::string getParameter(std::string key) const = 0; virtual ~DIParameters() = 0; }; class DIOperation { public: /** * Visit before …

2
什么是“代码偏斜”?
在有关Scala的O'Reilly书中,我读到代码的复制粘贴会创建: ...造成代码膨胀,可维护性和偏斜的问题, 我在上下文中看不到“歪斜”一词的任何明显定义。我知道复制粘贴的问题,但是我无法使它们适合“歪斜”一词。因为这是O'Reilly的书中使用的,所以我猜想它是循环中真正的编程术语。 有指针吗?

5
我应该使用抽象方法还是虚拟方法?
如果我们假设不希望基类成为纯接口类,并使用下面的两个示例,那么使用抽象或虚拟方法类定义是更好的方法吗? “抽象”版本的优点是它看起来更简洁,并强制派生类提供希望的有意义的实现。 “虚拟”版本的优点是可以轻松地由其他模块插入并用于测试,而无需像抽象版本那样添加大量底层框架。 摘要版本: public abstract class AbstractVersion { public abstract ReturnType Method1(); public abstract ReturnType Method2(); . . public abstract ReturnType MethodN(); ////////////////////////////////////////////// // Other class implementation stuff is here ////////////////////////////////////////////// } 虚拟版本: public class VirtualVersion { public virtual ReturnType Method1() { return ReturnType.NotImplemented; } public virtual ReturnType Method2() …
11 c#  design 

3
神经网络能否提供比“是”或“否”更多的答案?
我读过的每个用于图像识别的示例神经网络都会产生一个简单的“是”或“否”答案。一个出口节点对应于“是,这是一张人脸”,一个出口节点对应于“否,这不是一张人脸”。 我了解这可能是为了简化说明,但我想知道如何对这样的神经网络进行编程以提供更具体的输出。例如,假设我正在对动物进行分类。与其说“动物”或“不是动物”,不如说是“狗”,“鱼”,“鸟”,“蛇”等响应,而最后一个退出节点是“不是动物/我”不认识这个”。 我敢肯定这是有可能的,但是我在理解如何做上有困难。似乎是由于错误的反向传播训练算法所致,当您训练一个出口节点(即“这是一条狗”)并且神经元的权重发生变化时,您先前训练的另一个出口节点的理想状态受过训练的人(即“这是一只鸟”)将开始偏离,反之亦然。因此,训练网络以识别一个类别将破坏对另一类别所做的任何训练,从而将我们限制为简单的“是”或“否”设计。 这会使这种识别器成为不可能吗?还是我误解了算法?我能想到的只有两件事: 我们可以为要分类的每个事物训练一个神经网络,然后以某种方式使用它们来构建更大的超级网络(例如,“狗”网络,“鸟”网络等)一起创建“动物”的超级网络);要么, 创建某种荒谬的,复杂的训练方法,这将需要极其先进的数学,并且将以某种方式为所有可能的输出(换句话说insert math magic here)产生理想的神经元权重状态。 (旁注1:我专门将多层感知器视为一种神经网络。) (注2:对于第一个项目符号“可能的解决方案”,具有每个特定的神经网络并对其进行迭代,直到我们收到“是”的响应是不够的。我知道可以很容易地做到这一点,但这很简单编程而不是机器学习。我想知道是否有可能使用一个神经网络将信息提供给并接收适当的响应。)

5
数据库连接-应该将它们作为参数传递吗?
我们有一个系统,通过该系统,可以使用通用方法获得一次数据库连接,并在整个要使用的相关类中传递数据库连接。有人怀疑将数据库连接作为参数传递给不同的类会导致问题,因此我在这里检查是否确实可行,并且还有更好的模式吗? 我知道有一些ORM工具可以实现持久性,但我们还不能介绍。 欢迎任何反馈,谢谢。

4
什么是“商业智能”开发人员?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 4年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 与传统的Web Developer角色相比,Business Intelligence Developer角色期望什么特征/技能?

2
如何解决循环包装的依赖性
我正在重构一个大型代码库,其中大多数类位于一个包中。为了获得更好的模块化,我为每种功能都创建了子包。 我记得在某处学习过包依赖关系图不应包含循环的信息,但我不知道如何解决以下问题:Figure在package中figure,Layout在package中layout,Layout需要该图执行布局,因此package layout依赖于package figure。但另一方面,a Figure可以Figure在其内部包含其他s,它们具有自己的Layout,这使得package figure依赖于package layout。 我有一些解决方案,例如创建一个实现并将其放入包中的Container接口。这是一个好的解决方案吗?还有其他可能性吗?FigureLayout 谢谢

4
如何说服我的同事相信做正确的事可以节省他们的时间
我最近刚在一家新公司工作,当时只有少数程序员。它是一家中等规模的公司,大约有70名员工,但IT部门只有9-10名,而我旁边还有3位“程序员”。但是,这些人的经验非常有限,确实在做很多事情。例如,我们的一个项目是PHP网站。大多数代码存储在20,000行的PHP控制器中,PHP中嵌入了约6000行的JavaScript。 我在这里和那里不断地提出一些小建议,但是没有人在听,每个人都说他们太忙了,无法执行我的建议。问题是,他们不应该那么忙,如果事情做对了也不会。他们将大部分时间都花在修理不断破裂的东西上。如果每个项目构建正确,我自己就能完成。 我应该采取什么方法说服这些人或经理,那就是事情需要改变,而改变事物可以节省很多时间?我是否应该跳过试图说服我的同事而直接去找经理的建议,关于如何在他们开始做正确的事情时该公司如何节省一大笔钱呢?

5
什么是衡量测试/测试人员效率的好方法?
我即将参加与管理层的讨论,以衡量我们作为质量保证组织的测试效率。这背后的主要原因是我们的团队有一半被外包出去了,我们的业务想提供一些关于我们效率/效率的指标,以便我们有基础数据可用来与承包商的服务协议进行合同参数谈判。 我已经提出了一些建议,并且我在该主题上发现的大多数意见都围绕着开发人员的效率:代码行,交付的故事点,引入的缺陷等。 但是测试人员呢?我们的测试主要是基于需求的,并且混合了手动,半自动和自动测试(不是因为我们还没有自动完成所有工作,而是因为某些事情在我们的测试系统中无法实现自动化)。

3
Linux文件名中的小写字母
当我发现UpperCase对于复杂的长名称中的首字母单词分隔确实可读时,我倾向于使用一些UpperCase来提供一些Linux文件名。通常是可执行文件,也有一些目录。 但是已经有几个星期我说过,Linux distrib中所有文件名的绝大多数都是小写的... 因此,我刚才进行了一次谷歌搜索,然后发现了这篇文章:Linux File Names,指出在Unix世界中应该始终使用小写字母, ...最好在Linux中始终使用小写字母,除非您有充分的理由使用大写字母或混合大小写。大多数Unix用户几乎都使用小写字母,但是除了这种“文化”观点之外,还有另一个充分理由使用小写字母。如果要与Linux共享或访问DOS文件系统,则DOS将无法查看具有大写或大小写混合的文件名的文件... 真的是这样吗?

1
在C中编程PID循环
我是一名电气工程师,对数字世界充满了兴趣,并且在我学习的过程中不断学习。我正在对TI处理器进行编程以执行PID(比例-积分-微分)循环,如下图所示: 我还将描述它: 负反馈运算放大器,非反相端子接地。通过负极端子输入。反馈回路是一个与电阻并联的RE串联电路,所有与电容并联的串联电路。 有人知道如何将此电路转换为C代码吗?我对此不满意,可以使用帮助。
11 c 


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.