软件工程

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

1
测试包的命名约定
实际上,我们正在像对测试包一样命名测试包。因此,我们最终得到以下结构: src/main/java com.hello.world helloWorld.java src/test/java com.hello.world helloWorldTest.java 我一直觉得这不是很聪明,因为如果仅提供包名称,则无法区分“测试”和“待测试”。另一方面,我还没有真正找到一个在某种程度上很重要的案例。这两个软件包(对于测试用例和源类)具有相同的命名约定是一种好习惯吗?如果没有,哪种方法更好?
11 naming  packages 

4
重新排序项目时生成排序键
我们有许多项目,最终用户将可以将它们组织成所需的顺序。项目集是无序的,但是每个项目都包含一个可以修改的排序键。 我们正在寻找一种算法,该算法将允许为添加或移动为第一项,最后一项或任何两个项目之间的项目生成新的排序键。我们希望只需要修改要移动的项目的排序键。 一个示例算法是使每个排序键为浮点数,并且在将一项放置在两个项之间时,将排序键设置为其平均值。第一个或最后一个放置项将采用最外层的值+/- 1。 这里的问题是浮点精度可能会导致排序失败。类似地,使用两个整数表示小数可能会使数字变得很大,以致于无法以常规数值类型(例如,当以JSON格式传输时)准确地表示它们。我们不想使用BigInts。 是否有合适的算法对此起作用,例如使用字符串,而不会受到这些缺点的影响? 我们不希望支持大量的移动,但是上述算法可能会在大约50个移动后出现在双精度浮点数上而失败。
11 algorithms 

