软件工程

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


10
使用第三方库-始终使用包装器吗?
我参与的大多数项目都使用几个开源组件。作为一般原则,是否始终避免将代码的所有组件绑定到第三方库,而是通过封装包装器来避免更改的痛苦,是一个好主意吗? 例如,我们的大多数PHP项目都直接使用log4php作为日志记录框架,即通过\ Logger :: getLogger()实例化,它们使用-> info()或-> warn()方法,等等。在将来,但是,可能会出现一个假设的日志记录框架,该框架在某种程度上会更好。就目前而言,与log4php方法签名紧密相关的所有项目都必须在许多地方进行更改,以适应新的签名。显然,这将对代码库产生广泛的影响,任何更改都是潜在的问题。 对于这种情况下的面向未来的新代码库,我经常考虑(有时实现)包装器类来封装日志记录功能,并使其(尽管并非万无一失)更容易以最小的更改来改变日志记录的工作方式; 代码调用包装器,包装器将调用传递给日志框架du jour。 请记住,其他库中有更复杂的示例,我是否过度设计还是在大多数情况下是明智的预防措施? 编辑:更多考虑-使用依赖注入和测试加倍实际上要求我们无论如何都要抽象出大多数API(“我想检查我的代码是否执行并更新其状态,但不写日志注释/访问真实数据库”)。这不是决定者吗?

6
什么时候去流利的C#?
在很多方面,我真的很喜欢Fluent接口的概念,但是使用C#的所有现代功能(初始化程序,lambda和命名参数),我发现自己在思考:“值得吗?”,“这是正确的模式吗?采用?”。任何人都可以给我(如果不是被接受的做法),至少是他们自己的经验或决策矩阵,以便何时使用Fluent模式? 结论: 到目前为止的答案有一些好的经验法则: 当操作员多于设置员时,流利的接口将提供极大帮助,因为调用从上下文传递中受益更多。 流利的接口应该被认为是api之上的一层,而不是唯一的使用方法。 lambda,初始值设定项和命名参数等现代功能可以配合使用,使流畅的界面更加友好。 这是一个使我觉得不需要的现代功能的示例。以一个(也许很差的例子)Fluent接口为例,该接口允许我创建一个Employee,例如: Employees.CreateNew().WithFirstName("Peter") .WithLastName("Gibbons") .WithManager() .WithFirstName("Bill") .WithLastName("Lumbergh") .WithTitle("Manager") .WithDepartment("Y2K"); 可以很容易地用初始化器编写,例如: Employees.Add(new Employee() { FirstName = "Peter", LastName = "Gibbons", Manager = new Employee() { FirstName = "Bill", LastName = "Lumbergh", Title = "Manager", Department = "Y2K" } }); 在本示例中,我还可以在构造函数中使用命名参数。
78 c#  .net 

30
您必须精通数学才能成为一名优秀的程序员吗?[关闭]
似乎传统的观点表明,好的程序员也擅长数学。或两者之间存在内在联系。我读过的许多编程书籍都提供了许多示例来解决数学问题,或者以某种方式与数学相关,就好像这些示例对大多数人来说是有意义的。 因此,我想提出的问题是:要成为一名优秀的程序员,您是否必须精通数学?
78 math 

