问题标签 [software-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
project-management - 软件设计实施 - 问题/模块/错误/功能跟踪解决方案
公司正在成长,我们开始实施越来越复杂的软件设计。我觉得需要一些跟踪软件……我只是不知道它是否存在。
我目前维护一个 Google 文档文件夹(由我们的 3 位开发人员共享),每个模块都有一个组织良好的文档。每次对一个或多个模块进行重大升级时,也会创建一个文档。对于所有其他“跟踪”......我们有内部论坛。
我想要以下内容: 我想要立即打印特定项目的所有 Project_01 功能或错误修复,并可选择隐藏或显示在过去 X 天中实施的开发人员评论。
这清楚地表明了一个基于 Web 的系统,开发人员可以在其中输入带有适当标记的问题、错误和功能。条目应该是可评论的、可标记的、注明日期的、可编辑的,并且报告应该基于标签、日期、开发人员、项目等。
我想我会被这里漂浮的头发花白的老兵认为是天真的,尽管我已经经营这家公司 4 年了(所以我一直在附近)。我认为我们没有资源来承担实施 CMMI 之类的开销……但话说回来,我真的不知道什么是最好的。
与我们开始的方式(标记板、Microsoft Word 文档)相比,我个人在每个应用程序模块中使用 Google Docs + 内部 phpbb 论坛进行其他所有事情的发展都相当不错。我只是觉得如果我能够通过出色的按需报告更好地跟踪功能/错误/问题,我可以在很大程度上超越客户的期望。
想法?
更新:使用与 Mantis 集成的 MediaWiki
class-design - 课程设计:Demeter vs. Connection Lifetimes
好的,这是我遇到的一个问题。
我的应用程序中有一些类具有需要数据库连接的方法。我在设计类的两种不同方法之间纠结,这两种方法都以依赖注入为中心:
为调用者在方法调用之前设置的连接提供一个属性。这有一些缺点。
依赖连接属性的每个方法都必须验证该属性以确保它不为空,它是打开的并且不参与事务,如果这会破坏操作。
如果连接属性意外关闭,所有方法都必须(1.)抛出异常或(2.)强制打开。根据您想要的稳健性级别,任何一种情况都是合适的。(请注意,这与传递给方法的连接不同,因为对连接的引用存在于对象的生命周期中,而不仅仅是在方法调用的生命周期中。因此,连接的波动性似乎更高对我来说。)
提供一个
Connection
属性似乎(对我来说,无论如何)为相应的Transaction
属性尖叫。这会在文档中产生额外的开销,因为您必须在使用事务以及何时不使用事务时使其相当明显。
另一方面,微软似乎更喜欢整个集合调用范式。
要求将连接作为参数传递给方法。这有几个优点和缺点:
参数列表自然更大。这对我来说很烦人,主要是在打电话的时候。
虽然连接(和事务)在使用前仍必须经过验证,但对它的引用仅在方法调用期间存在。
然而,呼叫点非常明确。很明显,您必须提供连接,并且该方法不会在您背后自动创建连接。
如果一个方法不需要事务(比如只从数据库中检索数据的方法),则不需要事务。由于方法签名,不乏清晰度。
如果一个方法需要一个事务,由于方法签名,它是非常清楚的。同样,不乏明确性。
因为该类没有公开一个
Connection
或一个Transaction
属性,所以调用者没有机会尝试深入了解它们的属性和方法,从而执行得墨忒耳法则。
我知道,很多。但一方面是微软的方式:提供属性,让调用者设置属性,然后调用方法。这样,您不必创建复杂的构造函数或工厂方法等。另外,避免使用带有很多参数的方法。
然后,一个简单的事实是,如果我在我的对象上公开这两个属性,它们往往会鼓励消费者以邪恶的方式使用它们。(不是说我对此负责,但仍然。)但我只是不想写蹩脚的代码。
如果你在我的鞋子里,你会怎么做?
design-patterns - 我如何编写插件/插件友好的代码?
我想知道如何制作我的代码插件/Priendliy。让我们说:
我有一个程序,在用户界面上会有一个插件部分,其他开发人员可以在其中提供插件。但是我如何设计这样的界面,我的代码可以与其他代码一起使用。我无法想象:(
agile - 预测性与反应性软件设计
我知道,对我来说,我首先开始遵循项目管理的瀑布方法,然后我开始使用预测方法进行软件设计。我的意思是我们有大量的文档、UML、数据库模式、数据字典、工作流、活动图等。
在软件领域工作了 10 多年,现在我发现从响应式方法进行软件设计更加现实。我经常采用 Scrum 方法进行项目管理,并且几乎不会生成繁重的文档。我们的工作流程规范很少(尽管它们仍然有用)。这是一种更加动态的软件创建方法。当然,随着时间的推移,随着时间的推移,随着时间的推移,随着时间的推移,我们会发现我们预先计划好的新功能会发生巨大的变化,随之而来的是频繁的重构。
对我们来说最大的不同是第一种方法花费的时间更长,在软件构建世界中似乎更频繁地失败,并且几乎没有那么灵活。第二种方法提供了更大的灵活性,让我们更快地意识到失败(因此我们可以更快地纠正),并在每次迭代结束时提供某种形式的功能。
从经验中了解双方,我仍然发现很多人喜欢瀑布方法而不是敏捷方法进行软件开发。我不明白。
问题:为什么有人会在所有研究都支持敏捷的情况下使用瀑布而不是某种形式的敏捷?使用瀑布而不是敏捷的有力论据是什么?
c# - .NET 中程序之间的通信
我想分离我的程序的模块以相互通信。它们可以在同一台计算机上,但也可能在不同的计算机上。
我正在考虑两种方法:
- 创建一个包含所有详细信息的类。将其发送到通信层。这个序列化它,发送它,另一端将它反序列化回类,然后进一步处理它。
- 创建一个哈希表(键/值事物)。将所有数据放入其中。将其发送到通信层等
所以它归结为哈希表与类。
如果我认为“松散耦合”,我喜欢哈希表。更新一个模块很容易,在 hastable 中包含新的额外参数,而无需更新另一侧。
然后再次使用一个类,我得到编译时类型检查,而不是运行时。
以前有没有人解决过这个问题并对此有建议?
谢谢!
编辑:我已经给与我原来的问题最相关的答案打了分,尽管它不是最受好评的答案
asp.net-mvc - 视图模型和数据传输对象有什么区别?
我将这个问题基于 Fowler PoEAA。鉴于您对本文的熟悉程度,ASP.NET MVC 中使用的 ViewModel 不与 DTO 相同吗?为什么或者为什么不?谢谢你。
java - Java:使用一个类生成另一个类的对象
我有两节课。SpeciesReader
获取文件并解析它们。Species
存储有关物种的某些数据,这些数据已从文件中解析。
目前,我有一个方法:SpeciesReader.generateSpecies()
,它使用实例化它的文件来创建一个Species
对象。这是不好的做法/设计吗?我是否应该找到一种方法将其移至以Species
文件名作为参数的构造函数?
java - Java:使用一个函数返回几种不同类型的值
我有一个readData()
读取文件的函数,它返回几个不同的解析数据对象。现在,返回类型readData()
为Object[]
:
这感觉很尴尬。有没有更好的方法来返回这些数据?我不想拥有像readGenome()
and这样的单独函数,readSpecies()
因为这需要对文件进行两次迭代。此外,我宁愿将所有数据收集都包含在一个函数中。
一个类似的问题:返回两个字符串之间至少四个字符的匹配的函数:
g0 的左边界是哪里bounds[0][0]
,g0bounds[0][1]
的右边界是哪里,g1 的左边界是哪里bounds[1][0]
,等等。这也让人感觉有点尴尬。如果不不断查找密钥,就很难使用结果进行编码。
model-view-controller - 组件之间的通信(软件设计问题)
我有一个包含以下 UI 组件的应用程序:
- 主菜单
- 文件夹树
- 查询生成器
- 选项卡式列表(每个选项卡都有一个可以显示数据实体的网格)
该应用程序基于 MVC,因此上面列出的每个组件都有一个控制器和一个视图。
前三个组件需要在列表中显示数据实体(作为新选项卡):
- 双击文件夹将在新列表中显示文件夹的项目。
- 单击查询构建器中的搜索按钮时,它将在新选项卡中打开搜索结果。
- 当单击“打开...”菜单项并选择一个文件时,它将打开一个包含文件中项目的新选项卡。
由于可能有很多项目,从数据库加载它们的过程是由网格异步完成的(当您查看网格时,网格正在被填充)。
我的问题是:以下哪一项是“更清洁”的设计?(如果您有更好的解决方案,我将非常感激)
我的第一个解决方案是使用EventAggregator,定义一个“ShowQuery”事件,让列表控制器订阅它,其他控制器会在他们想要显示查询结果时发布它。
另一种解决方案类似于 Unity Container,从其他控制器解析“IListsController”接口,并调用“ShowQuery”方法。
language-agnostic - 在正式软件设计中处理无定形子系统
像 Alexander Stepanov 和 Sean Parent 这样的人投票赞成采用正式和抽象的软件设计方法。
这个想法是将复杂系统分解为有向无环图,并在表示该行为的节点中隐藏循环行为。
Parent 在 boost-con 和 google 上做了演示(来自 boost-con 的表格,第 24 页介绍了这种方法,还有一段google talk 的视频)。
虽然我喜欢这种方法并认为它是一种必要的发展,但我在想象如何处理具有无定形行为的子系统时遇到了问题。
例如,想象一个状态机的通用模式:使用所有状态都支持的接口,并在状态的具体实现中具有不同的行为。
一个人将如何解决这个问题?
请注意,我只是在寻找一种抽象的方法。
我可以考虑将该行为隐藏在节点后面并为状态定义不同的子 DAG,但是如果您想从子 DAG 影响主 DAG 的行为,这会使设计变得相当复杂。