Questions tagged «patterns-and-practices»

软件工程中的设计模式(针对常见问题的可重复解决方案)和最佳实践

11
“神话人月”的“手术团队”模式发生了什么?
几年前,当我读《神话人月》时,我发现了很多我已经从其他来源知道的东西。但是,尽管那本书是1975年的,但那里还是有新事物。其中之一是: 手术团队 Mills建议将大型工作的每个部分都安排到一个团队中,但该团队的组织应像外科手术团队一样,而不是生猪屠宰团队。就是说,不是每个成员都去解决问题,而是一个人去削减,其他人给他提供一切支持,这将提高他的效率和生产力。 对于组织软件开发团队来说,这是一个非常有趣的模式,但是我从未在任何其他软件工程书中找到它,甚至在任何地方都没有提及。 这是为什么? 当时的“手术团队”是否还很特别? 还是尝试过并失败了? 如果是这样,它是怎么失败的? 如果不是,为什么我们今天的软件项目中看不到这种模式呢?

13
输入在技术上有效但不满意时,异常与空结果集
我正在开发要公开发布的库。它包含用于对对象集进行操作的各种方法-生成,检查,分区并将这些集投影到新形式。如果相关,它是一个C#类库,其中包含LINQ样式的扩展IEnumerable,将作为NuGet软件包发布。 该库中的某些方法可能会被赋予无法满足的输入参数。例如,在组合方法中,存在一种生成可以从m个项目的源集合构造的n个项目的所有集合的方法。例如,给定集合: 1,2,3,4,5 并要求2的组合将产生: 1,2 1,3 1,4 等... 5,3 5,4 现在,显然可以要求做一些无法完成的事情,例如给它提供3个项目的集合,然后要求4个项目的组合,同时设置说只能使用每个项目一次的选项。 在这种情况下,每个参数都是单独有效的: 源集合不为null,并且包含项 要求的组合大小为正非零整数 请求的模式(仅使用每个项目一次)是有效选择 但是,将这些参数的状态放在一起时会引起问题。 在这种情况下,您是否希望该方法引发异常(例如InvalidOperationException)或返回空集合?在我看来,任何一种都有效: 如果只允许每个项目使用一次,则不能从m个项目的集合(其中n> m个)中产生n个项目的组合,因此该操作被认为是不可能的。InvalidOperationException 当n> m时可以从m个项目中生成的大小为n的组合的集合为空集;无法产生任何组合。 空集的参数 我首先担心的是,当您处理大小可能未知的数据集时,异常会阻止惯用的LINQ样式方法链接。换句话说,您可能想要执行以下操作: var result = someInputSet .CombinationsOf(4, CombinationsGenerationMode.Distinct) .Select(combo => /* do some operation to a combination */) .ToList(); 如果您的输入集大小可变,则此代码的行为是不可预测的。如果少于4个元素.CombinationsOf()时引发异常someInputSet,则此代码有时会在运行时失败,而无需进行一些预检查。在上面的示例中,此检查是微不足道的,但是如果您在较长的LINQ链中途调用它,则可能会变得乏味。如果它返回一个空集,result则将为空,您可能会很满意。 例外的论点 我的第二个担心是,返回一个空集可能会隐藏问题-如果您在LINQ链的中途调用此方法,并且它悄悄地返回一个空集,那么稍后可能会遇到问题,或者发现自己为空结果集,鉴于您肯定在输入集中有某些内容,这种情况的发生可能并不明显。 您会期望什么,您对此有何看法?

6
强制执行单元测试的执行命令是不好的做法吗?
我正在为一个包含多个子模块的项目编写测试。我编写的每个测试用例彼此独立运行,并且清除测试之间的所有数据。 尽管测试是独立运行的,但由于某些情况需要多个子模块,因此我正在考虑执行执行顺序。例如,一个子模块正在生成数据,而另一个正在对数据运行查询。如果生成数据的子模块包含错误,则即使子模块本身工作正常,查询子模块的测试也将失败。 我无法使用虚拟数据,因为我正在测试的主要功能是与黑匣子远程服务器的连接,该服务器仅从第一个子模块获取数据。 在这种情况下,可以强制执行测试的执行顺序还是不好的做法?我感觉此设置中有异味,但找不到更好的方法。 编辑:问题来自于如何构建测试,其中一个测试是另一测试的设置?因为“先前”测试不是设置,而是测试执行设置的代码。

