软件工程

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

8
是否每个git commit都会使项目处于工作状态?
我很好奇目前流行的最佳实践是什么。应该强制执行git commit,以使项目处于工作状态(正确构建,所有测试通过等),还是提交损坏的代码可以吗? 例如,如果您放弃此要求,则可以更灵活地进行提交(即使应用程序未处于工作状态,也可以将它们用作逻辑块)。但是,如果您实施它,则可以稍后灵活选择任何给定的提交...
36 git 

15
支持或反对使用Try / Catch作为逻辑运算符的论点
我刚刚在我们公司的应用程序中发现了一些可爱的代码,这些代码使用Try-Catch块作为逻辑运算符。 意思是,“执行一些代码,如果抛出此错误,则执行此代码,但如果抛出此错误,则执行此第三项操作”。 它使用“最后”作为出现的“其他”语句。 我知道这本质上是错的,但是在我去打架之前,我希望能有一些深思熟虑的论点。 嘿,如果您有关于以这种方式使用Try-Catch的参数,请务必告知。 对于任何想知道的人,该语言是C#,所讨论的代码大约有30多行,并且正在寻找特定的异常,因此它无法处理所有异常。

11
八进制在哪里有用?[关闭]
我只是把头撞在桌子上约20分钟,看着一个完全奇怪的PHP错误,然后我意识到这是八进制的。<%(*&#>八进制。 简而言之,我用零填充了一些文字,所以代码会对齐,我知道这是个大错误。忘记八进制了。 问题是,除了文件权限之外,是否有人将八进制用于其他用途?(我个人更喜欢,chmod ugo+rwx但我知道如果必须以编程方式生成它们,则使用八进制是有用的。)但是,它们在任何其他情况下都有用吗?
36 octal 

7
为什么每个人都将控制器放在一个文件夹中而将视图放在另一个文件夹中?
我正准备把弯腰的问题从asp转移到mvc框架(asp.net mvc或nancy)中。无论我走到哪里,都可以看到用于控制器/模块的文件夹和用于视图的文件夹。这是只是按类型整理事物的帕夫洛夫式反射,还是有一些更深层次的智慧在起作用?我有一个概念验证项目,将可能要一起打开的文件存储在一起,这很舒适。由于这些文件也可能互相调用,因此可以使用较短,较不易碎的相对链接进行调用。这种模式受到mvc的挑战,因为文件夹路径不再自动对应于url路径,并且在asp.net mvc中,项目模板和路由强制执行views \ controllers \ schism。 此microsoft页面介绍了区域的概念。可以理解为,由于这种人为的分离,大型应用程序变得笨拙。 人们会反对“关注点分离”,但是关注点分离已经通过拥有单独的源文件来实现。在我看来,将这些紧密耦合的源文件发送到文件夹结构的相对两端并没有任何具体收获? 还有其他人要与这个斗争吗?有小费吗?
36 mvc  asp.net-mvc 

5
RESTful API。我应该返回创建/更新的对象吗?
我正在使用WebApi设计RESTful Web服务,并且想知道在更新/创建对象时返回哪些HTTP响应和响应主体。 例如,我可以使用POST方法将一些JSON发送到Web服务,然后创建一个对象。然后,将HTTP状态设置为“创建”(201)或“确定”(200),并简单地返回诸如“添加了新员工”之类的消息,或者返回最初发送的对象,是最佳实践吗? PUT方法也是如此。哪种HTTP状态最适合使用,我是否需要返回创建的对象或仅返回一条消息?考虑到用户知道他们无论如何都试图创建/更新对象的事实。 有什么想法吗? 例: 添加新员工: POST /api/employee HTTP/1.1 Host: localhost:8000 Content-Type: application/json { "Employee": { "Name" : "Joe Bloggs", "Department" : "Finance" } } 更新现有员工: PUT /api/employee HTTP/1.1 Host: localhost:8000 Content-Type: application/json { "Employee": { "Id" : 1 "Name" : "Joe Bloggs", "Department" : "IT" } } 回应: …
36 rest  http 

3
在业务层缓存与在数据层缓存
我一直在使用DAL进行缓存的项目中工作,基本上只是在您要对数据库进行调用时,它会检查缓存中是否已经有数据,如果存在,它不会进行调用,并且而是返回该数据。 我最近才读到有关在业务层进行缓存的信息,因此基本上可以缓存整个业务对象。我可以立即看到的一个优势是响应时间更快。 您什么时候比另一个更喜欢?并且在业务层缓存是一种常见的做法吗?

3
堆和优先级队列之间的区别
我始终认为,堆和优先级队列是同义词-一个抽象的数据结构支持insert,findMin和deleteMin操作。 一些文献似乎同意我的观点-例如克里斯·冈崎(Chris Okasaki)的“纯功能数据结构”(第3章)。 另一方面,维基百科的堆页面将其定义为基于树的数据结构,并指出堆是优先级队列的具体实现。 我很难与一个以上的堆实现实现这一点-左派堆,二项式堆,展开堆... 可以用不同的数据结构实现堆这一简单事实,从定义上来说并不意味着它是一种抽象的数据结构吗?如果是这样,优先级队列是否有实际差异?

4
什么是仿制药滥用?
在查看一些代码时,我注意到有机会将其更改为使用泛型。(混淆的)代码如下所示: public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets) { var someProperty = typeOfTarget.GetProperty(possibleTargets[0]); ... } 该代码可以用泛型代替,如下所示: public void DoAllTheThings<T>(object[] possibleTargets[0]) { var someProperty = type(T).getProperty(possibleTargets[0]); ... } 在研究这种方法的优点和缺点时,我发现了一个称为泛滥的术语。看到: 保护入门者(开发人员)不受泛型影响 https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics https://codereview.stackexchange.com/q/60695 我的问题分为两个部分: 转向这样的泛型有什么好处?(性能?可读性?) 什么是泛型滥用?并通过一个通用的有一个类型参数的每一次滥用?
35 generics 


