软件工程

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


9
while(true)和循环中断-反模式?
考虑以下代码: public void doSomething(int input) { while(true) { TransformInSomeWay(input); if(ProcessingComplete(input)) break; DoSomethingElseTo(input); } } 假设此过程涉及有限但与输入有关的步骤数;循环的目的是由于算法而自行终止,而不是设计为无限期地运行(直到被外部事件取消为止)。因为检查循环是否应该结束的测试是在逻辑步骤的中间,所以while循环本身目前不检查任何有意义的事情;而是在概念算法的“适当”位置执行检查。 有人告诉我这是错误的代码,因为由于循环结构未检查结束条件,所以它更容易出错。弄清楚如何退出循环会更加困难,并且由于将来的更改可能会意外地忽略或破坏中断条件,因此可能会引发错误。 现在,代码的结构如下: public void doSomething(int input) { TransformInSomeWay(input); while(!ProcessingComplete(input)) { DoSomethingElseTo(input); TransformInSomeWay(input); } } 但是,这会重复调用代码中的方法,这违反了DRY。如果TransformInSomeWay后来被其他方法替换,则必须找到并更改这两个调用(在更复杂的代码中可能不那么明显地存在两个调用)。 您也可以这样写: public void doSomething(int input) { var complete = false; while(!complete) { TransformInSomeWay(input); complete = ProcessingComplete(input); if(!complete) { DoSomethingElseTo(input); } …

8
正在通过Qt框架真正学习C ++来学习C ++ [关闭]
我的问题是,我阅读的大多数C ++书籍都几乎永远花在语法和语言基础上,例如for循环while,数组,列表,指针等。 但是他们似乎从来没有建立过足够简单的东西用于学习,却又足够实际的东西来使您理解语言的哲学和力量。 然后我偶然发现了QT,这是一个了不起的库! 但是通过他们的演示进行工作,似乎我现在正处于相反的困境。我感觉像是有钱人的儿子在父亲补贴的跑车中开着车。就像我可以构建出色的软件一样,却不知道幕后到底发生了什么。 作为我的两难选择的一个例子,是构建一个简单的Web浏览器。在纯C ++中,我什至不知道从哪里开始,但是使用Qt库,可以在几行代码中完成。 我没有为此抱怨。我只是想知道如何填补语言的基本结构和Qt框架提供的高级接口之间的知识空白?

11
typedefs和#defines
我们每个人肯定都使用了typedefs和#defines。今天,在与他们一起工作时,我开始思考一件事。 请考虑以下两种情况,以使用int其他名称的数据类型: typedef int MYINTEGER 和 #define MYINTEGER int 与上述情况类似,在很多情况下,我们可以使用#define很好地完成某件事,并且也可以使用typedef进行相同的操作,尽管我们进行相同操作的方式可能完全不同。#define还可以执行typedef不能执行的MACRO操作。 尽管使用它们的基本原因是不同的,但是它们的工作有何不同?当两者都可以使用时,什么时候应该优先使用另一种呢?另外,在某些情况下,是否可以保证一个比另一个更快?(例如,#define是预处理程序指令,因此所有操作都比编译或运行时更早完成)。


5
如何存储开放源代码桌面Twitter客户端的OAuth v1使用者密钥和机密,而不向用户透露?
我想制作一个胖客户端,桌面,开源Twitter客户端。我碰巧正在使用.NET作为我的语言,并使用Twitterizer作为我的OAuth / Twitter包装,并且我的应用程序很可能会以开源形式发布。 要获得OAuth令牌,需要四项信息: 访问令牌(Twitter用户名) 访问机密(Twitter密码) 消费者密钥 消费者的秘密 后两个信息不应该共享,例如PGP私钥。但是,由于OAuth授权流程的设计方式,这些必须位于本机应用程序上。即使该应用程序不是开源的,并且用户密钥/秘密已加密,一个熟练的用户也可以访问用户密钥/秘密对。 所以我的问题是,如何解决这个问题?桌面Twitter客户端保护其用户密钥和机密的正确策略是什么?


5
现代软件产品中还剩下多少原始代码?[关闭]
你们当中许多人都在为大型公司提供知名软件。我想知道,现代大型应用程序(例如Firefox,Photoshop,Windows,Linux等)中还剩下多少原始代码(基本上是“ v1.0”版本的代码)?我真的更喜欢第一手经验和真实的战争故事。 感谢您满足我的好奇心。 编辑 原来有一定程度的误解。我所追求的基本上是以下内容:责备 / 注释源代码时,自最初的1.0版本以来,是否有任何部分甚至整个文件没有被修改过。

4
“控制反转”是否会促进“贫血领域模型”?
当我在上一个项目中使用IoC容器时,最终得到了贫乏的实体以及我在Stateless Services中的大部分业务逻辑。 我见过其他开发人员编写的利用“控制反转”的项目,并且它们始终是“贫血”。 由于“贫血域模型”是反模式,是否可以使用IoC和富域?他们有没有很好的例子,这样做的开源项目?


11
设计良好/高质量的开源软件
我正在参加软件设计课程,我应该从软件设计的角度选择一个开源软件进行分析。 它必须是一个大项目:不少于100,000行代码。 我真的很想选择一种设计和架构都很好的软件,以便对好的软件设计有深刻的见解。 所谓好的设计,是指诸如有意义的类和体系结构,(设计)模式的良好使用,抽象的良好使用,组件的良好组织,组件之间的高内聚和低耦合等。 您有什么软件可以建议我吗? 请注意,软件只需要具有良好的设计,而无需将设计记录在案!:) 它不一定是最终用户的应用程序...也可以是库,工具等...

15
如何在不感到极端焦虑的情况下自动化生产部署?
在我们的工厂中,我们使用SVN进行源代码控制,使用Cruise Cruise进行CI处理处理针对我们的开发,测试和集成环境的自动构建和部署。 所有这些都可以顺利进行,但是由于硬件和资源的限制,我们的集成环境不是像生产环境那样的2服务器负载平衡环境。尽管其他所有条件都相同,但这将是我们的集成和生产环境之间的唯一区别(尽管很大!) 从理论上讲,区别是我们的应用程序服务器的配置稍有不同,并且部署脚本仅需将构建工件放到两台服务器中,而不是仅仅放到两台服务器中,但是为什么我如此紧张地自动化我们的生产部署? 我通常不是控制狂,但是我总是感到需要手动将生产部署到生产中。我从同事那里听说,这通常是Really BAD Thing™,但他们没有提出反对的理由。 我知道,当我手动执行操作时,可以看到我正在物理上复制正确的文件,正在物理上关闭应用程序服务器并确保它们成功关闭,我正在物理上启动服务器,然后进行物理检查以创建日志确保启动正常并且部署成功。它使我安心。 对于自动脚本化生产部署,反对此OR参数的参数是什么?

7
如何获得没有经验的工作?[关闭]
我即将成为一名新的大学毕业生,并且我正试图获得一名实习生或一名jr软件工程师职位。但是,我完全没有该领域的经验。 我所拥有的只是我的学位和已经完成的课堂项目。我该如何使自己的简历更具吸引力,以便进行面试?另外,我应该如何构造课堂项目的详细信息?我应该提供详尽的细节吗?
32 skills 

18
开发人员应该反对不必要或有害的功能吗?
在讨论新功能(即非关键/可疑功能)时,开发人员的良好态度是什么? 假设您正在开发某种类似Java的语言,老板说:“我们需要指针,以便开发人员可以直接摆弄对象内存!” 开发人员应该否定这个想法,因为它增加了难以想象的复杂性和安全漏洞,还是应该执行所要求的操作? 这可能不是一个很好的例子,但是在灰色区域显示的内容又如何呢?例如添加破坏工作流程的按钮,或违反程序的内部结构等? 对于普通程序员而言,最佳的“可以做”与“不能做”分配是什么? 编辑:问题不是关于一个坏老板:D 我更感兴趣的是人们如何处理新问题,这些新问题增加了很多数量的问题,而同时又可能微不足道。 一般态度应该是: 是的,我们会做,解决复杂性 也许 不,一般的返工和含义不能证明变更的合理性 一个好的开发者应该怎么做?
32 design 

12
公司为什么要告诉我他们希望我作为内部雇员而不是承包商?[关闭]
语境 我正在我的专业领域中寻找承包商的工作,并且希望以短期承包商的身份赚取更少的钱和更少的利益。 问题: 公司表示,出于知识产权方面的考虑,我需要成为内部员工。 问题: 让他们签下一份说我所有工作都归他们所有的合同,对他们来说难吗? 如果我是承包商,当我的价值下降并节省很多钱时,他们可以放开我。 我在这里想念什么?

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.