软件工程

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

11
Robert C. Martin用SQL表示什么意思是什么?[关闭]
我一直在阅读/观看Robert C. Martin的很多内容。我碰到他说,由于固态硬盘,SQL是不必要的。当我搜索其他资源以进行备份时,我会收到大量随机文章,描述硬盘驱动器和固态驱动器之间的SQL性能差异(相关但与我要研究的内容无关)。 最终,我不明白他在试图达到什么目的。他是说用No-SQL技术取代SQL吗?他是说在文件系统中的文件中存储数据吗?还是他只是希望人们因为SQLi攻击而停止使用SQL /关系数据库?我担心我错过了他想表达的观点。 我将在此处提供一些链接,以便您可以直接从他的心中读懂: 鲍比表 清洁建筑讲座 首先,他指出应该从系统中完全删除SQL。 解决方案。唯一的解决方案。是从系统中完全消除SQL。如果没有SQL引擎,那么就不会有SQLi攻击。 并且尽管他谈论使用API​​替换SQL,但我不认为他的意思是将SQL放在API后面,因为前面的引用以及他在本文前面所说的。 框架无法解决问题; ... 旁注:在说SQL时,我很确定Robert意味着大多数关系数据库。也许不是全部,而是大多数。无论如何,大多数人还是使用SQL。所以... 如果不使用SQL来持久化数据,那么我们应该使用什么呢? 在回答之前,我还应该注意。罗伯特(Robert)强调,固态驱动器应该改变我们用来持久化数据的工具。SørenD.Ptæus的回答指出了这一点。 我还必须回应“但是数据完整性”组。经过进一步研究,罗伯特说我们应该使用像datomic这样的事务数据库。然后,CRUD变成CR(创建和读取),并且SQL事务完全消失。数据完整性当然很重要。 我找不到涵盖所有这些的问题。我想我正在寻找符合罗伯特指南的替代方案。Datomic是一个,但是是吗?还有哪些其他选项与这些准则匹配?它们在固态驱动器上是否更好地工作?

