软件工程

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

5
单元测试无效方法
为了修复应用程序中的错误,我postLogin通过将调用添加到名为的现有方法上来修改了一种名为的方法getShoppingCart。 码 protected void postLogin() { getShoppingCart(); } 但是,我不确定编写单元测试的最佳方法postLogin是什么。 方法1 使用Mockito中的verify可以简单地验证该方法是否已被调用。 verify(mock).getShoppingCart(); 方法2 通过获取用户购物车的值来测试方法调用的副作用。 AssertNotNull(user.getShoppingCart()); 一种方法比另一种更好吗?

2
CQRS是否设计过度?
我仍然记得存储库过去的美好时光。但是随着时间的流逝,存储库变得丑陋。然后,CQRS成为主流。他们很好,呼吸着新鲜空气。但是最近,我又一次又一次地问自己,为什么我不能在Controller的Action方法中保持正确的逻辑(尤其是在Web Api中,Action本身就是某种命令/查询处理程序)。 以前,我对此有一个明确的答案:我这样做是为了进行测试,因为很难使用所有这些不可模仿的单例和整体难看的ASP.NET基础结构来测试Controller。但是时代变了,如今,ASP.NET基础结构类对单元测试的友好程度更高(尤其是在ASP.NET Core中)。 这是一个典型的WebApi调用:添加了命令,并通知SignalR客户端有关此命令: public void AddClient(string clientName) { using (var dataContext = new DataContext()) { var client = new Client() { Name = clientName }; dataContext.Clients.Add(client); dataContext.SaveChanges(); GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client); } } 我可以轻松地对其进行单元测试/模拟。而且,借助OWIN,我可以设置本地WebApi和SignalR服务器并进行集成测试(顺便说一下,速度非常快)。 最近,我越来越不愿意创建繁琐的命令/查询处理程序,并且我倾向于将代码保留在Web Api操作中。仅当重复逻辑或逻辑很复杂并且我想隔离它时,我才例外。但是我不确定我在这里做的事是否正确。 在典型的现代ASP.NET应用程序中管理逻辑的最合理方法是什么?什么时候将代码移动到Commands和Queries处理程序是合理的?有没有更好的模式? 更新。我发现这篇关于DDD-lite方法的文章。因此,看来我将代码的复杂部分移至命令/查询处理程序的方法可以称为CQRS-lite。

5
创建编码标准文档
我在一家控制系统公司工作,主要工作是SCADA和PLC以及其他控制系统。 除非决定创建内部项目管理和评估系统,否则软件开发实际上不是公司要做的事情。 这个项目最初是由来这里从事软件工作的人们承担的,我们大多是初级的。 该项目起初很小,所以我们只记录设计,数据库等内容,但我们从未真正同意编码格式/惯例。 我们开始使用StyleCop来确保我们已编写了完整的代码,但是我认为我们需要一个正式的文档来编写编码约定/实践,以便我们可以继续制定一个良好的标准,并且如果将来还有其他重要的开发工作(无论谁在此工作),具有良好的底板。 问题就出在这里,我不知道如何起草编码惯例和标准的文档,我所能想到的只是良好实践与不良实践的例子(例如,在命名变量,避免匈牙利符号等情况下的驼峰案例),我们都是能干足够的程序员(显然),但是我们只是没有关于这类东西的章程。 首先,我的问题是:好的编码标准文档的关键方面和内容是什么?

5
如何知道一个开源项目是否已经成熟到可以在产品中使用?
我想将一些开源项目整合到工作中的产品中。我们没有带宽或主题专业知识来自己做。我是通过在Google中搜索找到的。我没有意识到任何利用这些项目的“主要参与者”,但是我对看到的一切感到非常鼓舞。 现在,我有点担心使用joe-blow的开源项目所面临的风险。如果我花了95%的方法,那么剩下的5%可能很容易添加或修复。也许这是不平凡的。 人们如何确定开放源代码项目是否足够成熟,可以在产品中使用? 这不是一个业余项目,因此稳定性,可维护性等至关重要。

