软件工程

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

14
类型测试什么时候可以?
假设一种语言具有某种固有的类型安全性(例如,不是JavaScript): 给定一个接受a的方法SuperType,我们知道在大多数情况下,我们可能会倾向于执行类型测试以选择一个动作: public void DoSomethingTo(SuperType o) { if (o isa SubTypeA) { o.doSomethingA() } else { o.doSomethingB(); } } 通常,如果不是总是的话,我们应该在上创建一个可覆盖的方法SuperType并执行以下操作: public void DoSomethingTo(SuperType o) { o.doSomething(); } ...,其中每个子类型都有自己的doSomething()实现。然后,我们应用程序的其余部分可以适当地忽略给定的SuperType是a SubTypeA还是a SubTypeB。 精彩。 但是,我们仍然可以is a使用大多数(即使不是全部)类型安全语言进行类似操作。这表明可能需要显式类型测试。 那么,在什么情况下(如果有的话)我们应该还是必须执行显式类型测试? 原谅我心不在or或缺乏创造力。我知道我以前做过;但是,老实说,很久以前,我不记得自己做的是否好!在最近的记忆中,我认为我没有遇到过需要测试我的牛仔JavaScript之外的类型的需求。

5
具有Maybe类型而不是null的语言如何处理边缘条件?
埃里克·利珀特(Eric Lippert)在讨论为什么C#使用a null而不是Maybe<T>类型时提出了一个非常有趣的观点: 类型系统的一致性很重要;我们是否总能知道在任何情况下都不能将非空引用视为无效?在引用类型为非空字段的对象的构造函数中该怎么办?在这样的对象的终结器中,该对象被终结是因为应该填充引用的代码引发了异常,该怎么办?对于您而言,保证其安全性的类型系统很危险。 这有点大开眼界。这些概念引起了我的兴趣,并且我在编译器和类型系统上做了一些尝试,但我从未考虑过这种情况。具有Maybe类型而不是null的语言如何处理诸如初始化和错误恢复之类的极端情况,在这种情况下,据称保证的非null引用实际上并不处于有效状态?

16
高级程序员关于始终使用书籍的建议是一个好主意吗?[关闭]
我是初级开发人员,仅从事该行业5年。在我目前的公司中,有一位资深人士称他为Infestus。有时,我有机会从头开始发光并做一些全新的事情。 最近的一个例子是我必须在多线程应用程序中创建一个单例。我决定使用这种方法。当Infestus看到它后,他很快就称我为愚蠢的人,并告诉我使用这种方法。在问他为什么他只是为了更好而放弃时,这就是这种情况,这本关于Java的书说它更好。 这是一种常见的模式:每当我有机会做新的事情时,我都会很快被Infestus击落,而他的方法更好的唯一原因就是这些书是由著名的程序员编写的。他总是试图给我读书,以便我可以“学习”编程的方式。 我仅仅花了5年的时间来编写程序,但是只是盲目地遵循有关解决问题的最佳方法的书总是一个好主意,还是我应该不时尝试进行尝试?来自Infestus的抱怨声不断,开始使我从不尝试任何新事物并遵循书中的示例。 编辑:我完全迷路了。是的,我知道盲目跟随任何东西都是一个坏主意。但是这位看起来像上帝的程序员Infestus似乎了解很多,他告诉我,正确编程的唯一方法是看书,然后将所有内容都记到T。他强加的所有规则都是书中所写的,所以我只是想知道如果书是唯一正确的方法。 编辑2:Infestus不是我的老板。他只是负责审查代码的高级开发人员之一。而且,他在评论后的大部分评论都是由书名组成的,这种方法是错误的。

9
为什么不公开主键
在我的教育中,我被告知将真实的主键(不仅是DB密钥,而且是所有主访问器)公开给用户,这是一个错误的想法。 我一直认为这是一个安全问题(因为攻击者可能会尝试读取自己的东西,而不是自己的东西)。 现在,我必须检查是否无论如何都允许用户访问,所以背后有其他原因吗? 另外,由于我的用户无论如何都必须访问数据,因此我需要在两者之间的某个外部世界拥有一个公共密钥。现在,公用密钥与主密钥存在相同的问题,不是吗? 人们一直要求有一个示例说明为什么仍然要这样做,所以这里是一个。请记住,这个问题不仅涉及原理本身,而且要在本示例中应用。明确欢迎解决其他情况的答案。 处理活动的应用程序(Web,移动设备)具有多个UI和至少一个用于系统间通信的自动API(例如,会计部门希望根据已完成的操作向客户收取多少费用)。该应用程序有多个客户,因此必须将其数据分开(从逻辑上讲,数据存储在同一数据库中)。无论如何,都会检查每个请求的有效性。 活动是非常精细的,因此它在某个容器对象中在一起,可以称之为“任务”。 三个用例: 用户A希望将用户B发送给某个任务,因此他向他发送了一个链接(HTTP)以在其中完成一些活动。 用户B必须走出建筑物,以便他在移动设备上打开任务。 会计部门希望向客户收取该任务的费用,但使用第三方会计系统,该系统通过引用REST-API的某些代码自动加载任务/活动 每个用例都要求(或变得更加容易)代理为任务和活动提供一些可寻址的标识符。

