软件工程

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

3
是否有OOP过度复杂化的术语?
一两年前,我看到了一篇有关OOP(Java)的出色文章,其中展示了一个简单的两行或三行代码的具体记录器的发展,以及经验不足的开发人员在理论上的过度思考过程,基本上说,哦,我应该添加此以防万一我们想要的! 到本文结尾时,这个简单的记录器是一堆乱七八糟的垃圾,原始开发人员几乎无法理解自己。 这种过度并发症是否有一个通用术语?那篇文章(我非常希望我能再次找到它)很好地展示了一个孤立案例的概念,但是我遇到了整个项目,在这些项目中,开发人员实际上是由于过度使用模式,框架,库和程序而陷入困境。其他问题。用它自己的方式,这比我们继承来替换的旧版VB6意大利面条应用程序糟糕(甚至更糟)。 我真正想要的是在面试时提出这个问题。我想知道是否有人意识到并意识到缺乏架构/预先规划就容易陷入这种困境(并且因为他们似乎没有适当的平衡而陷入困境),但这并不是真的我可以找到很多信息。

7
在控制流使其多余的情况下应使用“其他”吗?
有时我会偶然发现类似于以下示例的代码(此函数的确切作用超出了此问题的范围): function doSomething(value) { if (check1(value)) { return -1; } else if (check2(value)) { return value; } else { return false; } } 正如你所看到的,if,else if和else语句与配合使用return的语句。对于一个偶然的观察者来说,这似乎很直观,但是我认为(从软件开发人员的角度来看)删除else-s并简化这样的代码会更加优雅: function doSomething(value) { if (check1(value)) { return -1; } if (check2(value)) { return value; } return false; } 这是有道理的,因为return语句后的所有内容(在相同范围内)将永远不会执行,从而使上面的代码在语义上与第一个示例相同。 以上哪一项更符合良好的编码习惯?两种方法在代码可读性方面都有缺点吗? 编辑:重复的建议已被提出,该问题仅供参考。我认为我的问题涉及另一个主题,因为我并不是要避免像另一个问题中那样重复陈述。这两个问题都试图减少重复,尽管方式略有不同。

5
为什么选择RIGHT JOIN而不是LEFT JOIN
如果我理解正确,每个RIGHT JOIN: SELECT Persons.*, Orders.* FROM Orders RIGHT JOIN Persons ON Orders.PersonID = Persons.ID 可以表示为LEFT JOIN: SELECT Persons.*, Orders.* FROM Persons LEFT JOIN Orders ON Persons.ID = Orders.PersonID 我个人认为该声明的意图是: 首先得到 Persons 然后Persons根据需要展开/重复,以匹配Orders 最好用的顺序来表示,而Persons LEFT JOIN Orders不是用相反的顺序来表示Orders RIGHT JOIN Persons(因此我从不使用RIGHT JOIN)。 有什么情况下RIGHT JOIN首选a?或者,是否有任何用例RIGHT JOIN可以做一些不能做的事情LEFT JOIN?

4
引用透明性对程序员有什么好处?
在编程中,引用透明的好处是什么? RT是功能性和命令性范式之间的主要区别之一,并且功能性范式的倡导者经常将RT用作与命令性范式相比的明显优势。但是,这些拥护者们在他们的所有努力中,从来没有解释过为什么这对我作为程序员来说是有益的。 当然,他们会对它们的“纯”和“优雅”有自己的学术解释,但是它如何使它比不太“纯”的代码更好呢?它对我的日常编程有什么好处? 注意: 这不是“ 什么是参照透明性”的副本。 后者地址的话题是什么是RT的问题,而这个问题解决了它的好处(可能不是那么直观)。