3
MVVM澄清
我们将要编写我们的第一个WPF应用程序,并逐渐熟悉MVVM模式。我们已经构建了许多Winform应用程序,并拥有对我们非常成功的体系结构。我们在转换该架构或确定我们的架构的某些部分适合MVVM模型时遇到了一些麻烦。 从历史上看,我们有一个Gui(主exe),然后它可以与BusinessLogic dll通信。BusinessLogic通过Web服务与DAL dll通信,并且DAL与数据库进行交互。DAL,BusinessLogic和GUI都引用相同的BusinessObjects dll。 向MVVM的某些过渡相当简单。我们的Gui将仍然包含视图,我们的BusinessOjbects将仍然包含模型,而我们的DAL将仍然与数据库交互(尽管实现它们的技术可能会发生变化)。 我们不确定的是我们的BusinessLogic组件。从历史上看,这将提供GUI调用的函数,然后在视图中填充控件(即GetCustomerList,它将返回Customer对象或典型的CRUD函数的列表)。 我们主要遇到的问题是MVVM模式是否需要一个附加组件来容纳ViewModels,还是我们只是改变了思维方式并将用作BusinessLogic组件的内容迁移到ViewModels? 我们的BusinessLogic组件代表ViewModels吗?

7
用C#代码创建HTML的最佳方法是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我相信标记应该保留在标记中,而不是在后面的代码中。 我遇到了一种情况,我认为可以在后面的代码中构建HTML。我想就最佳实践是什么或应该是什么达成共识。 什么时候可以在后面的代码中构建html?什么是创建此html的最佳方法?(示例:字符串,StringBuilder,HTMLWriter等)
15 c#  asp.net  html 

5
DDD,佐贺(Saga)和事件来源:可以将补偿行为简单地删除事件存储区吗?
我意识到上述问题可能会引起一些“什么?”,但让我尝试解释一下: 我试图将一些相关概念,基本上是Saga模式(http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf)与事件源(DDD概念)结合起来:http : //en.wikipedia.org/wiki/Domain-driven_design) 一个很好的文章,将其包装在一起: https //blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/ 我一分钟就会解决这个问题,但是我想我必须先总结一下我对它的理解(这很可能是错误的,所以请纠正这种情况),因为这很可能会影响我为什么提出以下问题: Saga模式是一种代理,它给定操作(最终用户,自动化等,本质上是要更改数据的任何操作),将该操作划分为业务活动,并将这些活动中的每一个作为消息发送给Message Bus,依次将其发送到各个聚合根进行处理。 这些聚集的根可以完全自主地运行(关注点分离得很好,可扩展性强等)。 Saga实例本身不包含任何业务逻辑,该逻辑包含在向其发送活动的聚合根中。Saga中包含的唯一“逻辑”是“过程”逻辑(通常实现为状态机),它根据收到的动作(以及后续事件)确定要做什么(即:发送什么活动) Saga模式实现了一种分布式事务模式。即:当聚合根之一(可以再次自动工作,而又不了解彼此的存在)失败时,可能必须回滚整个操作。 这是通过让所有聚合根实现的,将它们的活动报告完成后返回给Saga。(无论成功还是失败) 如果所有聚合根均返回成功,则内部状态机是否由Saga决定下一步(或决定已完成) 在失败的情况下,Saga将参与最后一个动作的所有聚合根发出一个所谓的补偿动作,即:撤销每个聚合根所做的最后一个动作的动作。 如果操作是“加1票”,则可能只是在进行“减1票”,但可能会更复杂,例如将博客文章还原到以前的版本。 事件源(请参阅结合了这两个博客文章)旨在将保存在外部的每个汇总根源的每个活动的结果保存到集中式事件存储中(在这种情况下,这些更改称为“事件”) 此事件存储区是“事实的单一版本”,可用于简单地通过迭代存储的事件来重播所有实体的状态(本质上类似于事件日志) 将两者结合起来(即:让聚集的根使用事件源来将其更改外包,然后再将其报告回Saga)可以实现很多不错的可能性,其中之一是我的问题... 我觉得我需要把这件事从肩膀上移开,因为一口气要掌握很多。鉴于此上下文/心态(再次,请纠正错误) 问题:当汇总根接收到补偿动作并且如果该汇总根已使用事件源外包将其状态更改外包时,补偿动作不是在所有情况下都只是删除事件存储中针对该事件的最后一个事件给定总根?(假设持久实现允许删除) 这对我来说很有意义(这将是这种组合的另一个很大的好处),但是正如我所说的那样,我可能基于对这些概念的错误/不完全理解而做出这些假设。 我希望这不会太冗长。 谢谢。

