软件工程

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

2
git-flow模型中的错误修正在哪里?
在通常称为Git-flow模型的修补程序中,修补程序进入其特定hotfix-*分支,而在发布之前的小型集成修补程序也进入该release-*分支。以前版本中的常规错误修正似乎没有位置。 它们应该出现在哪里?它们是否应该在自己的bug-*分支中分支develop(就像feature分支一样)?
14 git  gitflow 


2
Const C ++ DRY策略
为了避免与C ++ const无关的重复,在某些情况下const_cast可以工作,但返回非const的私有const函数不起作用? 在Scott Meyers的有效C ++项目3中,他建议将const_cast与静态强制转换结合使用可以是避免重复代码的有效且安全的方法,例如 const void* Bar::bar(int i) const { ... return variableResultingFromNonTrivialDotDotDotCode; } void* Bar::bar(int i) { return const_cast<void*>(static_cast<const Bar*>(this)->bar(i)); } Meyers继续解释说,让const函数调用非const函数是危险的。 下面的代码是一个反例,显示: 与Meyers的建议相反,有时将const_cast与静态强制转换结合使用是危险的 有时让const函数调用非const的危险性较小 有时两种使用const_cast的方式都可能隐藏有用的编译器错误 避免const_cast并让其他const私有成员返回非const是另一种选择 避免代码重复的const_cast策略中的一种是否被视为良好实践?您愿意使用私有方法策略吗?在某些情况下,const_cast可以工作,但私有方法不能工作吗?还有其他选择(除了重复)吗? 我对const_cast策略的担心是,即使编写时代码正确,以后在维护期间代码也可能变得不正确,并且const_cast将隐藏有用的编译器错误。似乎普通的私有功能通常更安全。 class Foo { public: Foo(const LongLived& constLongLived, LongLived& mutableLongLived) : mConstLongLived(constLongLived), mMutableLongLived(mutableLongLived) {} // case A: we shouldn't …
14 c++  dry  const 

4
为什么C ++不允许您使用构造函数的地址?
是否有某种特定的原因会在概念上破坏该语言,还是有某种特定的原因在某些情况下在技术上不可行? 用法将与新运算符一起使用。 编辑:我将放弃希望让我的“新操作员”和“新操作员”变得直截了当并保持直率。 问题的关键是:构造函数为何如此特殊?当然要记住,语言规范告诉我们什么是合法的,但不一定是道德的。合法的东西通常由与该语言其余部分在逻辑上一致的东西,简单明了的东西以及编译器可以实现的东西告知。标准委员会权衡这些因素的可能依据是经过深思熟虑的,因此很有趣。
14 c++ 

3
Model-View-Controller:用户是否与View或Controller交互?[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加细节并通过编辑此帖子来澄清问题。 5年前关闭。 我最近了解了MVC设计模式。我正在从《 Head First设计模式》一书中学习。 根据这本书(如果我理解正确的话): 该模型是大多数应用程序逻辑和数据。 View基本上是一个GUI,它向用户直观地表示模型。 控制器负责“调解”,并充当视图和模型之间的“中间人”。视图向控制器报告用户已执行操作,控制器将其转换为模型上的方法调用。 但是,网上很多地方都与我从那本书中了解的内容相矛盾。他们声称,一般而言,用户是与控制器(而不是视图)交互的。 哪一个是正确的或更常见的?用户是直接与Controller交互还是与View直接交互?两种方法都可以接受吗?哪个更常见?

3
MVVM和服务模式
我正在使用MVVM模式构建WPF应用程序。现在,我的视图模型调用服务层以检索模型(与视图模型无关)并将其转换为视图模型。我正在使用构造函数注入将所需的服务传递给viewmodel。 它易于测试,并且适用于几乎没有依赖关系的viewmodel,但是当我尝试为复杂模型创建viewModels时,我就有了一个构造函数,其中注入了很多服务(一个用于检索每个依赖关系和所有可用值的列表)绑定到itemsSource)。我想知道如何处理这样的多种服务,并且仍然拥有一个可以轻松进行单元测试的视图模型。 我在考虑一些解决方案: 创建一个包含所有可用服务作为接口的服务单例(IServices)。示例:Services.Current.XXXService.Retrieve(),Services.Current.YYYService.Retrieve()。这样,我就没有一个包含大量服务参数的庞大构造函数。 为viewModel使用的服务创建外观,并将此对象传递到我的viewmodel的ctor中。但是,然后,我必须为我的每个复合视图模型创建一个外观,这可能会有点多... 您认为实现这种架构的“正确”方法是什么?

4
为动词命名布尔字段
在Java中,按照约定,布尔字段的getter和setter将是isField()和setField()。这工作完全正常与是形容词喜欢字段名active,visible,closed,等。 但是,如何命名具有动词含义的字段,例如haveChildren?在动词()上加上“ _ing” ,也许吗?havingChildren 为了澄清,我无法控制方法名称(getter和setter),因为它们是由IDE自动生成的。因此,我需要一个适当的字段名称,以便在IDE为其生成getter时有意义。例如,hasChildren是一个完美的字段名称,但是当IDE为该字段生成getter时,它将为isHasChildren。我该如何解决?
14 java  naming 

4
监视受过测试的班级是不好的做法吗?
我正在一个项目中进行类内部调用,但是结果是简单值的很多倍。示例(不是真实的代码): public boolean findError(Set<Thing1> set1, Set<Thing2> set2) { if (!checkFirstCondition(set1, set2)) { return false; } if (!checkSecondCondition(set1, set2)) { return false; } return true; } 为这种类型的代码编写单元测试真的很困难,因为我只想测试条件系统而不是实际条件的实现。(我在单独的测试中这样做。)实际上,如果我传递实现条件的函数会更好,而在测试中我只提供一些模拟即可。这种方法的问题在于嘈杂:我们大量使用泛型。 一个可行的解决方案;但是,这是使被测对象成为间谍并模拟对内部函数的调用。 systemUnderTest = Mockito.spy(systemUnderTest); doReturn(true).when(systemUnderTest).checkFirstCondition(....); 这里的关注点是有效更改了SUT的实现,并且使测试与实现保持同步可能会出现问题。这是真的?是否有最佳实践来避免这种内部方法调用的麻烦? 请注意,我们正在谈论的是算法的各个部分,因此将其分解为多个类可能不是一个理想的决定。

6
在哪个顺序定义吸气剂和吸气剂?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 订单中定义吸气剂和吸气剂是否有最佳实践?似乎有两种做法: 吸气剂/设定剂对 首先是吸气剂,然后是二传手(或者反之) 为了说明不同之处,这里是一个getter / setter对的Java示例: public class Foo { private int var1, var2, var3; public int getVar1() { return var1; } public void setVar1(int var1) { this.var1 = var1; } public int getVar2() { return var2; } public void setVar2(int var2) { this.var2 = var2; } public …

1
如何对图像处理代码进行单元测试?
我正在图像处理(主要是OCR)方面工作,我想知道如何在开发中集成单元测试。 我已经在使用单元测试来处理更多“常见”类型的代码,但是在处理图像处理代码时,我不确定该如何处理。这种代码总是需要一些图像数据输入/输出,而对其进行模拟并不明显。目前,我主要进行集成测试,但是它们需要一段时间才能运行,我想了解一些有关如何将这种代码分解为单元测试的想法,以便我可以更快地运行它们。 编辑:分析角色可以经历许多步骤,包括多次旋转,缩放和形态操作。随着算法的发展,这些步骤经常改变。因此,在测试期间,输入和预期输出会发生很大变化。每个字符可以为100x100像素,因此毫无疑问地在代码中对它们进行编码或处理生成的数据。

7
是否可以在没有明显分支的情况下实施策略模式?
策略模式很好地避免了if ... else庞大的构造,并使添加或替换功能更加容易。但是,我认为这仍然存在一个缺陷。似乎在每个实现中仍然需要一个分支构造。它可能是工厂或数据文件。以订购系统为例。 厂: // All of these classes implement OrderStrategy switch (orderType) { case NEW_ORDER: return new NewOrder(); case CANCELLATION: return new Cancellation(); case RETURN: return new Return(); } 此后的代码无需担心,现在只有一个地方可以添加新的订单类型,但是此部分代码仍不可扩展。将其拉出到数据文件中有助于提高可读性(我知道这值得商bat): <strategies> <order type="NEW_ORDER">com.company.NewOrder</order> <order type="CANCELLATION">com.company.Cancellation</order> <order type="RETURN">com.company.Return</order> </strategies> 但这仍然增加了样板代码来处理数据文件-授予的,更容易进行单元测试和相对稳定的代码,但是仍然增加了复杂性。 而且,这种结构不能很好地进行集成测试。现在每个单独的策略可能更容易测试,但是您添加的每个新策略都增加了测试的复杂性。它比没有使用模式时要少,但是它仍然存在。 有没有办法实现减轻这种复杂性的战略模式?还是这只是简单而已,而尝试更进一步只会增加另一层抽象,却几乎没有好处?

11
如何使管理脱离我们的开发流程
我是软件开发团队的一名软件工程师。最近三年,我们为内部客户开发了新产品。现在该产品完成了,我们将为现有产品开发主要的新功能。对于特定功能,产品管理人员猜测开发需要150个小时。我们与项目经理一起制定了非常详细的计划,我们花了300个小时努力。昨天我们讨论了这个问题,他们认为我们已经严重高估了事情。 在我们的计划中,我们估算了编写单元测试的时间,其目的是丢弃它们以节省时间。尚未做出决定,如有需要,我将捍卫这一计划和单元测试。但是我在这里真正不喜欢的是管理正在干扰我们的开发过程。如何使它们脱离我们的开发流程?我可以使用哪些参数来保持单元测试到位(除了质量和长期节省时间之外)? 附带说明一下,我们公司有3个工程团队,我所在的团队按时交付了他们的软件(给予或获得10%的利润)。而其他团队总是迟交,这主要是由于对计划的低估。他们只计划编码,而不计划编码的管理,测试和处理。

2
示例代码解释Joe Armstrong的香蕉猴丛林问题[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 乔·阿姆斯特朗(Joe Armstrong)在《工作中的编码员》一书中指出: 我认为缺乏可重用性的是面向对象的语言,而不是功能语言。因为面向对象语言的问题是他们拥有了它们所伴随的所有隐式环境。你想要一个香蕉,但是你得到的是一只大猩猩,抱着香蕉和整个丛林 我在这里不太明白。如果问题出在香蕉上,我们可以将所有逻辑封装在“ getBanana”函数的后面。猴子和丛林在这种情况下是如何参与的。有人可以写一个代码片段来以更容易理解的方式解释问题吗,例如,说明该Banana对象需要Monkeyand Jungle对象才能被启动的事实?

2
如何处理事件来源中的副作用?
假设我们要为金融应用程序实现一个小型安全子系统,该子系统将在检测到异常模式时通过电子邮件向用户发出警告。对于此示例,该模式将包括所描述的三个事务。安全子系统可以从队列中读取主系统中的事件。 我想得到的是一个警报,它是系统中发生的事件的直接结果,而没有中间模式来模拟模式的当前状态。 监控已激活 交易已处理 交易已处理 交易已处理 警报已触发(ID:123) 已发送警报电子邮件(ID:123) 交易已处理 考虑到这一点,我认为事件源可以在这里很好地应用,尽管我有一个没有明确答案的问题。在示例中触发的警报具有明显的副作用,需要发送电子邮件,这种情况只能发生一次。因此,在重放聚合的所有事件时不应发生这种情况。 在某种程度上,我看到需要发送的电子邮件类似于查询方生成的实现,这在CQRS / Event采购文献中已经见过很多次了,尽管差别不大。 在此文献中,查询端是由事件处理程序构建的,该事件处理程序可以在给定点生成状态的实现,从而再次读取所有事件。但是,在这种情况下,由于前面解释的原因,不能完全像那样完成。每个状态都是瞬态的想法在这里并不适用。我们需要记录警报发送到某个地方的事实。 对于我来说,一个简单的解决方案是使用其他表或结构,在其中保留先前触发的警报的记录。由于我们具有ID,因此我们可以检查之前是否发布了具有相同ID的警报。拥有此信息将使SendAlertCommand成为幂等。可以发出几个命令,但副作用只会发生一次。 即使考虑到该解决方案,我也不知道这是否暗示此体系结构对此问题有问题。 我的方法正确吗? 在哪里可以找到更多有关此的信息? 奇怪的是我还没有找到更多有关此的信息。也许我一直在使用错误的措词。 非常感谢!

3
后端ID是公开的还是不公开的?
根据这个人说的话:http : //toddfredrich.com/ids-in-rest-api.html 假设他关于使用UUID识别api资源是正确的。然后我遇到麻烦,尝试以这种方式实现它,这是: class FooEntity { final String id = null; //auto-generated by my backend (mongodb), not shared final UUID uid = UUID.randomUUID(); //the resource id } (在客户端和服务器之间,发送和接收DTO,而不是数据库实体。) 现在的问题是,这id不再有用,因为我不再使用它。客户端发出请求,uid所以为什么还要打扰2个id?然后我们回到开始的同一期。如果我将UUID设置为主键(_id),那么我会将后端ID公开。 除此之外,还有效率主题。我已经读过,通过ObjectId进行索引比UUID效率更高。

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.