软件工程

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

30
哪些语言功能被认为有害?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 请说明原因,并列出实现了(mis)功能的语言。 发布您认为有害的功能,而不是您不喜欢的功能。

3
永远不要让公众成员虚拟/抽象-是吗?
早在2000年代,我的一位同事就告诉我,将公共方法虚拟化或抽象化是一种反模式。 例如,他认为这样的课程设计得不好: public abstract class PublicAbstractOrVirtual { public abstract void Method1(string argument); public virtual void Method2(string argument) { if (argument == null) throw new ArgumentNullException(nameof(argument)); // default implementation } } 他说 实现Method1并重写的派生类的开发人员Method2必须重复参数验证。 如果基类的开发人员决定在Method1或Method2以后的可自定义部分周围添加一些内容,他将无法执行。 相反,我的同事提出了这种方法: public abstract class ProtectedAbstractOrVirtual { public void Method1(string argument) { if (argument == null) throw new …

4
是否应使用HTTP状态代码来表示服务器上的业务逻辑错误?
对于客户端(浏览器中的JS)与服务器通信的一些API设计,我处在一个十字路口。由于有效的安全锁定,我们使用HTTP 409冲突来表示操作失败。安全锁可以防止开发人员意外更改我们客户的生产系统。我的任务是在客户端上更优雅地处理409s,以指示为什么特定的API调用失败。 我的解决方案是包装我们的任何AJAX调用的失败处理程序,当由于409导致某些操作失败时,它将在客户端上显示通知-一切都很好,并且可以与使用相同机制的其他4XX和5XX错误一起使用。 出现问题时,我们的一个路由处理程序在遇到业务逻辑错误时以409s响应-我的AJAX包装器报告安全锁已打开,而客户端的现有故障处理程序报告了(它认为)问题是基于主体的回应。一个简单的解决方案是更改处理程序的响应或用于表示安全锁的状态代码。 这使我走到了十字路口:HTTP状态代码是否应该甚至用来表示业务逻辑错误?这个问题解决了我面临的同一问题,但是并没有获得太大的吸引力。正如链接答案中所建议的那样,我倾向于使用HTTP 200 OK以及适当的正文来表示业务逻辑中的失败。 有人在这里有什么强烈的意见吗?有谁能说服我这是代表失败的错误方式?
20 rest  api  web 

2
ES / CQRS并发处理
我最近开始研究CQRS / ES,因为我可能需要在工作中应用它。对于我们来说,这似乎很有希望,因为它将解决很多问题。 我对ES / CQRS应用程序如何看起来像上下文简化后的银行业务用例(提取资金)进行了粗略的了解。 综上所述,如果A人提取了一些钱: 发出命令 命令已交出以进行验证/验证 如果验证成功,则将事件推送到事件存储 聚合器使事件出队以对聚合应用修改 据我了解,事件日志是事实的源泉,因为它是FACTS的日志,因此我们可以从中得出任何预测。 现在,在这种宏伟的计划中,我不了解的是在这种情况下会发生什么: 规则:余额不能为负 A人的余额为100e 人A发出100e的WithdrawCommand 验证通过并发出100e事件的MoneyWithdrewEvent 同时,人A发出另一个100e的WithdrawCommand 第一个MoneyWithdrewEvent尚未汇总,因此验证通过,因为针对汇总(尚未更新)的验证检查 再次发出100e的MoneyWithdrewEvent ==>我们处于不一致状态,余额为-100e,并且日志包含2 MoneyWithdrewEvent 据我了解,有几种策略可以解决此问题: a)将聚合版本ID和事件一起放入事件存储中,因此,如果修改后版本不匹配,则不会发生任何事情 b)使用一些锁定策略,这意味着验证层必须以某种方式创建一个 与策略有关的问题: a)在这种情况下,事件日志不再是事实的源头,如何处理?另外,我们还给客户端确定,但是允许退出是完全错误的,在这种情况下使用锁是否更好? b)锁==死锁,您对最佳做法有什么见解? 总体而言,我对如何处理并发的理解正确吗? 注意:我了解同一个人不可能在如此短的时间内提取两次资金,但是我举了一个简单的例子,不要迷失细节

