软件工程

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

19
当其他人构建了一个过于复杂的解决方案时,您在代码审查中怎么说?[关闭]
前几天,我审查了团队中某人写的代码。该解决方案不能完全发挥功能,而且设计过于复杂-意味着存储了不必要的信息,构建了不必要的功能,并且基本上,该代码具有很多不必要的复杂性,例如镀金,并且它试图解决不存在的问题。 在这种情况下,我问“为什么要这样做?” 答案是另一个人喜欢那样做。 然后,我问这些功能中的任何一项是否属于项目规范,或者它们是否对最终用户有用,或者是否有任何额外的数据会呈现给最终用户。 答案是不。 因此,我建议他删除所有不必要的复杂性。我通常得到的答案是“已经完成了”。 我的观点是,它没有完成,有错误,没有满足用户的要求,并且维护成本会比我建议的简单方法高。 一个等效的场景是: 同事花费了8个小时的手工重构代码,而这本可以在10秒内在Resharper中自动完成。自然,我不信任手工重构,因为它质量可疑且未经充分测试。 同样,我得到的答复是“已经完成了”。 对这种态度有什么适当的回应?

8
担心发布一个业余项目-如何克服?[关闭]
我不知道这个问题是否与软件开发完全相关,但我还是尝试一下: 像很多程序员一样,我喜欢从事业余项目。有时候,看似好的主意结果并不是那么好,所以我放弃了这个项目。但是有时候,项目会产生一些有用的东西。所以,我可以将其发布,然后发布给全世界,对吗? 错误。不知何故,我似乎无法执行此步骤。我担心我的代码不够好,我总会想到次优的事物和可以添加的功能。因此,我什么也不释放,我失去了兴趣,并一度放弃了该项目。 这正常吗?您如何克服这种情况?