11
团队内部编写所有内容有多普遍?[关闭]
在最近的一次采访中,我问采访者“您如何评估新技术和库(例如SignalR)并将其投入使用?”。他们说他们没有,相反,他们自己写了所有东西,所以他们不必依靠任何其他人。 该公司不为政府或国防承包商工作,也不从事任何对安全至关重要的项目。他们只是您的一般中型软件开发公司。 我的问题是:团队自己编写所有内容有多普遍?我应该为此感到担忧吗? 编辑-大多数回答都说这是值得关注的事情。是否可以进行第二次面试,让他们澄清/重复自己在家里编写所有内容的立场?

9
代码一致性和代码改进之间的正确平衡是什么?
最近,我与一位同事讨论了代码风格。他在争辩说,您对API的使用以及所使用的一般模式应与周围的代码尽可能地相似,如果与整个代码库无关,则应与代码外观(括号位置,大写字母等)相同。 。例如,如果我要在C#中将方法添加到DAO类中,那么即使该类中的其他任何方法都没有使用LINQ,我也会尝试在适当的地方使用LINQ来帮助使我的代码干净并易于维护。但是,我的同事会争辩说我不应该在这种情况下使用它,因为它会违背该类的现有风格,因此更难以理解。 起初我发现他的立场相当极端,但是经过一会儿的思考,我开始明白他的观点。在假设的LINQ示例中,也许该类不包含它,因为我的同事们不熟悉LINQ?如果是这样的话,如果我不使用我的代码,对我的开发人员来说,它的代码维护起来会更好吗?另一方面,如果我真的相信使用这种技术可以使代码更简洁,那么即使它与周围的代码有很大的不同,我也不应该使用它吗? 我认为,我同事观点的症结在于,如果我们都打算以不同的方式在代码库中实现相似的功能,而我们每个人都认为我们的方式是“最佳”的,那么最终整个代码将变得更加困难了解。但是此刻,我仍然认为,如果我们盲目地遵循现有代码,那么质量将随着时间的流逝而缓慢恶化。 那么,模式在何种程度上成为代码风格的一部分,我们应该在保持一致性和进行改进之间划清界限吗?

