软件工程

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

8
使用一种可以在客户之间变化的方法对类进行正确的设计
我有一个用于处理客户付款的类。除了一个类(用于计算(例如)客户的用户欠款额的)方法外,对于每个客户而言,此类中的一种方法均是相同的。各个客户之间的差异可能很大,并且由于存在许多自定义因素,因此没有简单的方法来捕获诸如属性文件之类的计算逻辑。 我可以编写难看的代码,以根据customerID进行切换: switch(customerID) { case 101: .. do calculations for customer 101 case 102: .. do calculations for customer 102 case 103: .. do calculations for customer 103 etc } 但这需要在我们每次获得新客户时都重新构建班级。有什么更好的方法? [编辑]“重复”的文章完全不同。我不是在问如何避免使用switch语句,而是在寻求最适合这种情况的现代设计-如果我想编写恐龙代码,可以使用switch语句解决。此处提供的示例是通用的,无济于事,因为它们本质上是在说“嘿,在某些情况下,此开关工作得很好,而在另一些情况下,则效果很好。” [编辑]我决定采用排名靠前的答案(为实现标准接口的每个客户创建一个单独的“客户”类),原因如下: 一致性:我可以创建一个接口,以确保所有Customer类都可以接收并返回相同的输出,即使是由其他开发人员创建的 可维护性:所有代码都使用相同的语言(Java)编写,因此无需其他任何人学习单独的编码语言来维护应该是简陋的功能。 重用:如果在代码中出现了类似的问题,我可以重用Customer类来容纳许多方法来实现“自定义”逻辑。 熟悉:我已经知道如何执行此操作,因此我可以快速完成它,然后继续处理其他更紧迫的问题。 缺点: 每个新客户都需要编译新的Customer类,这可能会增加我们编译和部署更改的方式的复杂性。 每个新客户都必须由开发人员添加-支持人员不能只是将逻辑添加到属性文件之类的东西中。这不是理想的选择……但是后来我也不确定支持人员将如何写出必要的业务逻辑,尤其是当它很复杂且有很多例外时(很可能)。 如果我们增加许多新客户,它将无法很好地扩展。这是不期望的,但是如果确实发生了,我们将不得不重新考虑代码的许多其他部分以及这一部分。 对于您感兴趣的人,可以使用Java Reflection按名称调用类: Payment payment = getPaymentFromSomewhere(); try { String …

1
引入其他局部变量作为注释替换
使用其他技术上多余的局部变量来描述正在发生的事情是一种好风格吗? 例如: bool easyUnderstandableIsTrue = (/* rather cryptic boolean expessions */); if(easyUnderstandableIsTrue) { // ... } 当涉及到技术开销时,我希望编译器能够优化此附加功能。但这是否被认为是不必要的代码膨胀?在我看来,它减少了陈旧评论的风险。

5
在嵌入式系统中为单个阵列分配大量堆栈有缺点吗?
我通常可以毫无疑问地确定某些数据是全局的,静态的还是在堆栈上(这里没有动态分配,因此不使用堆)。我也看过几个Q / A如这一个,但我的问题是更具体的,因为它涉及到比较系统内存中的数据,庞大的数额巨大。 我正在尝试改进的现有代码(设计,可能出现的问题,性能等)。该代码在只有4KB RAM的旧8位MCU上运行。在这段代码中,我将使用几乎1KB的数组(是的,在4KB RAM系统上为1KB)。使用此数组的每个字节,这不是问题。问题在于此数组是文件在其中声明的静态数组,因此其生命周期与程序之一相同(即可以视为无限)。 但是,在阅读了代码之后,我才发现该数组不需要无限的生命周期,它是以完全过程性的方式构建和处理的,因此我们应该只能在使用它的函数中声明它,这样,它将在堆栈上,因此我们将节省此1KB RAM。 现在的问题是:这是个好主意吗?从设计的角度来看,如果不需要无限/全局生命周期,则它属于堆栈。但是,嘿,这是4KB中的1KB,这样分配25%的RAM是否没有任何缺点?(可能是堆栈的50%或更多) 有人可以在这种情况下分享经验吗,还是有人在考虑是否有任何合理的理由不将此数组放在堆栈中?我正在寻找技术缺陷以及对设计的评论。 我唯一意识到的是,进入此功能时,我必须确保实际上有1KB的可用堆栈。也许这就是我必须采取的所有措施,也许不是。

1
有可能证明一个函数是幂等的吗?
是否可以使用静态或从属类型来证明函数是幂等的? 我已经搜索了Google以及StackOverflow / StackExchange上的各个地方,但是都没有运气。我找到的最接近的是有关Idris的对话:https ://groups.google.com/forum/#! topic/ idris-lang/ yp7vrspChRg 不幸的是,这种讨论让我有些头疼。
12 haskell 

4
表示依赖注入相反的技术术语?
这更多是术语(技术写作),而不是纯粹的技术问题。我正在尝试围绕我们的应用程序中扩展依赖项注入编写一个重构建议(并将其分配给我自己)。虽然我们确实使用Spring来自动装配Bean,但是仍然存在使用实例化Bean的实例,这些实例MyClass obj = new MyClass(...)可以完全注入。我想使我的建议使用优雅的命名法,并用适当的术语指代DI的设计模式。 “紧密耦合”是否足以作为DI的反义词?

9
为什么实施无符号数字?
我不知道为什么微处理器系统实现无符号数字。我猜代价只是条件分支数的两倍,因为大于等值的.etc需要与带符号的算法不同的算法,还有无符号数对它有很大好处的算法吗? 我的问题部分是为什么它们需要位于指令集中而不是由编译器支持?
12 numbers 

3
单元测试使用DI的类而无需内部测试
我有一个在1个主要班级和2个较小的班级中重构的班级。主要类使用数据库(就像我的许多类一样)并发送电子邮件。因此,主要类别有一个IPersonRepository和一个IEmailRepository注入,后者又将其发送给2个较小的类别。 现在,我想对主类进行单元测试,并且学会了不对类的内部工作进行单元测试,因为我们应该能够在不破坏单元测试的情况下更改内部工作。 但作为类使用IPersonRepository和IEmailRepository,我HAVE指定一些方法为(模拟/虚拟)的结果IPersonRepository。主类基于现有数据计算一些数据并将其返回。如果要测试,我不知道如何在不指定IPersonRepository.GetSavingsByCustomerId返回值x的情况下编写测试。但是,然后我的单元测试“知道”内部工作原理,因为它“知道”了哪些方法可以模拟,哪些方法不可以。 如何在不了解内部原理的情况下测试已注入依赖项的类? 背景: 以我的经验,像这样的许多测试会为存储库创建模拟,然后为模拟提供正确的数据,或者测试执行期间是否调用了特定方法。无论哪种方式,测试都会了解内部信息。 现在,我已经看到了有关理论的演示文稿(我以前已经听说过),即测试不应该知道实现的知识。首先,因为你不是测试如何它的工作原理,而且还因为当你改变现在所有的单元测试失败,因为他们“知道”关于落实执行。尽管我喜欢测试的概念不了解实现的概念,但我不知道如何实现。


2
微服务架构共享域模型
假设我们有一个使用微服务架构的Spring Boot应用程序。每个服务都有其自己的域模型,但是每个服务必须引用一个User域对象。解决该问题的最佳方法是什么?为每个服务仅拥有一个userId会更好,然后在需要时向用户服务询问用户详细信息,或者为所有微服务都拥有一个共享域库会更好吗?

1
将Zoombinis安置在Cajun上尉的渡船上的算法?
我最近一直在玩《Zoombinis的逻辑之旅》的重发行,并尝试实现一些可以解决各种难题的计算机算法。我被卡在如何解决卡琼船长的渡船难题上。 对于那些不熟悉的人,Zoombini是一种具有4种属性的生物:头发,眼睛,鼻子和脚。这些属性中的每一个都有5个可能的值。例如,Zoombini的脚可以是轮子,溜冰鞋,运动鞋,弹簧或螺旋桨。这是Zoombini的例子,头发凌乱,眼镜,鼻子绿色和运动鞋凌乱: 在渡船难题中,任务是在渡船的16个座位上安排16个Zoombinis集合。该布置必须遵守以下规则:任何两个正交相邻的座椅必须由共享至少一个特征的Zoombinis占用。如果两个Zoombinis有不同的发型,不同的眼睛,不同的鼻子,和不同的脚从彼此,他们可能不会坐在旁边给对方。 座位的安排会随着级别的变化而变化;为了具体起见,让我们集中讨论“非常困难”级别,其中16个座位以4×4网格排列。这是合法放置15个Zoombinis的示例,但最终站在码头上的Zoombini不能放在最后一个空座位上,因为她不会与右侧的Zoombini分享任何功能: 有16个!≈21万亿可能的Zoombinis分配给座位。因此,简单地遍历所有可能的任务以查看其是否合法是不现实的。我可以采用哪些启发式方法明智地解决此问题?
12 algorithms 

6
大型JavaScript应用程序应该如何构造?
最近向我展示了一些为OBIEE Mobile App Developer编写的JavaScript插件,以及一些用于各种项目的自定义库。 来自OOP的背景,我对这些项目的结构有些困惑。我看到的文件长数千行。我习惯将事物分解为文件和类,但是我知道这是一个不同的框架 -例如,文件大小是一个问题-但是必须有更好的方法来完成所有这些工作吗? 脚本的长度不仅影响可读性和可维护性,而且还会影响一个人对该程序的工作原理的一般理解。 大型应用程序的结构如何?是否有任何通用的OOP设计模式?

2
测试与规格之间的差异
我现在有一个概念问题,我找不到有关Test(UnitTest等)与Spec(Rspec等)之间的差异的任何信息。 据我所知,规范包含在集成测试中,而测试包含在UnitTest中,仅此而已。 你能解释一下有什么区别吗?

4
重用方法参数是不好的做法吗?
有时,我需要修改从方法本身内部传递到方法中的值。一个示例将在此处清除诸如此类的字符串: void SanitizeName(string Name) { Name = Name.ToUpper(); //now do something here with name } 这是完全无害的,因为该Name参数未通过引用传递。但是,如果由于某种原因,将来开发人员决定让ref传递所有值,则对字符串进行任何清理都会影响方法外部的值,这可能会带来不利的结果。 因此,我总是像这样创建本地副本,而不是重新分配参数本身: void SanitizeName(string Name) { var SanitizedName = Name.ToUpper(); //now do something here with name } 这样可以确保更改传递的值永远不会影响方法外的操作,但是我想知道我是否对此过于偏执。

2
程序如何与设备驱动程序正确通信?
因此,我对程序员作为程序员与计算机上的设备进行通讯的方式感到困惑。现在我不是在谈论大创意。我知道有些设备驱动程序位于硬件之上,以便不同的程序可以使用这些功能。 但是总的来说,谁在和司机说话呢?程序员是否正在编写负责在驱动程序上调用函数的应用程序?还是程序员通过操作系统调用一个函数,然后由该函数处理对驱动程序的调用?
12 hardware  drivers 

3
当依赖项的关键功能被破坏并阻碍开发时该怎么办?
昨天,我在一个Rails 5 API项目上工作,该项目正在使用“ 行为可标记”库来使事物具有标记(例如SE上的问题)。Rails 5目前处于alpha支持状态。当前有一个PR,用于修复等待合并到master中的错误;该错误导致我的功能分支在完成过程中停顿了-由于加载已中断,我无法实现该库的任何功能。 作为快速解决方案,我只是克隆了存储库,用PR所具有的相同代码修复了该问题,然后将我的Gemfile(依赖版本控制文件)指向了我自己的Github分支,直到该错误修复最终合并回master。 我很幸运,修复很简单(并且已经有人完成了此修复程序),因此我能够解决这个问题。但是,如果该库对我的应用程序开发至关重要的话,该怎么办?如果停止我的开发的错误修正对于其他人来说不是一个普遍存在的问题,那么该修正没有像这次一样迅速出现吗? 想象一下,在开发其他依赖功能之前需要先完成此功能 -在这种情况下您会做什么?如果对我来说,标记对接下来的开发工作绝对至关重要,那一切都要依靠它-但对于我的配置来说,标记依赖是错误的呢?当依赖项的关键功能阻碍了一个或多个功能部件的开发时,该怎么办? 而且,当然不能在办公椅上进行数小时或数天的剑战了……

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.