Questions tagged «anti-patterns»

反模式是尽管无效或适得其反却很常见的行为或做法。

4
什么是基于模式的编程?
有人可以解释编程中对模式和反模式的痴迷吗?我问是因为我完全不知道任何模式的含义。面对编程任务时,我会稍微考虑一下该问题,写下一些我认为相关的数据结构,为解决方案提供原型,分离出一些模块并进行迭代。在此过程中,我认为“哦,我这里需要FunkyLookyTastic模式”无处不在。

2
驯服“实用功能”类
在我们的Java代码库中,我不断看到以下模式: /** This is a stateless utility class that groups useful foo-related operations, often with side effects. */ public class FooUtil { public int foo(...) {...} public void bar(...) {...} } /** This class does applied foo-related things. */ class FooSomething { int DoBusinessWithFoo(FooUtil fooUtil, ...) { if (fooUtil.foo(...)) fooUtil.bar(...); …

7
我应该重构主要由一个正则表达式组成的大型函数吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我刚刚编写了一个跨越约100行的函数。听到这个消息,您可能很想告诉我有关单一责任的事,并敦促我进行重构。这也是我的直觉,但这是问题所在:函数做一件事。它执行复杂的字符串操作,并且函数主体主要由一个详细的正则表达式组成,分为许多行,并记录在案。如果我将正则表达式分解为多个功能,我会感觉实际上会失去可读性,因为我正在有效地切换语言,并且无法利用正则表达式提供的某些功能。现在是我的问题: 在使用正则表达式进行字符串操作时,大型函数体是否仍然是反模式?似乎命名捕获组的作用与功能非常相似。顺便说一下,我对通过正则表达式的每个流进行测试。


12
使用条件句是否是反模式?
我在工作中的遗留系统中看到了很多东西-这些功能如下所示: bool todo = false; if(cond1) { ... // lots of code here if(cond2) todo = true; ... // some other code here } if(todo) { ... } 换句话说,功能有两个部分。第一部分进行某种处理(可能包含循环,副作用等),并沿途设置“ todo”标志。仅当已设置“ todo”标志时才执行第二部分。 这似乎是一种非常丑陋的处理方式,而且我认为我花了很多时间去理解的大多数情况都可以重构,以避免使用该标志。但这是一个实际的反模式,一个坏主意还是完全可以接受? 第一个明显的重构是将其分为两种方法。但是,我的问题更多是关于是否有必要(在现代的OO语言中)创建一个局部标志变量,可能将其设置在多个位置,然后在以后使用它来决定是否执行下一个代码块。

12
最佳做法和常识之间的区别?
关于软件开发中的最佳实践1的讨论很多。我已经看到至少有3个主要观点在SE和其他地方引起了很多讨论: 什么是最佳实践,为什么? 可以断言没有最佳实践是“最佳”实践,因此最佳实践甚至在一开始就值得讨论吗? 您什么时候应该放弃最佳做法-或也许是大多数最佳做法-是因为它似乎不适用,还是由于外部限制(时间,金钱等)使权衡取舍变得不切实际? 似乎很少出现的事情,但比以往任何时候都多,这是软件开发中的常识概念。最近的经验再次使这个想法浮现在我的脑海。 我的最初印象是,与最佳实践不同的是讨论,但可能存在交叉授粉。 当我想到一般意义上的常识时,我想到的是您已经掌握或接受的一组规则,这些规则为您提供推理和做出决定的基线。遵循常识是避免您射出整条腿的好方法。但是,除了较低的基准线外,常识可以让人们做出有根据的决定,而当证据看起来足够有说服力时,有根据的决定甚至可以超越常识。我可能对这里的定义有些松懈,但我认为它已经足够接近我的榜样了。 当我想到软件开发中的常识时,我想到了所有基本卫生规则,以防止代码库迅速腐烂成无法理解的混乱。例如,不使用单个全局结构来维护和传递非平凡程序中的状态;不使用只是乱码的变量/方法/类名;这些可能非常类似于我们称之为反模式的东西。在将最佳实践应用于学习模式的实践模拟中,将常识视为学习反模式的实践模拟。 考虑到这一点,我想提出一些问题,看看其他人的回答可能会帮助我确定自己的方式。 其他人是否认为软件开发中存在常识?知道任何一种推理方式都会很感兴趣。 如果是这样,是否值得讨论?我们是否应该像有时采用最佳做法一样努力推动这一工作?是否值得进一步努力? 如果与反模式的类比看起来合理,那么一般规则是,只有在没有其他方法的情况下才使用反模式,甚至只有在非常有限的情况下才使用反模式。允许代码库偏离常识的灵活性应该是多少?答案“根本不是”似乎是不合理的,因为有时权宜之计要求偏离。但是,这似乎是与何时采用“最佳实践”不同的论点。也许不是;如果您不这样认为,我想学习为什么。 这是开放的,也许值得一个后续的问题,您会指出什么样的建议,这似乎是常识呢? 也欢迎其他想法。 1也许我会更好地称它们为“常见重复出现的域模式”,但是“最佳实践”这个名称已经足够普遍,即使每个人都不认同它们是什么,也知道了它们的本质。如果“最佳”部分困扰您,请想象我用不太权威的话语代替了“最佳做法”。

3
全局请求上下文-反模式?
今天我在和我的一位同事谈论Python Web框架以及我们对它们的印象。我告诉他,我认为Flask具有全局请求的气味很难闻,并且是一种反模式。 该文档说关于请求上下文: 相反,在请求处理期间,存在其他一些规则: 当请求处于活动状态时,上下文本地对象(flask.request和其他对象)指向当前请求。 任何代码都可以随时获取这些对象。 我认为我了解此设计决策背后的想法-使应用程序更简单。这只是一个折衷,就像在Thread Locals的情况下: 是的,使用线程本地化通常不是一个好主意。它们给不基于线程概念的服务器造成麻烦,并使大型应用程序难以维护。但是Flask并不是专门为大型应用程序或异步服务器设计的。Flask希望使其能够轻松快捷地编写传统的Web应用程序。 使用当前请求信息修补全局对象是否是反模式? 我相信是这样,因为从静态代码分析器的角度来看,它是一个全局状态,尽管事实并非如此。作为程序员,如果不仔细阅读文档,我将无法理解其工作原理。这对测试有影响。 将请求作为参数传递给视图不是一个好习惯吗?我认为它更具可读性,明确性且易于调试。并避免全局状态。

8
是否根据日期打开和关闭UI(或其他)功能(一种代码气味)?
我们有一个用ASP.NET 2.0编写的糟糕的系统,我们需要向其中添加一些功能。问题在于,某个产品具有UI功能,对于在特定日期(其他时间已关闭)之后启动的业务,必须打开该UI功能,而页面必须与现有业务的外观相同。 我本能地发现基于日期的JavaScript UI开关的想法,而将新老业务的Web控件混合在一起是“不统一的”(因为想要一个更好的词),所以我努力为新业务重写页面)。 使用基于时间的UI的做法是否已被广泛接受,如果没有,采取该措施的已知风险是什么?

3
TDD模拟呼叫验证-是反模式吗?
我已经进行了一年的TDD测试,对此我感觉很好,我喜欢我的测试套件以及所有其他工具。但是,我注意到最近我一直在做很多模拟通话验证。例如,我有一个将注入存储库的服务-在我的单元测试中,我将传递一个存储库的模拟并验证它在我正在测试的方法中被调用。然后,我将检查返回的结果是否正确(在另一个测试中)。这绝对是“感觉”错误,因为我的单元测试现在与实现细节非常相关。我听说您应该测试“行为”,但是在许多情况下……嗯-不可能吗?如果你有一个void例如,您通常会测试副作用。我的意思是继续进行并展示一些简单的代码集很容易就能证明这一点,但是恕我直言,它不能很好地反映我们编写的真实程序。我做错了吗?这种测试是一种反模式吗?感谢您对此的意见,在TDD方面,我还是一个新手。

3
DDD-贫血域模型是反模式吗?我们应该使用富域模型吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 Enes 和Fowler很久以前就批评了贫血症领域模型,因为它显然违反了面向对象的原理等。DDD社区显然与此声明保持一致。 但是,近年来,一直有不同意见的人声称它根本不是反模式,并且它是遵循SOLID原则的一个示例。 我已经使用Spring Framework工作了很多年。每个公司中的每个项目都始终使用服务于贫乏模型(JPA实体)的存储库,其中包含业务逻辑的服务层。此外,大多数样本,甚至包括Spring员工的官方样本,都展示了这种工作方式。 我的问题是:贫血领域模型是否仍被视为反模式?我们所有人都在做关于DDD的事情吗?您是否不认为拥有Rich Domain模型违反了SOLID原则?

7
这是“反模式”吗,我应该停止使用它还是这个聪明的设计?
创建REST服务时,我基本上已经注视着要执行以下操作: 要求HTML 服务返回所需的网页,但没有请求的“资源”,例如。数据 网页包含向同一服务发出AJAX请求的JavaScript(不同的内容类型) 服务然后返回实际数据(JSON),然后页面将其显示 一方面,它似乎效率低下(2个请求),但后来我用了它,“性能无关紧要”,这意味着内部应用程序和网站的低流量运行非常简单且加载速度很快。 我之所以这样做,是因为该网页几乎可以是纯HTML + JavaScript的,几乎不需要服务器端的东西,尤其是不需要循环,就可以创建表和类似的东西(与之相比,我觉得这很丑陋)诸如slickgrid之类的东西),例如数据和视图的分离。 现在,在我开始使用它之前,这是个好主意还是应该停止这样做?

3
是否有正式的反模式来描述这种情况?
编写了一些代码来生成Excel电子表格(Office Interop)。 该代码的性能非常差。 子系统设计为在晚上生成文件。晚上不必担心性能。 创建一个函数以根据一组选定的参数从100个不同的可用文件中选择正确的文件。 由于存在物理文件,因此添加了归档系统来备份这些文件(没有理由存档。这些文件应即时生成)。 该系统不包含配置文件,而是具有硬编码的“服务器选择器”功能,该功能仅在运行代码的服务器上反映。 要支持和运行此服务,计划任务是必需的。 这归结为一个问题。原始代码的性能太差,无法在生产环境中运行。 解决了性能问题后,就不需要子系统和随后的归档系统,“文件选择器工厂功能”,硬编码故障点以及计划任务的维护及其增加的故障点。 如果您愿意,这是“级联失败”。最初的问题导致更多错误代码,更多错误解决方案和不必要的开销。是否有正式的反模式或通用术语来描述它?

7
违反DRY原则
我确信这个反模式在某处有个名字。但是,我对反模式文献还不了解。 请考虑以下情形: or0是类中的成员函数。不管好坏,它在很大程度上取决于类成员变量。程序员A随之出现,并且需要一些功能,例如or0而不是调用or0,程序员A复制并重命名整个类。我猜她不会打电话,or0因为正如我所说,它在很大程度上取决于成员变量的功能。或者,也许她是一个初级程序员,不知道如何从其他代码中调用它。因此,现在我们有了or0和c0(c为副本)。对于这种方法,我不能完全责怪程序员A -我们都在紧迫的期限内完成工作,并且我们乱砍代码以完成工作。 一些程序员or0对此进行了维护,使其成为当前版本orN。 c0现在是版本cN。不幸的是,维护类包含的大多数程序员or0似乎完全不知道-这c0是DRY原则的智慧中我能想到的最有力的论据之一。并且可能还已经独立维护了中的代码c。看来无论哪种方式,or0并c0维持相互独立的。而且,喜悦和幸福是错误的发生,cN而不会发生orN。 所以我有几个问题: 1.)此反模式有名称吗?我经常看到这种情况发生,我很难相信这不是一种命名的反模式。 2.)我可以看到一些替代方法: a。)修复orN一个参数,该参数指定了所需的所有成员变量的值。然后修改cN以调用orN所有传入的所需参数。 b。)尝试手动将修补程序从移植orN到cN。(请记住,我不想这样做,但这是现实的可能性。) c。)再一次复制orN到cN--yuck,但是出于完整性考虑,我列出了它。 d。)尝试找出cN损坏的地方,然后独立于对其进行维修orN。 从长远来看,替代a似乎是最好的解决方案,但我怀疑客户会允许我实施它。从来没有时间或金钱来解决问题,而是总是花费时间和金钱来解决同一问题40或50次,对吗? 有人可以建议我可能没有考虑过的其他方法吗?