9
类的方法应该调用自己的getter和setter吗?
在我工作的地方,我看到很多班级都做了这样的事情: public class ClassThatCallsItsOwnGettersAndSetters { private String field; public String getField() { return field; } public void setField(String field) { this.field = field; } public void methodWithLogic() { setField("value"); //do stuff String localField = getField(); //do stuff with "localField" } } 如果我是从头开始写的,那我应该写成methodWithLogic()这样的: public class ClassThatUsesItsOwnFields { private String field; public …

4
TDD-由内而外由内而外
使用TDD 构建应用程序Inside In与使用Inside Out构建应用程序有什么区别? 这些是我阅读的有关TDD和单元测试的书: 测试驱动开发:示例 测试驱动开发:实用指南:实用指南在Microsoft中开发 高质量PHP框架和应用程序的实际解决方案 。 NET xUnit测试模式:重构测试代码 单元测试的技巧:以.Net为例 ,以测试为指导的不断增长的面向对象软件中的示例 --->因为JAVA不是我的主要语言,所以这真的很难理解:) 通常,几乎所有的人都解释了TDD的基础知识和单元测试,但是很少提及构建应用程序的不同方式。 我注意到的另一件事是,这些书中的大多数(如果不是全部)在编写应用程序时都会忽略设计阶段。他们更多地专注于快速编写测试用例并让设计自行出现。 但是,我遇到了xUnit测试模式中的一段,该段讨论了人们处理TDD的方式。有2所学校在外面,在内部与内部。 遗憾的是,这本书没有对此进行详细说明。我想知道这两个案例的主要区别是什么。 什么时候应该使用它们中的每一个? 对于TDD初学者来说,哪个更容易掌握? 每种方法的缺点是什么? 有没有专门讨论该主题的材料?

12
如何退后一步,以崭新的眼光看代码?[关闭]
去年,我以一个人的团队工作,开发了一个富客户端应用程序(价值35,000多个LoC)。目前处于稳定状态并已投入生产。但是,我知道我的技能在项目开始之初就生锈了,因此毫无疑问,代码中存在重大问题。在这一点上,大多数问题都在架构,结构和交互方面-容易的问题,甚至是架构/设计问题,已经被淘汰。 不幸的是,我在这个项目上花费了很多时间,以至于我难以思考它之外的问题-从一个新的角度来处理它,以查看深层掩盖或固有于设计中的缺陷。 我该如何超越自己的头脑和代码范围,以使外观焕然一新并变得更好?

7
我们进行版本控制的方式有问题吗?
我和一个程序员团队一起担任业务分析师。我们刚刚发布了该产品的2.0版,并且正在开发3个月内发布的下一个版本(这是内部软件产品)。不幸的是,版本2.0存在一些必须修复的问题,我们将在几周内部署这些修复程序。问题在于,我们也不想部署仍在进行中且计划在未来3个月内不发布的更改。 程序员认为管理此问题的方法是仅检入缺陷代码,而新增强功能的代码将保留在开发人员的本地计算机上,直到完成。我将不得不从他们的机器上获取本地版本进行测试,因为如果他们签入代码,并且我们必须推出另一个补丁来修复缺陷,我们现在还不希望包括这些增强功能。还有一个问题,即同一代码文件同时包含缺陷修复程序和增强功能,因此他们必须在本地复制该代码文件,然后进行更改以修复错误并检查其中的一个错误,然后通过采用以下方法继续进行增强功能:他们制作的本地副本。 似乎很令人费解-是否有更好的方法来处理这种情况?我们正在使用Team Foundation Server和Visual Studio 2010。

6
谁创造了第一个循环结构的想法?
while (1) { if (1+1==2) { print "Yes, you paid attention in Preschool!"; } else { print "Wait... I thought 1+1=2"; } } 作为开发人员,我们所有人都必须非常频繁地使用循环。我们知道。我想知道的是,谁想到这个主意是循环的?循环引入什么语言?什么是第一个循环结构?是while循环吗?一个for循环?等等?
53 history  loops 

1
参与Github(如何找到项目)[关闭]
我想为Github上的开源项目做贡献。通常,我只想开始修复一些小错误或添加功能。我没有特定的项目。我想从事C,C ++,Python,.NET,Java等项目。但是,我的问题是我不知道如何在Github上找到任何东西。 我确实在Explore Github上找到了一个页面,其中列出了C项目。基本上,它列出了前5个“受监视的” C项目。好的,那很好,但是我想看到不止5个。 Sourceforge很棒,因为您可以使用编程语言浏览项目。此外,SourceForge曾经或曾经有一个论坛来查找寻求帮助的项目。我在Github上找不到任何东西。有一个“搜索”功能,对于寻找要贡献的项目似乎毫无用处。我尝试了高级搜索,将其编程语言设置为“ Repositories”和“ C”。但是,您必须在搜索中添加一些内容。尽管我只想浏览项目的标题和描述。 因此,我尝试放置“网络”只是为了看看会发生什么。它仅列出了每个项目的每个分支。 我有什么办法可以以通俗的方式,例如通过第三方或其他方式搜索项目?似乎Github应该有这样的东西;我可以从Sourceforge中选择,因为我可以在那里搜索,但是我想建立一个Github个人资料,因为那是本月的风趣,而且Hacker News上所有这些狂热者似乎都认为Github个人资料比Resume更好。 /简历。:)


5
为什么不使用XHTML5?
因此,有人告诉我HTML5是向前迈出的一大步。我知道的最后一步是XHTML的引入。优势显而易见:简单,严格,使用标准XML解析器和生成器来处理网页的能力,等等​​。 HTML5如此回滚,这真是多么奇怪和令人沮丧:我们再次使用了非标准语法;再次,我们必须处理历史包and和解析复杂性;再次,我们不能使用我们的标准XML库,解析器,生成器或转换器。XML所带来的所有优势(可扩展性,名称空间,标准化等),以及W3C出于充分的理由而花了十年的时间,都失去了。 很好,我们有XHTML5,但似乎它没有像HTML5编码那样流行。例如,参见此SO问题。甚至HTML5规范都说HTML5(而不是XHTML5)是“建议大多数作者使用的格式”。 我的事实有误吗?否则,为什么我是唯一一个有这种感觉的人?人们为什么选择HTML5而不是XHTML5?
53 html  html5  xml  xhtml 

11
从无限列表中获得100个最高数字
我的一位朋友被问到这个面试问题- “从一些无限的数字列表中不断涌入数字,您需要维护其中的数据结构以在任何给定的时间点返回前100个最高数字。假定所有数字都是整数。” 这很简单,您需要按降序排列已排序的列表,并跟踪该列表中的最低编号。如果获得的新号码大于该最低号码,则必须删除该最低号码,然后根据需要在排序列表中插入新号码。 然后问题扩大了- “您可以确保插入顺序为O(1)吗?可以吗?” 据我所知,即使您添加一个新数字到列表中并使用任何排序算法对其进行再次排序,对于quicksort(我认为),最好也应该是O(logn)。所以我的朋友告诉那是不可能的。但是他没有被说服,他要求维护任何其他数据结构而不是列表。 我想到了平衡二叉树,但即使在那儿,您也不会得到顺序为1的插入。因此,我现在也遇到了同样的问题。想知道是否有任何这样的数据结构可以针对上述问题以1的顺序进行插入,或者根本不可能。
53 numbers  big-o  puzzles 

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.