8
条件中的条件条件分配是一种不良习惯吗?
假设我想编写一个在C中连接两个字符串的函数。我的编写方式是: void concat(char s[], char t[]){ int i = 0; int j = 0; while (s[i] != '\0'){ i++; } while (t[j] != '\0'){ s[i] = t[j]; i++; j++; } s[i] = '\0'; } 但是,K&R在他们的书中以不同的方式实现了它,尤其是在while循环的条件部分中尽可能多地包括: void concat(char s[], char t[]){ int i, j; i = j = 0; while (s[i] …

8
我们何时真正使用面向对象的编程?[关闭]
我正在用Python编写一个程序,该程序基本上可以操作字符串,而我想知道是否应该使用OOP原理来执行它。客户确实告诉我他不在乎代码,他只是想把事情做好。 我知道,面向对象的代码从定义上讲不是更干净,相反,非OO代码从定义上讲并不是很糟糕。我要提出的问题或多或少是基于意见的,但可能有一些我不知道的规则。 有关要执行的操作的更多信息: 解析.csv文件并根据配置文件处理数据(列可能不同,例如列数或它们保存的数据) 使用以上处理的数据创建新的自定义格式的数据(或基于上述某些值的多个文件) 使用最后格式化的数据来创建XML文件。 根据XML文件XML的内容将XML文件拆分为多个 该应用程序应基于CLI 当然还有其他事情,例如:记录一些事件,解析CLI参数等等。 现在,这根本不是一个很大的应用程序,也几乎完成了,但是在整个开发过程中,我一直在问自己是否应该使用OOP来完成。 所以,我的问题是:你们如何知道/决定何时在应用程序中使用OOP?

2
Rust如何与C ++的并发功能相区别?
问题 我试图了解Rust是否从根本上充分改善了C ++的并发功能,以便决定我是否应该花时间学习Rust。 具体来说,惯用的Rust如何改善惯用的C ++的并发功能,或以任何方式背离? 改进(或分歧)主要是句法上的,还是范式上的实质改进(分歧)?或者是别的什么?还是根本就没有改善(分歧)? 基本原理 最近,我一直在尝试自学C ++ 14的并发功能,感觉有些不对劲。感觉有些不对劲。什么感觉了吗?很难说。 当涉及到并发时,似乎编译器似乎并没有真正在帮助我编写正确的程序。感觉好像我在使用汇编程序而不是编译器。 诚然,当涉及到并发时,我完全有可能遭受一个微妙的,错误的概念。也许我还没有摆脱Bartosz Milewski在有状态编程和数据竞赛之间的紧张关系。也许我不太了解编译器中有多少合理的并发方法以及操作系统中有多少并发方法。
35 c++  concurrency  rust  c++14 

5
什么时候应该扩展Java Swing类?
我对继承实现的当前理解是,只有存在IS-A关系时,才应该扩展类。如果父类可以进一步具有具有不同功能的更特定的子类型,但将共享在父类中抽象的公共元素。 我质疑这种理解,因为我的Java教授建议我们这样做。他建议JSwing我们在课堂上建立一个应用程序 一个都应该延伸JSwing类(JFrame,JButton,JTextBox等)到单独的自定义类和在其中指定GUI相关的定制(例如部件尺寸,部件的标签,等) 到目前为止还算不错,但是他进一步建议每个JButton应该有自己的自定义扩展类,即使唯一的区别是标签。 例如,如果GUI有两个按钮,则“ 确定”和“ 取消”。他建议应将它们扩展如下: class OkayButton extends JButton{ MainUI mui; public OkayButton(MainUI mui) { setSize(80,60); setText("Okay"); this.mui = mui; mui.add(this); } } class CancelButton extends JButton{ MainUI mui; public CancelButton(MainUI mui) { setSize(80,60); setText("Cancel"); this.mui = mui; mui.add(this); } } 如您所见,唯一的区别在于setText功能。 那么这是标准做法吗? 顺便说一句,讨论该课程的课程称为Java最佳编程实践 [教授回覆] 因此,我与教授讨论了这个问题,并提出了答案中提到的所有观点。 他的理由是子类在遵循GUI设计标准的同时提供了可重用的代码。例如,如果开发人员在一个窗口中使用了自定义Okay和Cancel按钮,则将相同的按钮放置在其他Windows中也将变得更加容易。 我知道了我想起的原因,但它仍然只是在利用继承并使代码易碎。 …

7
反对错误抑制的论点
我在我们的一个项目中发现了一段这样的代码: SomeClass QueryServer(string args) { try { return SomeClass.Parse(_server.Query(args)); } catch (Exception) { return null; } } 据我了解,抑制这样的错误是一个坏习惯,因为它会破坏原始服务器异常中的有用信息,并使代码在实际终止时继续执行。 何时才应该像这样完全消除所有错误?


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.