17
编码指南:方法不应包含超过7个语句?
我一直在浏览《AvSol编码指南》(C#),我几乎同意所有内容,但我真的很想知道其他人对一个特定规则的看法。 AV1500 方法不应超过7条语句需要7条以上语句的方法执行的操作过多或职责过多。它还需要人的头脑来分析确切的语句,以了解代码在做什么。用不明原因的名称将其分解为多种小型且重点突出的方法。 你们大多数人都遵循这个规则吗?即使可以大大提高可读性,即使创建新方法(您的代码仍然是DRY)几乎没有什么余地?而且您的电话号码仍然低至7吗?我倾向于10。 我并不是说我到处都违反了这条规则,相反,我的方法体积小且专注于95%,但我说你永远不应该违反这条规则,这真的让我感到震惊。 我真的只是想知道每个人对永不违反此规则的看法(在编码标准上为“ 1”-永不这样做)。但是我认为您很难找到没有的代码库。

12
终结点返回HTML而不是JSON数据实际上有什么问题?
当我刚开始学习PHP时(大约5或6年前),我了解了Ajax,并且经历了“阶段”: 您的服务器返回HTML数据,并将其放入DOM的 innerHTML中 您将了解诸如XML之类的数据传输格式(然后说“噢,这就是它的用途”),然后是JSON。 您返回JSON并使用原始JavaScript代码构建UI 您移至jQuery 您将了解API,标头,HTTP状态代码,REST,CORS和Bootstrap 您将学习SPA和前端框架(React,Vue.js和AngularJS)以及JSON API标准。 您会收到一些企业旧代码,并在对其进行检查后发现它们执行了步骤1中所述的操作。 当我使用此旧版代码库时,我什至都不认为它可以返回HTML(我的意思是,我们现在是专业人员,对吗?),所以我很难寻找要返回数据的JSON端点。 Ajax调用会填充。直到我问“程序员”,他才告诉我它正在返回HTML,并使用innerHTML直接附加到DOM。 当然,这很难接受。我开始考虑将其重构为JSON端点的方法,并考虑对端点进行单元测试等等。但是,此代码库没有测试。没有一个。超过20万行。当然,我的任务之一是提出测试整个事物的方法,但是目前我们还没有解决。 因此,我无处不在,想知道:如果我们没有任何测试,那么就没有创建此JSON端点的特殊理由(因为它不是“可重用的”:它从字面上返回仅适合该部分的数据)应用程序,但是我认为这已经隐含了,因为它返回HTML数据)。 什么究竟是错这样做呢?
77 design  ajax 

11
为什么在不再引用Java对象后不立即删除它们?
在Java中,只要对象不再具有任何引用,就可以删除它,但是JVM决定何时实际删除该对象。要使用Objective-C术语,所有Java参考本质上都是“强”的。但是,在Objective-C中,如果对象不再具有任何强引用,则该对象将被立即删除。为什么在Java中不是这种情况?

6
所有的魔术数字都一样吗?
在最近的项目中,我需要将字节转换为千字节 kibibyte。代码很简单: var kBval = byteVal / 1024; 编写完之后,我就完成了其余的功能并继续进行。 但是后来,我开始怀疑我是否在代码中嵌入了一个幻数。我的一部分说这很好,因为该数字是固定的常数,应该很容易理解。但是我的另一部分认为,如果将其包裹在一个已定义的常量(如)中,它将非常清晰BYTES_PER_KBYTE。 那么,众所周知的常数是否真的那么神奇呢? 相关问题: 数字什么时候是魔数?而被认为是在代码中的每个号码的“幻数”?-相似,但问题比我要问的要广泛得多。我的问题集中在那些问题中没有解决的众所周知的常数上。 消除魔术数字:什么时候该说“不”?也是相关的,但专注于重构,而不是常数是否为幻数。

7
代码优先与数据库优先
在设计和创建要使用的软件时,通常会先设计和创建后端SQL表,然后再进行实际编程。我目前正在从事的项目让我感到困惑。这可能是由于缺乏良好而可靠的要求所致,但是不幸的是,这次我对此几乎无能为力。这是一种“随它去吧”的情况,但是我离题了。 我正在考虑将工作流程从头开始,并首先创建UI和数据模型类,以期解决该问题将使我清楚我的数据库架构最终将是什么样。这是一个好主意吗?我很担心自己最终将获得一个UI,但仍然不知道如何构造数据库。 如果有人好奇,我将SQL Server用作后端,将MS Access用作前端应用程序。(访问也不是我的选择...所以请不要对此感到讨厌。)