5
当代码“必须”不好时,我应该作为审核者做什么?
我在一个设计不良,设计过度的项目中工作,该项目几个月前已引入强制性代码审查。 我被要求检查大量实现新功能的代码。它具有与我们其他代码库相同的缺陷。我知道在很大程度上,这些缺陷会渗入新代码中,例如。因为必须继承设计不良的类或实现设计不良的接口,同时又要保持兼容性,因此,我无法提供不涉及重写一半代码库的更好的解决方案。但是我觉得从工程的角度来看,这对于已经损坏的代码库不利,因为我们还要对其进行更多破坏。我正在检查的代码肯定是不好的,但是必须要实现该功能。 对于此特定评论,我应该如何表现?我有办法保持诚信并保持建设性吗? 请注意,我在此询问的是代码审查的范围。我确实意识到问题是由其他因素引起的,包括组织和工作文化,但是我想知道的是如何处理审查本身。

7
您如何根据经验指标判断软件的好坏?
目前,我被要求看一个项目,该项目在五个月前完成了核心开发,但是仍然存在大量缺陷。对于大约每10个已修复的缺陷而言,所发生的事情是,我们提出至少4个缺陷,在某些情况下会提出8个缺陷。 我相信供应商的编码实践很差,并且对此达成了普遍共识。但是,我想知道软件是否存在结构性问题?缺陷密度是一种有用的措施,但是如果核心软件编写不当,则更多的是卖方正在做的所有事情都在转移问题。 在基础架构中,如果某些东西构建得不好,则可以更明确地定义,除了LOC缺陷之外,您还可以对软件使用哪些度量? 该产品已进入缺陷修复阶段4个月,但仍未解决足够的关键缺陷。我们不会注入新功能,而只是解决回归问题。 这表明开发质量问题尚未解决。但是,如果产品本身存在根本缺陷,那就是另一个问题。考虑到核心代码库编写得不好并且文档有限,所有外部开发人员正在做的事情正在将问题从A转移到B。一旦内部开发团队接手我,我担心他们将不得不从根本上重写代码以将其替换为B。使它起作用。 因此,当您接受第三方提供的产品并要求其提供支持时,您将使用什么接受标准来定义标准? 除了让我们的首席开发人员对每个版本的代码进行同行评审之外,还不确定还能做什么?

7
DevOps意味着开发人员现在应对基础架构和发布负责-但是,此更改背后的驱动力是什么?
DevOps意味着开发人员现在应对基础架构和发布负责-但是,此更改背后的驱动力是什么? 我会把牌放在桌上:我是一名开发人员,曾在“ DevOps”和非文化领域工作过。不必担心基础结构,发行版,质量保证以及相关的仪式,这将使编写好的代码分心。 但是行业正在朝这个方向发展,那么这是什么原因呢?角色专业化的“旧”模型引起了哪些问题?
18 process  devops 

3
为什么将计算表示为矩阵乘法会使运算速度更快?
在Google 使用TensorFlow的MNist教程中,展示了一种计算,其中一个步骤等效于将矩阵乘以矢量。Google首先显示一张图片,其中将完整写出执行计算所需的每个数字乘法和加法。接下来,他们显示了一张图片,其中将其表示为矩阵乘法,声称此版本的计算更快,或者至少可能更快: 如果将其写为方程式,则得到: 我们可以“向量化”此过程,将其转换为矩阵乘法和向量加法。这有助于提高计算效率。(这也是一种有用的思考方式。) 我知道这样的方程式通常是由机器学习从业人员以矩阵乘法格式编写的,并且从代码简洁性或理解数学的角度来看,当然可以看出这样做的好处。我不明白的是Google声称从手写形式转换为矩阵形式“有助于提高计算效率” 通过将计算表示为矩阵乘法,何时,为什么以及如何在软件中获得性能改进?如果我作为一个人本人要在第二张(基于矩阵)图像中计算矩阵乘法,则可以通过依次执行第一张(标量)图像中所示的每个不同的计算来完成。对我来说,它们只是两个表示同一计算序列的符号。为什么我的计算机与众不同?为什么计算机能够比标量计算机更快地执行矩阵计算?