2
为什么在读取文件的最后一行后ifstream.eof()不返回TRUE?
当初学者开始阅读ifstreams时,他/她的本能是使用通常如下所示的循环来读取文件: while (!ifstream.eof() { ... } 但是,当我使用此代码时,我注意到它直到读取了文件的最后一行两次才停止。C ++程序员注意到,这实际上并不是读取文件的方式。相反,他们通常建议需要读取文件的人使用这样的循环: while (ifstream >> someVar) { ... } 为什么第一段代码总是无法正常工作?
11 c++ 

5
如何对待汇总之间引用的验证?
我在汇总之间的引用方面有些挣扎。让我们假设该聚合Car引用了该聚合Driver。此参考将通过具有进行建模Car.driverId。 现在我的问题是,我应该走多远的时间才能验证在中创建Car集合CarFactory。我应该相信传递的对象DriverId是现有对象, Driver还是应该检查该不变量? 对于检查,我看到两种可能性: 我可以更改汽车制造厂的签名以接受完整的驾驶员实体。然后,工厂将仅从该实体中选择ID,并以此为单位构建汽车。这里不变量被隐式检查。 我可以DriverRepository在CarFactory和显式调用中引用driverRepository.exists(driverId)。 但是现在我想知道是否有太多的不变性检查?我可以想象那些聚合可能生活在单独的有界上下文中,现在我将依赖于DriverBC的DriverRepository或Driver实体污染汽车BC。 而且,如果我与领域专家交谈,他们将永远不会质疑此类引用的有效性。我感觉到我的领域模型受到无关的关注。但是话又说回来,在某个时候,用户输入应该得到验证。

2
Unity中版本控制的最佳做法?
我对如何在Unity中使用版本控制感到有些困惑,尤其是对于不仅仅是场景的对象(例如场景或预制件)。 最近,当我和我的同事在同一场景的不同部分工作时,我们遇到了一个问题。导致冲突,分支和融合。 最后,无论如何,我的修改被他的修改所覆盖。 我目前看到的唯一方法是我们轮流在同一对象上工作,但这似乎并不方便,特别是因为我们当前正在做的所有工作都在场景中。 人们在这种情况下通常会做什么? (我们正在使用Mercurial,BitBucket和SourceTree。)

4
在布尔表达式中使用空条件运算符的最佳方法
您正在编写一个布尔表达式,可能看起来像这样: team.Category == "A Team" && team?.Manager?.IsVietnamVet public class Manager { public bool IsVietnamVet { get; set; } } public class Team { public string Category { get; set; } public Manager Manager { get; set; } } ...而您得到一个错误: 运算符'&&'不能应用于类型'bool'和'bool?'的操作数 最佳/最干净的处理方式是什么? team.Category == "A Team" && (team?.Manager?.IsVietnamVet ?? false) 这真的可读吗? …
11 c# 


1
控制反转与依赖性反转有何关系
在网络上的许多文章中,术语“控制反转”和“依赖反转原则”似乎混为一谈并用作同义词(进一步的混乱由称为“ DI-Containers”和“ IoC-Containers”的工具所强加)。Wikipedia的一篇文章很好地解释了IoC与DI不同: 控制反转(IoC)描述了一种设计,其中计算机程序的自定义编写部分从通用的可重用库接收控制流 因此,DIP是关于让模块依赖于抽象而不是具体的实现。 而IoC则是将程序流的控制权交给一个单独的模块。您可以让此模块执行的操作之一是在运行时解析依赖关系。 这种差异看起来确实很公平,但是我从未见过有人提到过IoC原理的任何其他应用程序,除了依赖关系解析之外。Wikipedia的定义非常广泛,似乎您可以使用一个模块进行更多的工作,该模块可以根据其配置和一些内部逻辑调用自定义代码。 因此,这里有一些我还无法弄清楚的问题: IoC和DIP之间的实际关系是什么?IoC始终是实现DIP的手段吗? 为什么将依赖关系解决工具称为DI容器和IoC容器?这意味着DI和IoC是同一件事。 注意:这个问题不是DI和IoC有什么区别的重复,因为后者询问的是依赖注入,而不是依赖反转。

3
什么是“应用程序模型”?
目前,我正在研究.NET Core,在最早介绍.NET Core的早期文档中,我们看到了有关许多不同垂直领域的话题。在这张图中可以看出: 在所有垂直领域中,我们都看到了运行时,框架,但是还有“ App Model”。 此外,在观看有关.NET Core CLI的视频时,据说“ DNX拥有自己的应用程序模型”,并且“ .NET Core CLI为跨平台.NET库和控制台应用程序开发创建了一个.NET应用程序模型”。 我的问题是:这是什么“应用程序模型”?真正的应用程序模型是什么,具体由什么构成?

3
带有向导的网页的REST API设计
我有一个向导格式的网页。API的提交按钮将位于向导的第4步。但是,我希望输入的数据先存储在数据库中,然后再进行向导的下一步。我还希望REST API适用于具有单个选项卡的页面。 因此,我设计了API以采用查询参数action =草稿或提交。如果采取行动,则仅某些字段是必填字段。如果提交了操作,则所有字段均为必填。REST API服务层中的验证将基于查询参数完成。看来我必须在文档中明确指定if / else子句。这是RESTful设计的可接受形式吗?满足这些要求的最佳设计是什么?
11 design  rest 

1
使用Python的方法解析顺序进行依赖注入-这样不好吗?
我观看了Raymond Hettinger在Pycon上发表的“超级被认为是超级”的演讲,并了解了一些Python的MRO(方法解析顺序),该方法以确定性方式线性化了“父”类。像下面的代码一样,我们可以利用它来发挥优势,进行依赖注入。因此,自然而然地,我现在想使用super所有功能! 在下面的示例中,User该类通过从LoggingService和继承来声明其依赖项UserService。这不是特别特殊。有趣的是,我们可以使用“方法解析顺序”来模拟单元测试期间的依赖关系。下面的代码创建一个MockUserService从继承UserService并提供我们要模拟的方法的实现。在下面的示例中,我们提供的实现validate_credentials。为了MockUserService处理任何呼叫,validate_credentials我们需要先将其UserService放置在MRO中。这通过创建一个包装类各地进行User所谓的MockUser和有它继承User和MockUserService。 现在,当我们执行MockUser.authenticate该操作时,它依次调用方法解析顺序中的super().validate_credentials() MockUserServicebefore UserService,因为它提供了validate_credentials该实现的具体实现。是的-我们已经UserService在单元测试中成功模拟了。考虑到这样UserService做可能会导致一些昂贵的网络或数据库调用-我们刚刚删除了此延迟因素。也没有UserService接触实时/生产数据的风险。 class LoggingService(object): """ Just a contrived logging class for demonstration purposes """ def log_error(self, error): pass class UserService(object): """ Provide a method to authenticate the user by performing some expensive DB or network operation. """ def validate_credentials(self, username, password): print('> UserService::validate_credentials') return username == …

2
在具有不可变数据的语言中对双向链接或循环数据结构实施操作的解决方法
我想学习如何在Haskell中制作图并对其执行一些本地操作,但是问题不是特定于Haskell的,我们可以考虑使用双链表来代替图。 问题:用 主要支持和倡导不可变数据结构(Haskell,Clojure等)的语言,惯用或推荐的方式来实现双链表(或其他双链或循环数据结构)及其操作。 ?特别是,如何使用语言正式禁止的就地更新? 我很容易想到,如果对双向链接列表执行某些本地操作(例如,如果插入了一个项目),由于语言的惰性,可能不需要立即复制整个列表。但是,由于列表是双重链接的,因此如果在一个地方进行修改,则旧节点都不能在列表的新版本中使用,因此,迟早需要对它们进行标记,复制和垃圾收集。显然,如果仅使用列表的更新副本,则这些操作是多余的,但是它们会增加与列表大小成比例的“开销”。 这是否意味着对于此类任务,不可变数据根本不合适,并且对可变数据没有“本地”支持的功能性声明语言不如命令式语言那么好?还是有一些棘手的解决方法? 附言:我已经在互联网上找到了一些有关该主题的文章和演示,但是很难追踪它们,而我认为这个问题的答案不应该超过一个段落或者是一个图表...我的意思是,如果有对于此问题,没有“功能性”解决方案,答案可能是“使用C”。如果有一个,那么它有多复杂? 相关问题 “函数式编程中的数据结构”。此处没有讨论我有关使用就地更新而不是效率低下的替代方案的具体问题。 “持久性数据结构的内部变异”。那里的重点似乎是用一种未指定的语言进行的低级实现,而我的问题是关于一种语言(功能语言或其他功能)的正确选择以及功能语言的可能惯用的解决方案。 相关报价 纯粹的函数式编程语言允许非常简洁地表达许多算法,但是在少数算法中,就地可更新状态似乎起着至关重要的作用。对于这些算法,缺乏可更新状态的纯功能语言似乎固有地效率低下([Ponder,McGeer and Ng,1988])。 -约翰·劳伯伯里(John Launchbury)和西蒙·佩顿·琼斯(Simon Peyton Jones),《懒惰的功能状态线程》(1994),还有约翰·劳伯伯里和西蒙·佩顿·琼斯,《哈斯克尔州》(1995)。这些论文ST在Haskell中介绍了Monadic类型构造函数。

2
面向对象的后期绑定
在Alan Kays的“面向对象的定义”中,有部分我不理解的定义: 对我而言,OOP意味着仅消息传递,本地保留和保护以及状态过程的隐藏以及所有事物的极端LateBinding。 但是“ LateBinding”是什么意思?如何在C#之类的语言上应用它?为什么这如此重要?

2
跨混合Ionic应用程序和常规移动网站共享angularJS代码
好的,因此,在我们的“创新实验室”中,当前正在推动使用Ionic,这是一种构建在Cordova之上的混合应用程序框架,用于本机访问,而angularJS则用于“ Web代码”。 还有一些纯移动Web项目,例如使用Angular + bootstrap进行响应式设计。 问题是,一些即将到来的项目将需要同时具有移动网站和本机应用程序(离子混合)。大多数功能和屏幕将相同,共享后端和大多数UI,但仍然会有一些区别。 所以我的问题是;如何构建项目,使其既可以成为离子项目又可以使用两种不同的部署方法来成为常规的有角度的网站。大部分代码已被重用,但移动网站的某些视图和混合应用程序的一些视图(使用更多的本机组件和约定),也许还有一些路由差异。 那是个好主意吗? 在共享代码中,是否有一种简单的方法可以知道您是哪种情况?一些IF,一些指令在其上下文之外无效,等等。 感觉好像有些缺失的链接我可能没有意识到。 提前致谢。

1
C ++中的静态全局变量和匿名名称空间
为什么在引入静态全局变量(内部链接)和未命名的命名空间中的符号(外部链接,无论如何都无法从外部引用它)之间进行区分? 这些原因是否仍然有效,还是有新的原因? 除了匿名全局(或命名空间范围)联合必须具有static的任意规则之外,还剩下什么地方,它们又是什么? 对于积分,如果没有充分的理由使它们有所不同,是否有要求使它们相等的要求? 当C ++引入名称空间(C ++ 98),特别是未命名的名称空间时,由于热情高涨,静态全局变量被弃用,不如新事物,尽管C ++ 11对此进行了还原: 弃用static关键字…不再? 在C ++ 11之前,不能将具有内部链接的符号用作模板参数:为什么C ++ 03要求模板参数具有外部链接?

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.