5
switch语句-处理无法达到的默认情况
如果我使用switch语句来处理枚举(属于我的班级)中的值,并且每个可能的值都有一个大小写,是否值得添加代码来处理“默认”大小写? enum MyEnum { MyFoo, MyBar, MyBat } MyEnum myEnum = GetMyEnum(); switch (myEnum) { case MyFoo: DoFoo(); break; case MyBar: DoBar(); break; case MyBat: DoBat(); break; default: Log("Unexpected value"); throw new ArgumentException() } 我不认为这是因为永远无法到达此代码(即使使用单元测试也是如此)。我的同事不同意并认为这可以保护我们免受因将新值添加到MyEnum而导致的意外行为。 社区,你怎么说?

7
更换工作系统时敏捷如何工作?
在理想的敏捷世界中,您可以快速构建所需终端系统的一个小而有用的子集,并将其提供给用户。他们很兴奋,因为它很有用,他们开始使用它并提供反馈。然后,您可以计算出要添加的内容,然后进行构建,然后重复进行,直到用完时间。 我最近有几个项目,涉及更换某种工作系统。上面的模型根本不起作用:在您构建了一个包含现有系统几乎所有功能的系统之前,用户完全没有兴趣。他们不会使用它。 当“最小的有用子集”是“全部”时,如何应用敏捷?


2
有人做过CSDP认证吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在寻找一些认证,这些认证可以潜在地增强我作为软件工程师的知识和市场价值。IEEE的认证软件开发专家(CSDP)引起了我的注意。当我在网上寻找任何使用它的用户体验时,我找不到任何实质性的东西。似乎不太受欢迎。我当然没有听说过我的组织或朋友圈中有做过这项工作的人。 我想从社区成员那里了解是否有人进行了此项认证及其经历。认证在知识方面有用吗?它增加了简历的重量(而不是重量!)?
15 engineering  csdp 

7
是从属性错误形式引发异常吗?
我一直都认为属性(即,它们的设置/获取操作)应该快速/立即且无故障。您永远不必尝试/赶上获取或设置属性。 但是我正在研究将某些对象的属性应用基于角色的安全性的一些方法。例如Employee.Salary属性。我尝试过的一些其他解决方案尝试过的解决方案(尤其是此处的AOP示例)涉及到如果访问者没有正确权限的情况下引发异常-但这违反了我的个人规则很长一段时间了。 所以我问:我错了吗?事情变了吗?是否已接受属性应该能够引发异常?
15 .net  exceptions 

7
我应该在班级文件标头中包含什么
我正在寻找有关Entity,Business Logic和Data Access类的信息丰富的类文档格式。 我从这里发现以下两种格式 格式1 ///----------------------------------------------------------------- /// Namespace: <Class Namespace> /// Class: <Class Name> /// Description: <Description> /// Author: <Author> Date: <DateTime> /// Notes: <Notes> /// Revision History: /// Name: Date: Description: ///----------------------------------------------------------------- 格式2 // =============================== // AUTHOR : // CREATE DATE : // PURPOSE : // SPECIAL NOTES: // …

7
如何避免需要对私有方法进行单元测试
我知道您不应该测试私有方法,并且如果您看起来需要测试私有方法,那么那里可能会有一个类在等待发布。 但是,我不想拥有大量的类来测试它们的公共接口,我发现对于许多类来说,如果仅测试公共方法,最终我就不得不模拟很多依赖,而单元测试就是巨大且难以遵循。 我更喜欢在测试公共方法时嘲笑私有方法,而在测试私有方法时嘲笑外部依赖关系。 我疯了吗?

3
扩展整体与扩展微服务
使用微服务的常见论点之一是更好的可伸缩性。但我想知道这种说法是否真的有效。 假设我们有一个包含10个微服务的应用程序,其中9个有两个实例(用于冗余),其中一个有4个实例来处理负载(可伸缩性)。赞成微服务的论点是,您可以独立于其他服务扩展此微服务。 但是,可以说所有10个微服务都是单个整体中的模块,并且已部署了该整体的几个(例如22个,类似于上面的总和)实例。该系统应该能够处理一个关键部分的负载,因为有足够的实例可以执行此操作。如果实例中不需要程序逻辑,唯一的缺点是二进制文件和所需的RAM数量会稍大。但话又说回来,在大多数情况下,差异应该不会太大-至少与堆栈的其余部分相比(与Spring Boot相比)应该没有。可缩放的monlith的优势将是没有(大部分)分布式系统的谬误的更简单的系统。 我想念什么吗?

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.