2
是否有实际上适用于Java的OO原理?
Javascript是一种基于原型的面向对象语言,但是可以通过以下多种方式变为基于类的语言: 自己编写要用作类的函数 在框架中使用漂亮的类系统(例如mootools Class.Class) 从Coffeescript生成 一开始,我倾向于使用Javascript编写基于类的代码,并高度依赖它。但是最近我一直在使用Javascript框架和NodeJS,它们脱离了类的概念,而更多地依赖于代码的动态特性,例如: 异步编程,使用和编写使用回调/事件的编写代码 使用RequireJS加载模块(以便它们不会泄漏到全局名称空间) 功能编程概念,例如列表推导(映射,过滤器等) 除其他事项外 到目前为止,我所收集的是,我已阅读的大多数OO原理和模式(例如SOLID和GoF模式)都是为基于类的OO语言(例如Smalltalk和C ++)编写的。但是其中有哪些适用于基于原型的语言(例如Javascript)? 是否有特定于Java的原则或模式?避免回调地狱,邪恶的eval或任何其他反模式的原则。

4
开发一项功能的唯一目的是将其删除?[关闭]
各个贡献者(程序员/设计人员)仅出于一种目的而开发工件的模式的名称是用作转移,以便管理层可以在最终产品中删除该功能? 这是我从曾经在一家大型游戏开发公司工作的前同事那里听到的民间传说。在该公司,众所周知,中层管理人员被迫向产品“投入”并“做出更改”,否则他们就有被视为对项目没有贡献的风险。由于这些多余的“管理输入”,这种情况已延迟了许多项目。 在上述公司的一个项目中,艺术家和开发人员创建了一个多余的动画角色,该角色出现在每个过场动画中,并且像拇指一样伸出来。他们设计的方式是可以在游戏发售之前轻松将其删除(当时游戏仍然是通过实体媒体而非可下载的产品出售的)。显然,管理层随后投票决定删除动画。从积极的方面来看,管理层并未进行任何不必要的变更,因为这些变更表明他们为产品提供了建设性的投入,这些变更会延迟项目。 在公司工作的游戏程序员中,这个过程模式有一个名字,但是我忘记了实际的名字。我相信这是duck- 东西。任何人都可以帮助指出名称,以及有关模式如何发展的可靠参考。