13
如何编辑一系列if-else if语句,使其遵循Bob叔叔的“清洁代码”原则?
我正在尝试遵循Bob叔叔的干净代码建议,尤其是要使方法简短。 我发现自己无法缩短此逻辑: if (checkCondition()) {addAlert(1);} else if (checkCondition2()) {addAlert(2);} else if (checkCondition3()) {addAlert(3);} else if (checkCondition4()) {addAlert(4);} 我无法删除其他元素,因此将整个事物分解为较小的部分,导致“其他条件”中的“其他”有助于性能-评估这些条件的成本很高,如果我可以避免评估以下条件,请导致第一个条件是的,我想避免它们。 即使从语义上来讲,从业务的角度来看,如果满足下一个条件,评估下一个条件也是没有意义的。 编辑:此问题被认为是处理if(if else)else的优雅方式的可能重复。 我相信这是一个不同的问题(通过比较这些问题的答案,您也可以看到它)。 我的问题是检查第一个接受条件是否很快结束。 链接的问题试图使所有条件都可以接受,以便做某事。(从该问题的最佳答案中可以看出:https : //softwareengineering.stackexchange.com/a/122625/96955)


5
在版本控制中从同一代码库维护两个单独的软件版本
假设我正在编写同一软件/程序/应用程序/脚本的两个不同版本,并将它们存储在版本控制下。第一个版本是免费的“基本”版本,而第二个版本是付费的“高级”版本,它采用了免费版本的代码库,并在其上扩展了一些额外的增值功能。任何新的补丁程序,修补程序或功能都需要找到进入两个版本的方式。 我目前正在考虑使用master和develop分支作为主要代码库(免费版本),以及使用边master-premium和develop-premium分支作为付费版本。对免费版本进行更改并合并到master分支(develop当然,在进行了彻底的测试之后),develop-premium通过cherry-pick命令将其复制到分支以进行更多测试,然后合并到中master-premium。 这是处理这种情况的最佳工作流程吗?有潜在的问题,警告或陷阱需要注意吗?是否有比我已经提出的更好的分支策略? 非常感谢您的反馈! PS:这用于存储在Git中的PHP脚本,但是答案应适用于任何语言或VCS。

13
游戏中的加密内容
我一直想使用加密来防止用户在程序本身之外弄清楚程序中的内容。就像用户可能会发现,在游戏数据中浏览时,从未在游戏中使用过的纹理将成为某种复活节彩蛋的一部分。如果在网上发布,这可能会破坏所有人的利益。 想象一下一个秘密房间,玩家必须在游戏室的安全门上按下正确的数字,如果正确,它将生成正确的解密密钥,然后解密该关卡的一部分并打开门。因此,由于实际上并没有存储密钥,因此即使在浏览游戏数据时也无法访问复活节彩蛋,它是根据用户输入生成的。 这是我想象中的另一个例子。我有一个益智游戏,假设有20个关卡,每个关卡都使用不同的密钥加密。我没有在程序中直接存储解密密钥,从而使某人可以反编译该程序并找到它,而是根据上一个难题的解决方案生成了加密/解密密钥。这样,即使在浏览游戏数据时,玩家也必须在获得有关下一关的任何信息之前实际找出难题。 考虑到谜题解决方案的数量可能少于解密密钥的数量,玩家如果知识渊博,就可以“轻松”进行暴力破解。这实际上是难题的复杂性,在这里不是很重要。虽然我确实在这里发布了有关它的答案 今天有没有做过这样的程序/游戏?在他们的游戏中存储加密内容?如果不是,为什么呢?在商店或国家/地区是否有很多法规和规章制度?有人看到我缺少的明显陷阱吗?忽略诸如用户体验之类的东西,这个主意在我看来似乎很合理,让我很好奇为什么以前从未见过。 编辑:可能不清楚我在说什么,所以这是一个更具体的示例。 假设我有一个函数,它接受20个字符的字符串并生成一个对称密钥,我可以使用该密钥对游戏中的某些内容进行加密/解密。用户获取该内容的唯一方法是知道这20个字符并生成相同的密钥。该密钥从不直接存储,而是根据用户输入即时生成的。这些角色将隐藏在游戏中,可能是书籍,与NPC的对话,甚至可能不在游戏盒背面。 因此,尝试使用2 * 10 ^ 28种可能的组合,人们更有可能会以预期的方式找到内容,而不是通过浏览游戏数据来找到内容。 编辑2:在将内容发送给消费者之前,将使用任意密钥对内容进行加密。此键显然不会随游戏一起提供。给定一系列基于钥匙的线索,他或她将不得不以某种方式将钥匙重新拼凑在一起,并且这些线索在整个游戏或其他地方都是隐藏的。但是,该系统对用户是透明的,因为除非您实际浏览游戏数据,否则您将不知道内容是加密的。 很多人提到,这样做的局限性在于它有一个明显的缺点。一旦一个人弄清楚了,他/她就可以与其他人共享它(如果不是密钥/解决方案,则可以是内容本身)。但是,如果您打算保密,以至于一个人无法解决问题,而人们必须共同解决它,或者您担心自己的复活节彩蛋被隐藏(设计使然),以至于无法解决它。更有可能有人会在代码中找到它,而不是通过玩游戏。然后我认为这可能很好。 我个人建议每场游戏只能使用一次,并且仅用于不影响核心游戏玩法的事物,例如复活节彩蛋,秘密结局。任何谜题都必须如此复杂或被很好地隐藏起来,以使人们放慢脚步,以使加密内容值得,如果这个谜题阻碍了人们的进步,那么没人可能会玩得开心。
45 encryption 

8
在过去的20年中,真的没有一件事可以带来巨大的软件开发收益吗?[关闭]
Fred Brooks 在《No Silver Bullet》中对软件工程的未来做出了各种预测,最好的总结是: 无论是技术还是管理技术,都没有一个单独的发展可以使生产率,可靠性和简单性提高甚至一个数量级。 他的论点很有说服力。布鲁克斯在1986年写作:他是对的吗?2014年的开发人员生产软件的速度是否比1986年的开发人员快10倍?通过某种适当的指标-生产力的提高实际上有多大?

5
建设者模式:什么时候失败?
在实施“构建器模式”时,我经常感到困惑于何时让构建失败,甚至每隔几天我就此采取不同的立场。 首先来一些解释: 随着早期的失败我的意思是建立一个对象应为无效参数传入,一旦失败,所以里面的SomeObjectBuilder。 有了失败的晚期我的意思是,只有建立一个对象可以在失败build()的是隐含调用对象的构造函数来建立呼叫。 然后是一些参数: 支持延迟失败:构建器类不应只不过是仅包含值的类。而且,它导致更少的代码重复。 支持尽早失败:软件编程中的一种通用方法是您希望尽早发现问题,因此,最合乎逻辑的检查位置是在构建器类的“构造器”,“设置器”中,最后是在build方法中。 关于此的普遍共识是什么?

3
视障程序员的编码样式
我是视障人士。戴眼镜时,我看得很清楚,可以开车,但是以我喜欢的字体大小,我一次只能看到15行,每行100个字符。这影响了我的编码风格。 我要做的一件事是编写较短的函数。我的代码倾向于获得良好的评价,因为这些带有好名的短函数使高层函数易读,但是在高性能情况下,有些人通过将变量向下传递几层来评论我在堆栈上占用了多少空间。处理。 我要做的第二件事是将文件之间的类划分为更短的文件。这减少了滚动到相关功能的距离,并且根据组织的不同,我可以将文件放在不同的监视器上以一起查看它们。 这两种做法都使得大多数编码样式都需要我编写文档的单元更具文档性,这通过扩展文件的长度以及相关函数之间的距离进一步加剧了该问题。 我目前正在使用Visual Studio,它允许在功能和注释块级别(我经常使用)折叠代码,但不能像Notepad ++那样在括号级别折叠。提供更好的代码折叠功能的编辑器并不具备VS的所有智能功能。我可以在VS中使用区域,但是如果每10行使用一次,则看起来很混乱。在我处理代码的其他功能时,折叠有时对使完整的代码看不见很有帮助。 谁能推荐更好的编码实践来帮助限制代码的可见性?


6
有必要遵循防御性编程实践以获取永远不会公开获得的代码?
我正在编写纸牌游戏的Java实现,因此我创建了一种特殊的Collection类型,称为“区域”。不支持Java的Collection的所有修改方法,但是Zone API中有一种方法,该方法move(Zone, Card)可将Card从给定的Zone移到其自身(由package-private技术实现)。这样,我可以确保没有任何卡被带出区域并消失。它们只能移到另一个区域。 我的问题是,这种防御性编码有必要吗?这是“正确的”,并且感觉像是正确的做法,但这并不意味着Zone API永远不会成为某些公共库的一部分。这只是给我的,所以这有点像是在保护我自己的代码,以免仅使用标准Collections可能会提高效率。 我应该把这个区域创意带到多远?谁能给我一些建议,让我考虑在我编写的类中保存合同,特别是对于那些不会真正公开可用的类,应该考虑些什么?

4
为什么这么多名称空间以com开头
我注意到许多公司都使用“反向域名”名称空间,我很好奇这种做法的起源以及为什么这种做法会持续下去。它是否仅由于死记硬背而继续存在,还是这里可能缺少我想念的出色的体系结构概念? 还请注意以下问题:https ://stackoverflow.com/questions/189209/do-you-really-use-your-reverse-domain-for-package-naming-in-java,可以回答我的问题,但不能回答100 % (如果让您感觉更好,我真的很好奇我是否应该将它用于我的javascript命名间隔工作,但是我对何时何地以及为什么这样更感到好奇,这应该可以帮助我指导javascript答案,而不是bene:“窗口”) 这种做法的示例扩展到文件夹和文件:

9
“语法”和“语法糖”有什么区别
背景 语法糖上的Wikipedia页面指出: 在计算机科学中,语法糖是编程语言中的语法,旨在使事物更易于阅读或表达。它使人类可以使用这种语言“变甜”:可以更清楚,更简洁地表达事物,或者以某些人可能喜欢的替代方式表达事物。 我不太了解语法糖和语法之间的区别。 我赞赏含糖版本可以更清晰,更简洁,甚至可以简化一些观点。但是我觉得在某种程度上,所有语法实际上都是这样做的,以形成对代码进行编译的抽象。 在同一Wikipedia页面上: 语言处理器(包括编译器,静态分析器等)通常在处理之前将加糖的结构扩展为更基本的结构,此过程有时称为“反加糖”。 作为思想练习,如果我在此语句中将“经常”表示为“始终”:如果区别仅在于编译器在进入下一阶段之前是否“降低语法”,那么不了解内部条件的编码器又将如何?的编译器知道(或关心)什么是Sugar'd语法? 该网站上一个非常相关的问题“语法糖的严格定义?” 有一个开始的答案: 恕我直言,我认为您无法对语法糖进行定义,因为该短语是BS,很可能被那些在“真实操作系统”上使用“真实工具”谈论“真实程序员”的人使用。 哪个可能向我表明,使用该语言的编码人员也许并没有太大的区别?也许差异仅是编译器编写者可以感知的?尽管在某些情况下使用该语言来了解语法糖背后的含义对编码人员有帮助。(但实际上,有关该主题的任何论述都倾向于使用“火焰诱饵”这个词?) 问题的核心 所以...问题的简短版本: 语法和语法糖之间有真正的区别吗? 对谁重要? 思考的额外食物 关于主题矛盾的奖励: 在Wikipedia页面上给出了一个示例: 例如,在C语言中,a[i]表示法是*(a + i) 而上述链接问题的另一个答案是关于同一示例的: 现在考虑a[i] == *(a + i)。考虑任何以任何实质性方式使用数组的C程序。 并总结为: 该[]符号有助于这种抽象。这不是语法糖。 同一示例的相反结论!

11
作为软件架构师,我应该专注于分析日志并修复其他人的错误吗?
自从我毕业(2005年末)以来,我在同一家公司工作,担任c ++软件工程师。一年前,我被提升为软件架构师,但是我发现自己越来越多地参与资格和修复错误以及2级支持。 我有50%的时间花在Notepad ++上,用于分析软件日志并试图找出问题所在。30%的人修复了其他人的错误,其余的(如果有的话)审查了开发人员的意粉代码。 我开始讨厌该产品,并开始考虑退出该公司的战略。 在这种情况下,您认为我能做什么?您还有其他软件架构师还在修复代码中的错误吗?

8
在getter和setter里面应该允许什么?
我进入了有关getter和setter方法以及封装的有趣的Internet争论。有人说,他们应该做的只是分配(设置器)或变量访问(获取器),以使它们“纯净”并确保封装。 我是对的,这会完全破坏首先使用getter和setter的目的,应该允许进行验证和其他逻辑(当然没有奇怪的副作用)吗? 何时应进行验证? 设置值时,在设置器内部(以防止对象进入无效状态-我认为) 在设置值之前,在设置器之外 在对象内部,每次使用该值之前 是否允许设置器更改值(也许将有效值转换为某些规范的内部表示形式)?

7
软件测试方法是否依赖有缺陷的数据?
在软件工程中众所周知的一个事实是,修复漏洞的成本在发现漏洞的开发后期呈指数增长。这由Code Complete中发布的数据支持,并已在许多其他出版物中进行了修改。 但是,事实证明该数据从未存在过。Code Complete引用的数据显然没有显示出这样的成本/开发时间相关性,而相似的已发布表格仅在某些特殊情况下显示了相关性,而在其他特殊情况下则显示了平坦的曲线(即成本没有增加)。 是否有任何独立数据可以证实或反驳? 并且如果为真(即,如果根本没有数据可以为后来发现的错误提供成倍的成倍的成本支持),那么这对软件开发方法有何影响?

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.