1
胶水或管理课程什么时候做得太多?
我倾向于建立集中的类来管理设计中的其他类。它本身并不存储所有内容,但是大多数数据请求将首先发送给“经理”。在寻找这个问题的答案时,我注意到术语“上帝对象”。可以理解,维基百科将其列为反模式。 合法的胶水类或模块之间的界限在哪里,该胶水类或模块从各处传递数据和消息,而该胶粘类或模块做得太多呢?

3
如果反模式
我在此博客上阅读了有关“如果-如果反模式”的信息,但我不确定我是否理解为什么它是反模式。 foreach (string filename in Directory.GetFiles(".")) { if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase)) { return new StreamReader(filename); } } 问题1: 是因为return new StreamReader(filename);里面for loop吗?还是for在这种情况下不需要循环的事实? 正如博客作者所指出的那样,这种方式的疯狂程度较小: if (File.Exists("desktop.ini")) { return new StreamReader("desktop.ini"); } 两者都处于竞争状态,因为如果在创建之前删除文件StreamReader,您将得到一个File­Not­Found­Exception。 问题2: 要修复第二个示例,您是否要在不使用if语句的情况下重新编写它,而是StreamReader使用try-catch块将其包围,并且如果引发了File­Not­Found­Exception您在该catch块中进行相应的处理?

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.