7
什么是早晚绑定?
我不断听到有关早期和晚期绑定的信息,但我不了解它们是什么。我发现以下我不理解的解释: 早期绑定是指在设计时将值分配给变量,而后期绑定是指在运行时将值分配给变量。 有人可以定义两种绑定类型并进行比较吗?

11
严格出于测试目的修改代码是否是错误的做法
我与一名程序员同事讨论关于仅修改一段可工作的代码以使其可测试(例如通过单元测试)是好是坏的做法。 我的观点是,在保持良好的面向对象和软件工程实践的范围内(当然不要“公开一切”等),这是可以的。 我同事的观点是,仅出于测试目的修改代码(有效)是错误的。 只是一个简单的示例,请考虑某些组件(用C#编写)使用的这段代码: public void DoSomethingOnAllTypes() { var types = Assembly.GetExecutingAssembly().GetTypes(); foreach (var currentType in types) { // do something with this type (e.g: read it's attributes, process, etc). } } 我建议可以修改此代码以调出另一个可以完成实际工作的方法: public void DoSomething(Assembly asm) { // not relying on Assembly.GetExecutingAssembly() anymore... } 此方法接受一个Assembly对象进行处理,从而可以通过您自己的Assembly进行测试。我的同事认为这不是一个好习惯。 什么被认为是良好且常见的做法?

11
为什么软件OS是特定的?
我正在尝试确定为什么使用某些操作系统的编程语言生产的软件只能在它们上使用的技术细节。 我的理解是,二进制文件特定于某些处理器,这是因为它们了解特定于处理器的机器语言以及不同处理器之间的指令集不同。但是,操作系统的特异性来自何处?我曾经假设它是操作系统提供的API,但后来我在一本书中看到了以下图表: 操作系统-内部和设计原则第7版-W.Sallings(Pearson,2012年) 如您所见,API未表示为操作系统的一部分。 例如,如果我使用以下代码在C中构建一个简单程序: #include<stdio.h> main() { printf("Hello World"); } 编译此程序时,编译器是否在进行任何特定于OS的操作?

10
为什么C数组不跟踪其长度?
不使用数组in显式存储数组长度的背后原因是什么C? 从我的角度来看,这样做的原因很多,但并没有太多支持标准(C89)的理由。例如: 在缓冲区中具有可用长度可以防止缓冲区溢出。 Java风格arr.length既清晰又避免了程序员int在处理多个数组时必须在堆栈上维护多个s的情况。 功能参数变得更有说服力。 但我认为,最有动力的原因是通常情况下,不保留长度就不会节省空间。我敢说,数组的大多数使用都涉及动态分配。没错,在某些情况下,人们会使用在堆栈上分配的数组,但这只是一个函数调用*-堆栈可以额外处理4或8个字节。 由于堆管理器无论如何都必须跟踪动态分配的阵列所用的空闲块大小,所以为什么不使该信息可用(并添加在编译时检查的附加规则,除非有人愿意,否则不能显式地操纵长度)喜欢在脚上开枪)。 我能想到的对对方的唯一的事情是没有长度跟踪可能已经做出简单的编译器,但不是说要简单得多。 *从技术上讲,可以用自动存储的数组编写某种递归函数,在这种(非常复杂的)情况下,存储长度确实可以有效地占用更多空间。
77 c 


14
对于程序员来说,在线存在有多重要?[关闭]
我已经注意到越来越多的程序员(在这里和在实际的工作描述中都提到)程序员的“组合”-通常是他们在诸如this,GitHub等网站上的公开个人资料。 这有多重要?公司(尤其是初创公司)会否决(或者甚至在不进行面试的情况下立即将其丢弃)否则没有在线业务的杰出候选人? 就个人而言,我更喜欢在网上保持低调。我的名字在这里无法识别我,并且我还有其他站点的句柄。我有一个非常斯巴达式的(完全私人的)Facebook页面。我自己编写代码,但是代码位于本地存储库中。通常,关于我的在线信息越少越好。 我可以看到设计师需要某种在线投资组合,但是对于程序员来说,这真的是求职时的一大消极情绪吗?

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.