1
ES6和Javascript之间的区别[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 3年前关闭。 什么是ES6?是JavaScript吗?还是多语言支持者? 我搜索了它,但听不懂,尤其是Wikipedia上的页面。比Java更好吗?在使用这种语言的网站开发中我能做什么? 那么ES6是什么,如何在我的Web应用程序开发中使用它?
18 javascript  es6 

3
静态分析类型是否可以替代?
编程语言中的静态类型有助于在编译时强制执行某些保证,但是类型是此工作的唯一工具吗?还有其他指定不变式的方法吗? 例如,一种语言或环境可以帮助强制执行有关数组长度或函数输入之间关系的保证。我只是在类型系统之外还没有听说过这样的事情。 我想知道一个相关的事情是,如果有任何非陈述方式做静态分析(类型声明,大部分)。

5
验证应位于哪一层?
我正在使用Spring Boot创建一个Rest API,并且正在使用Hibernate Validation来验证请求输入。 但是我还需要其他类型的验证,例如,当需要检查更新数据时,如果公司ID不存在,我想抛出一个自定义异常。 该验证应该位于服务层还是控制器层? 服务层: public Company update(Company entity) { if (entity.getId() == null || repository.findOne(entity.getId()) == null) { throw new ResourceNotFoundException("can not update un existence data with id : " + entity.getId()); } return repository.saveAndFlush(entity); } 控制器层: public HttpEntity<CompanyResource> update(@Valid @RequestBody Company companyRequest) { Company company = …

2
在类中定义一个大型私有函数以保持有效状态(即更新对象的数据成员)是否是一个好主意?
尽管在下面的代码中使用的是在电子商务站点中简单的单项购买,但我的一般问题是有关更新所有数据成员以始终保持对象数据处于有效状态的信息。 我发现“一致性”和“国家是邪恶的”是相关的短语,在这里进行了讨论:https : //en.wikibooks.org/wiki/Object_Oriented_Programming#.22State.22_is_Evil.21 <?php class CartItem { private $price = 0; private $shipping = 5; // default private $tax = 0; private $taxPC = 5; // fixed private $totalCost = 0; /* private function to update all relevant data members */ private function updateAllDataMembers() { $this->tax = $this->taxPC * …

3
在Python中的同一文件中可以有多个类吗?
经过数年的Java和PHP生涯,我才刚刚进入Python世界。尽管语言本身非常简单明了,但我仍在努力解决一些我无法解决的“小问题”,并且到目前为止,我在众多文档和教程中都找不到答案。 对于有经验的Python从业者来说,这个问题似乎很愚蠢,但是我确实想要一个答案,因此我可以继续使用该语言: 在Java和PHP中(虽然不是严格要求),但您最好将每个class文件写在自己的文件中,class最佳做法是使用文件名。 但是在Python,至少在我检查的教程,这是确定要在同一个文件中的多类。 该规则是在生产型,可部署的代码中保留吗?还是为了简洁起见,仅在具有教育意义的代码中执行?

1
如果我们记录异常消息并抛出其他异常,它仍然是反模式吗?
我们的网络应用程序正在使用将ExceptionMapper某些异常映射到Response。我们记录异常消息,然后引发新异常,如下所示: catch (SomeException ex) { LOG.error(ex.getMessage()); throw new MyException(ex.getMessage()); } 我们不会再次抛出相同的异常,所以我的问题是,是否将其视为Log and Throw反模式。因此,最好删除相似位置的日志并将它们移至以下几个ExceptionMapper类: @Provider public class MyExceptionMapper implements ExceptionMapper<MyException> { // bla bla @Override public Response toResponse(final MyException ex) { LOG.error(ex.getMessage()); return Response.status(400).entity("something").build(); } }

6
什么是URI方案?
我已经搜索了这个问题,但是找不到一个好的答案。 甚至有关URI的Wikipedia文章也没有对其进行详尽的解释。我以为这是访问网页的协议。例如HTTP / HTTPS / FTP,但Wiki文章另有说明。 一些URI方案不与任何特定协议(例如“文件”)相关联,而许多其他URI方案不使用协议名称作为其前缀(例如“新闻”)。 我知道该方案的URL的哪一部分。但是我真正的问题是它是做什么的?
18 protocol  internet  uri 

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.