4
何时以及出于什么目的在C中将const关键字用于变量?
在这里审核我的代码时,const出现了使用关键字的问题。我了解它用于对变量执行只读行为。 我对它可能有用时的各种情况感到困惑。 是否应该在功能原型中为了清楚起见使用它? 在代码开发期间是否应将其用作安全措施? 是否应该在各种函数的范围内使用它们来声明运行时常量? 应该完全使用吗? 这些问题仅仅是我所面临的困惑的例子。一般的困惑是 什么时候const在C编程中使用关键字? 在C语言中使用此关键字可以获得哪些好处? 使用const关键字有什么弊端吗? 有人指出,由于所有这些问题,在我的问题的细节中,这个问题可能太广泛了。我只是想澄清这些问题只是为了澄清对主要问题的困惑。 何时以及出于什么目的在C中将const关键字用于变量? 也可以改写为 const在C`中正确使用关键字具有相同的优缺点。

8
术语(或“模式”?)是“如果还没有做的话就做”
听起来很基本,我知道,但是最近我有一位同事告诉我,这种方法startHttpServer太复杂了,难以理解,因为它只会在服务器尚未运行时启动服务器。当我回答“严重吗?我已经这样做数十年了-这是编程中的常见模式”时,我发现自己很麻烦。我经常不愿意承认他带回来的一些有据可查的证据表明,整个编程社区都在支持他的观点,而我最终感到很讨厌。 问题:如果所需的措施已经生效,则在无操作方法的概念背后是否存在文档化的设计模式?或者,如果不是模式,它是否也有名称?如果不是,是否有任何理由认为考虑以这种方式编写方法太复杂了?

5
“基于配置的约定”是否违反基本的编程原则?
我查看了WPF MVVM框架Caliburn.Micro,并阅读到很多标准内容都基于命名约定。 例如,将视图中的属性自动绑定到视图模型中的属性。尽管这似乎很方便(删除了一些样板代码),但是我的第一个本能反应是,对于将要读取此代码的新程序员而言,这并不完全明显。换句话说,应用程序的功能并不能完全由其自己的代码来解释,而不能由框架的文档来完全解释。 编辑: 因此,这种方法称为约定优于配置。由于找不到与此相关的任何问题,因此我更改了问题: 我的问题是: 约定优于配置是简化事情的正确方法,还是违反了某些编程原则(如果是,则违反了哪些编程原则)?

11
错误变量是反模式还是好的设计?
为了处理不应停止执行的几种可能的错误,我有一个error变量,客户端可以检查并使用该变量引发异常。这是反模式吗?有没有更好的方法来解决这个问题?有关此操作的示例,您可以查看PHP的mysqli API。假定正确处理了可见性问题(访问器,公共和私有范围,是类中的变量还是全局变量?)。

6
初始化孩子对其父母的引用的最佳方法是什么?
我正在开发一个对象模型,它具有许多不同的父/子类。每个子对象都有对其父对象的引用。我可以想到(并且已经尝试过)几种初始化父引用的方法,但是我发现每种方法都有明显的缺点。给定以下所述的方法,哪一种是最好的,哪一种是更好的。 我不会确保下面的代码可以编译,因此如果代码在语法上不正确,请尝试查看我的意图。 请注意,尽管我并不总是显示任何参数,但我的一些子类构造函数确实会接受参数(而不是父参数)。 调用方负责设置父级并添加到同一父级。 class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List<Child> _children = new List<Child>(); public List<Child> Children { get {return _children;} } } 缺点:为消费者设置父级过程分为两个步骤。 var child = new …

5
创建另一个类的ClassCollection是一个好习惯吗?
可以说我有一Car堂课: public class Car { public string Engine { get; set; } public string Seat { get; set; } public string Tires { get; set; } } 可以说,我们正在建立一个有关停车场的系统,我将使用很多Car类,因此我们建立了一个CarCollection类,它可能有一些类似的方法FindCarByModel: public class CarCollection { public List<Car> Cars { get; set; } public Car FindCarByModel(string model) { // code here return new Car(); …


3
如何在公共API中表示(枚举)类型
我正在开发一个简单的API,我想将其用于自己的客户端,并在将来向公众开放。我有可以具有不同“类型”的“项目”对象。目前,该类型是C“ typedef枚举”: typedef enum { ItemTypeBool, ItemTypeNumber, ItemTypeDate, } ItemType; (我将来可能会添加一些) 我想知道我是否应该将其转换为整数或定义的“字符串”。JSON为: 对于整数: { "name": "The name", "type": 0, ... } 对于字符串: { "name": "The name" "type": "boolean" ... } 我想知道是否有最佳实践。保留整数将稍微简化代码并减少带宽,但是字符串对于开发人员来说更容易记住。我记得我在一个项目上工作,我必须记住1 =图像,2 =音频,3 = html等。。。这没有任何实际意义。 所以我问你,如果你知道我应该考虑的其他方面。


12
哪种设计模式定义最差或定义最窄?[关闭]
对于每个编程项目,都有过编程经验的管理人员会在为您的项目推荐一些设计模式时大放异彩。当设计模式有意义或您需要可扩展的解决方案时,我喜欢它们。例如,我以积极的方式使用了代理,观察员和命令模式,并且每天都这样做。但是,如果只有一种创建对象的方法,我真的很犹豫地说出Factory模式,因为工厂将来可能会使一切变得更容易,但是却使代码复杂且纯属开销。 因此,我的问题是关于我的未来职业以及我对经理类型的回答,这些类型周围会出现随机的模式名称: 您使用了哪些设计模式,这使您整体退缩?哪些是最糟糕的设计模式,除了在一种有意义的单一情况下,您应该考虑哪些(请阅读:哪些设计模式定义非常狭窄)?(这就像我在寻找对亚马逊整体产品的负面评价,以了解使用设计模式的人最讨厌的东西。)而且我在这里不是在谈论反模式,而是通常被认为是“好的”模式。 编辑:正如一些回答所言,问题通常是模式不是“不良”而是“使用错误”。如果您知道一些经常被滥用甚至难以使用的模式,那么它们也可以作为答案。

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.