8
使用方法链接时,我是否重用对象或创建对象?
使用方法链接时: var car = new Car().OfBrand(Brand.Ford).OfModel(12345).PaintedIn(Color.Silver).Create(); 可能有两种方法: 重用同一对象,如下所示: public Car PaintedIn(Color color) { this.Color = color; return this; } Car在每个步骤中创建一个新的类型的对象,如下所示: public Car PaintedIn(Color color) { var car = new Car(this); // Clone the current object. car.Color = color; // Assign the values to the clone, not the original object. return …

11
MVC中的“ C”真的必要吗?
我了解模型和视图在“模型-视图-控制器”模式中的作用,但是我很难理解为什么需要控制器。 假设我们正在使用MVC方法创建国际象棋程序;游戏状态应该是模型,GUI应该是视图。在这种情况下,控制器究竟是什么? 它是否只是一个单独的类,具有在您单击图块时将要调用的所有功能?为什么不只在视图本身中对模型执行所有逻辑?


2
Git和Mercurial受欢迎程度的经验证据
是2012年!Mercurial和Git仍然很强大。 我了解两者的权衡。我也了解每个人都偏爱其中一种。没关系。 我正在寻找有关两者使用水平的一些信息。例如,在stackoverflow.com上,搜索Git可获得12000次点击,Mercurial可获得3000 次点击。Google趋势表示,Git为1.9:1.0。 还有哪些其他经验信息可用来估计这两种工具的相对使用情况?
37 git  mercurial 

11
进行TDD的人们在进行大型重构时如何处理工作流失
一段时间以来,我一直在尝试学习为我的代码编写单元测试。 最初,我开始做真正的TDD,在这里我不会写任何代码,除非先编写一个失败的测试。 但是,最近我要解决一个棘手的问题,其中涉及很多代码。在花了几周时间编写测试然后编写代码之后,我得出了一个不幸的结论,即我的整个方法都行不通,我不得不花两周的时间重新开始。 刚编写代码时,这是一个非常糟糕的决定,但是当您还编写了数百个单元测试时,将其全部扔掉在情感上变得更加困难。 我不禁会认为我浪费了3到4天的时间来编写这些测试,因为我本可以将代码放在一起进行概念验证,然后在对方法满意后再编写测试。 练习TDD的人如何正确处理此类情况?在某些情况下是否存在违反规则的情况,或者即使该代码可能看起来毫无用处,您还是总是总是首先刻意编写测试吗?
37 tdd  refactoring 

16
学习许多编程语言是否有害?
我从9年级开始用BASIC进行编程。通过编写简单的程序进行加,减和打印,我学到了一些BASIC。然后,我去了大学,并学习了计算机信息和系统工程。在第一年,我学习了C语言,并且对它有很好的命令。 接下来,我在第二年学习了C ++。它只是教会了我一些面向对象的知识。现在我正在做PHP(以及HTML)。我还没有掌握C ++,BASIC或PHP。我现在正计划转向移动开发。但是我觉得我并没有涵盖所学语言的所有内容。 真的有关系吗?
37 php  c++  c  basic 

6
“映射程序”是有效的设计模式还是“工厂”模式的变体?
我看到的一个常见模式就是所谓的Mapper模式(不要与之DataMapper完全混淆),它以某种“原始”数据源(例如ADO.NET DataReader或DataSet)作为参数,并将字段映射到业务/域对象上的属性。例: class PersonMapper { public Person Map(DataSet ds) { Person p = new Person(); p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString(); // other properties... return p; } } 这个想法是您的Gateway / DAO / Repository / etc。将在Mapper返回之前调用它,因此您将获得一个丰富的业务对象与基础数据容器。 但是,这似乎与工厂模式有关(即使不完全相同),工厂模式会构造并返回域对象。维基百科说这是:DDD工厂: 工厂:用于创建域对象的方法应委托给专门的工厂对象,以便可以轻松地互换替代实现。 从该引用中,我唯一想到的区别是可以对DDD样式的工厂进行参数化,以便在需要将“映射器”键入特定类的情况下,如果需要的话可以返回一种特殊类型的对象(例如BusinessCustomer与ResidentialCustomer)。并且只翻译。 那么这两种模式之间是否存在差异,或者它们本质上是相同的东西却具有不同的名称?

8
在Java中使用`this`关键字可以接受的样式是什么?
我来自Python或Javascript之类的语言(以及其他一些不太面向对象的语言),并且我试图提高我的Java工作知识,而我只是以肤浅的方式知道这些知识。 总是this在当前实例属性之前添加前缀是否被认为是不好的做法?我觉得写起来更自然 ... private String foo; public void printFoo() { System.out.println(this.foo); } ... 比 ... private String foo; public void printFoo() { System.out.println(foo); } ... 因为它可以帮助我区分实例属性和局部变量。 当然,在像Javascript这样的语言中,始终使用会更有意义this,因为可以嵌套更多的函数,因此局部变量来自更大的作用域。据我了解,在Java中,这样的嵌套是不可能的(内部类除外),因此可能不是什么大问题。 无论如何,我都倾向于使用this。会觉得很奇怪而不是习惯吗?

7
如何解释很难估计更大的软件项目所需的时间?
我是一名初级开发人员,发现很难估算完成一个较大的软件项目需要多少时间。我知道一般如何构造体系结构,但是我很难知道我必须做哪些细节以及必须解决什么问题。因此,很难估计完成一个较大的项目将花费多少时间,因为我不知道我需要解决什么问题以及解决它们需要多长时间。 我如何向非软件开发人员解释?

9
您的孩子在TDD中的表现如何?
今天,我们正在培训TDD,发现了以下误解。 该任务是针对输入的“ 1,2”返回数字总和为3的。我用C#编写的是: numbers = input.Split(','); return int.Parse(numbers[0]) + int.Parse(numbers[1]); //task said we have two numbers and input is correct 但是其他人更喜欢用其他方式。首先,对于输入“ 1,2”,他们添加了以下代码: if (input == "1,2") return 3; 然后,他们为输入“ 4,5”引入了另一个测试,并更改了实现: if (input == "1,2") return 3; else if (input == "4,5") return 9; 之后,他们说“好的,现在我们可以看到模式了”,并执行了我最初所做的工作。 我认为第二种方法更适合TDD定义,但是...我们应该对此严格吗?对我来说,如果我确定我不会跳过任何步骤,则可以跳过琐碎的婴儿步骤并将其合并为“ twinsteps”。我错了吗? 更新。我没有弄清楚这不是第一个测试,所以犯了一个错误。已经有一些测试,所以“返回3”实际上并不是满足要求的最简单的代码。
37 testing  tdd 

17
如果您睡眠不足,可以实际产生高质量的代码吗?[关闭]
我听说过程序员编码两天不睡觉,喝咖啡和红牛。此外,在《社交网络》等电影中,他们还展示了马克·扎克伯格已经进行了36个小时的编程。我还在某处阅读过,在诸如Facebook,Google,foursquare等公司中,他们可以在24小时以上不睡觉的情况下进行编码。 这是真的吗?如果您被剥夺了睡眠,可以实际产生高质量的代码吗? 红牛之类的东西可以弥补睡眠吗?

11
抽象类/方法过时了吗?
我曾经创建许多抽象类/方法。然后我开始使用接口。 现在,我不确定接口是否不会使抽象类过时。 您需要一个完全抽象的类吗?创建一个接口。您需要一个带有一些实现的抽象类吗?创建一个接口,创建一个类。继承该类,实现接口。另一个好处是某些类可能不需要父类,而只实现接口。 那么,抽象类/方法是否过时了?

12
资深程序员使用了最差的编程实践
我知道说起来似乎很奇怪,但是工作中的一名程序员故意使用了一些不良的编程实践!我会解释。首先,我要说他是一个有才华的人,大部分时间他都会编写可理解的代码。 他被要求在以Java编写的Web应用程序项目上实施许可。由于它是Java,因此如果真的愿意,人们可能会黑客打开罐子并读取其中编写的类和方法的名称。他对这个问题的解决方案是,从字面上说来笨拙地调用不太明显的名称和变量,并将它们植入已经拥挤的类中,而不是生成新类。 他的理由是,如果黑客想要切换某些类以绕过许可检查(并因此获得产品的免费副本),那么如果不清楚哪种方法,他将花费更多的时间。执行这些特定任务。只有在他完成之后,我才与他面对面,这表明我们也许可以购买某种混淆器库来为我们做,同时保持良好的编程习惯。他声称没有时间或资源来寻找这种解决方案。 ..这让我陷入了困境。我是否正在寻找Java中的混淆器库并修复他的旧代码(对于重塑他的代码可能有些麻烦),还是我将其保留下来,以至于让我感到无休止?

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.