9
init()方法有代码味道吗?
声明init()类型的方法是否有目的? 我不是问我们是否应该优先init()于构造函数,或者如何避免声明init()。 我问的是在声明方法(查看它的普遍性)后是否有任何理论依据,init()或者它是否是一种代码味道,应避免使用。 这个init()习语很普遍,但是我还没有看到任何真正的好处。 我说的是鼓励通过方法初始化的类型: class Demo { public void init() { //... } } 什么时候可以在生产代码中使用它? 我觉得这可能是代码的味道,因为它表明构造函数未完全初始化对象,从而导致部分创建了对象。如果未设置状态,则该对象不应存在。 从企业应用的意义上讲,这使我相信它可能是某种用于加速生产的技术的一部分。这是我可以想到的惯用法,这是唯一合乎逻辑的原因,但我不确定是否会有这样的习惯。

7
为什么Java具有不同大小数字的原语?
在Java中有原始类型byte,short,int并long和同样的事情float和double。为什么必须要由一个人来设置原始值应使用多少个字节?是否只能根据传入的数字大小来动态确定大小? 我能想到的原因有两个: 动态设置数据大小将意味着它也需要能够动态更改。这可能会导致性能问题吗? 也许程序员不希望某人能够使用比特定大小更大的数字,并且这使他们受到限制。 我仍然认为通过使用单个int和float类型进行简单操作可能会获得很多收益,是否有特定的原因导致Java决定不走这条路?

3
避免警告和通知是一种好习惯吗?
通常,我一直在处理PHP警告和注意事项,因为我从事的许多项目已经在实时生产中。现在,如果我打开这些实时生产网站上的警告和通知,它们将被超负荷使用。 我在家中或本地进行的项目通常会尝试消除所有警告和注意事项。有时,没有通知是没有解决方案的,所以我只需要处理一下通知,直到决定完全关闭通知。 最后,我不知道我是在浪费时间试图摆脱所有警告和注意,还是为了更大的利益而这样做。 因此,我的问题是,完全避免发出警告和通知是一种好的做法,还是真的没有关系?
20 php  warnings 

1
嵌套的REST网址和父ID,哪个设计更好?
好的,我们有两个资源:Album和Song。这是API: GET,POST /albums GET,POST /albums/:albumId GET,POST /albums/:albumId/songs GET,POST /albums/:albumId/songs/:songId 我们知道我们讨厌某首歌,Susy例如。我们应该在哪里search采取行动? 另一个问题。好吧,现在更真实了。我们打开专辑1并加载所有歌曲。我们创建了JS对象,每个对象都保存歌曲数据,并具有如下几种方法:remove,update。 歌曲对象具有ID,名称和内容,但是不知道它属于哪个父对象,因为我们通过查询来检索歌曲列表,因此每个父对象都返回父ID并不是很好。我错了吗? 因此,我看到的解决方案很少,但我不确定。 将父ID设为可选-作为get-parameter。我目前使用的是这种方法,但我觉得它很丑。 List,Create /songs?album=albumId Update,Delete /songs/:songId Get /songs/?name=susy # also, solution for first question 混合动力车 现在方便了,因为我们需要唱片集ID来执行OPTIONS查询以获取元数据。 List,Create /album/:albumId/songs Update,Delete /songs/:songId POST /songs/search # also, solution for first question 返回每个资源实例的完整URL。API是相同的,但是我们会得到如下歌曲: id: 5 name: 'Elegy' url: /albums/2/songs/5 我听说这种方法称为HATEOAS。 所以...提供父母身分证 id: …

3
DDD应用程序服务和REST API之间的概念不匹配
我正在尝试设计一个具有复杂业务域和支持REST API(严格来说不是REST,而是面向资源)的应用程序。我想出一种以面向资源的方式公开域模型的方法时遇到一些麻烦。 在DDD中,域模型的客户端需要通过过程“应用程序服务”层来访问由实体和域服务实现的任何业务功能。例如,有一个具有两种方法来更新User实体的应用程序服务: userService.ChangeName(name); userService.ChangeEmail(email); 此应用程序服务的API公开命令(动词,过程),而不是状态。 但是,如果我们还需要为同一应用程序提供RESTful API,则有一个用户资源模型,如下所示: { name:"name", email:"email@mail.com" } 面向资源的API公开状态,而不是命令。这引起了以下问题: 根据REST API上的每个属性,每个针对REST API的更新操作都可以映射到一个或多个Application Service过程调用。 对于REST API客户端,每个更新操作看起来都是原子操作,但是并不是那样实现的。每个应用程序服务调用被设计为一个单独的事务。在资源模型上更新一个字段可能会更改其他字段的验证规则。因此,我们需要一起验证所有资源模型字段,以确保所有潜在的应用程序服务调用在开始创建之前都是有效的。一次验证一组命令要比一次执行简单得多。我们如何在甚至不知道存在单个命令的客户端上执行此操作? 以不同的顺序调用Application Service方法可能会产生不同的效果,而REST API看起来没有什么区别(在一个资源内) 我可以想出更多类似的问题,但是基本上它们都是由同一件事引起的。每次调用应用程序服务后,系统状态都会更改。什么是有效更改的规则,即实体可以执行下一个更改的一组操作。面向资源的API试图使它们看起来都像原子操作。但是跨越这个鸿沟的复杂性一定要到某个地方,而且看起来是巨大的。 另外,如果UI更加面向命令(通常是这种情况),那么我们将不得不在客户端的命令和资源之间进行映射,然后再在API端进行映射。 问题: 所有这些复杂性是否应该仅由(厚)REST到AppService映射层处理? 还是我对DDD / REST的理解缺少什么? REST是否对于在一定程度(相当低)的复杂度下公开域模型功能不可行?

2
谁能解释浮点数在内存中的表示?
当我阅读上一个问题时,这不是重复的问题。 谁能帮助我理解how float values are stored in the memory。 我的疑问是浮点值包含' .'(for example 3.45)'.'在内存中将如何表示? 有人可以用图表说明我吗?

7
Python可变的默认参数:为什么?
我知道默认参数是在函数初始化时创建的,而不是在每次调用函数时创建的。请参见以下代码: def ook (item, lst=[]): lst.append(item) print 'ook', lst def eek (item, lst=None): if lst is None: lst = [] lst.append(item) print 'eek', lst max = 3 for x in xrange(max): ook(x) for x in xrange(max): eek(x) 我不明白的是为什么要这样实施。与每次调用时的初始化相比,此行为提供什么好处?
20 python 

7
模式与原理的区别
面向对象的设计模式和原理之间有什么区别?他们是不同的东西吗?据我了解,他们两个都试图实现一些共同的目标(例如灵活性)。那么我可以说模式是原则,反之亦然吗? 设计原理= SOLID(即依赖反转原理) 设计模式= Gof(即抽象工厂模式)

9
通用编程技术可加快编码时间
我正在准备一场编程比赛,我们必须使用C ++进行编程,而这一切都是关于在短时间内生成有效的代码。一个例子是使用宏获取最少两个整数或使用内存集初始化数组(但是有人告诉我,您既不应该在这里使用它)。 这就引出了一个问题,在实际工作中要使用哪种编码技术?
20 c++ 


5
多租户-单数据库与多数据库
我们有许多客户,他们的系统共享一些功能,但也有一定程度的多样性。客户数量在增长-永远是健康的事情!-他们的业务之间的差异也在增加。 当前,只有一个ASP.Net(Web窗体)网站(与Web项目相对),其中每个租户都有子文件夹,并带有该租户的非标准页面。有一个单独的模型项目,处理数据库访问和业务逻辑。 在(a)每个客户端拥有1个数据库且仅具有与该客户端相关联的功能之间,这是更好的选择,也是最重要的原因。(b)由所有客户端共享的单个数据库,其中任何一个客户端仅使用表的子集。 企业内部的主要担忧已经结束: 维护多个资产-备份,版本控制等 尽可能促进重复使用 您将如何确保解决这些问题,哪种解决方案更可取,为什么?(我也一直在整理类似问题的答案)

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.