Questions tagged «anti-patterns»

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

13
那么Singletons不好,那又如何呢?
最近,关于使用(和过度使用)Singleton的问题进行了很多讨论。我也是我职业生涯早期的那些人之一。我可以看到问题出在哪里,但是,在许多情况下,我看不到一个很好的选择-而且,很少有反辛格尔顿的讨论真正提供过这样的讨论。 这是我参与的一个近期重大项目的真实示例: 该应用程序是一个胖客户端,具有许多单独的屏幕和组件,它们使用来自服务器状态的大量数据,这些数据并不经常更新。该数据基本上被缓存在Singleton“管理器”对象中-可怕的“全局状态”。想法是在应用程序中拥有一个位置来保存和同步数据,然后打开的任何新屏幕都可以从那里查询它们的大部分需求,而无需从服务器重复请求各种支持数据。不断地向服务器请求会占用太多带宽-我说的是每周要多付数千美元的互联网账单,所以这是不能接受的。 除了基本具有这种全局数据管理器缓存对象之外,还有其他合适的方法吗?当然,此对象不一定要正式是“ Singleton”,但从概念上讲,成为一个对象确实有意义。这里有什么不错的清洁选择?

10
传递参数的(反)模式是否有名称,将仅在调用链的多个级别使用?
我试图在某些旧代码中找到使用全局变量的替代方法。但是这个问题与技术选择无关,我主要关注的是术语。 显而易见的解决方案是将参数传递给函数,而不是使用全局变量。在此传统代码库中,这意味着我必须更改长调用链中最终将使用该值的点与首先接收该参数的函数之间的所有函数。 higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) newParam在我的示例中,where 以前是全局变量,但可能是以前的硬编码值。关键是,现在newParam的值是从获得的,higherlevel()并且必须一直“移动”到level3()。 我在想,如果有一个姓名(或名称)的这种情况下,你需要一个参数添加到许多功能只是“传”未经修改的值/模式。 希望使用正确的术语将使我能够找到有关重新设计解决方案的更多资源,并向同事描述这种情况。

7
魔术弦有什么问题?
作为经验丰富的软件开发人员,我学会了避免使用魔术字符串。 我的问题是,自从我使用它们已经有这么长时间了,我已经忘记了大多数原因。结果,我无法向经验不足的同事们解释为什么它们是一个问题。 有什么客观原因可以避免它们?它们会导致什么问题?

9
作为控制流的例外是否被认为是严重的反模式?如果是这样,为什么?
上世纪90年代后期,我在使用例外作为流控制的代码库中做了很多工作。它实现了一个有限状态机来驱动电话应用程序。最近,我想起那些日子,因为我一直在做MVC Web应用程序。 它们都具有Controllers,该s确定下一个下一步并将数据提供给目标逻辑。来自老式电话域的用户操作(例如DTMF音调)成为操作方法的参数,但是他们没有返回类似a的内容ViewResult,而是抛出了a StateTransitionException。 我认为主要区别在于动作方法是void功能。我不记得我对这个事实所做的所有事情,但是我一直犹豫要记住多少东西,因为自从15年前从事这项工作以来,我再也没有在生产代码中见过任何其他工作。我以为这是一个所谓的反模式迹象。 是这样吗?如果是,为什么? 更新:当我问这个问题时,我已经想到了@MasonWheeler的答案,所以我选择了最能增加我的知识的答案。我认为他也是一个正确的答案。

27
源代码生成是否是反模式?
如果可以生成某些东西,那么那是数据,而不是代码。 鉴于此,对源代码生成的整个想法不是一种误解吗?也就是说,如果有某个东西的代码生成器,那么为什么不将该东西变成一个可以接收所需参数并执行“将要生成的”代码将要执行的正确操作的适当函数呢? 如果这样做是出于性能原因,那么这听起来像是编译器的缺点。 如果要完成两种语言之间的桥梁,那么这听起来像缺少接口库。 我在这里想念什么吗? 我知道代码也是数据。我不明白的是,为什么要生成源代码?为什么不使其成为可以接受参数并对其执行操作的函数呢?

11
与“重新发明轮子”相对的反模式的名称是什么?[关闭]
“ 重塑方向盘 ”反模式非常常见-无需使用现成的解决方案,而是从头开始编写自己的解决方案。代码库不必要地增长,执行相同功能但接口略有不同的接口略有不同,浪费了时间来编写(和调试!)易于使用的功能。我们都知道这一点。 但是在频谱的另一端。如果不编写包含两行代码的函数,而是导入框架/ API /库,实例化,配置,将上下文转换为框架可接受的数据类型,然后调用一个可以完全满足您需要的函数,千兆字节抽象层下的两行业务逻辑。然后,您需要使该库保持最新状态,管理构建依赖关系,使许可证保持同步,并且其实例化代码比“重新发明轮子”要长十倍且更复杂。 原因可能多种多样:无论成本高低,管理层都严格反对“重新发明轮子”,尽管与要求之间存在边际重叠,有人推销他们所钟爱的技术,该系统以前主要模块的作用减弱,或者期望扩展和扩大使用这个框架,它永远不会到来,或者只是误解了“重量”,而一些导入/包含/加载指令却是“幕后”。 这种反模式有通用名称吗? (无论是对还是错,或者它是一个真正的反模式或基于观点的任何内容,我都不会尝试进行讨论,这是一个简单明了的客观术语。) 编辑:建议的“重复项”讨论过度设计自己的代码以使其“为一切准备就绪”,完全与外部系统分开。在某些情况下,它可能源于此,但是通常它源于“厌恶重塑轮子”-不惜一切代价进行代码重用;如果存在解决问题的“现成”解决方案,则无论解决方案的适用性和成本如何,我们都将使用它。原则上赞成创建新的依赖项而不是代码复制,而与创建和维护新代码的成本相比,完全不考虑这些依赖项的集成和维护成本。


30
查看代码时,哪些事情会立即敲响警钟?[关闭]
几周前,我参加了一次软件工艺活动,当时发表的评论之一是“我相信我们在看到错误代码后都会认出错误代码”,每个人都明智地点头,无需进一步讨论。 这种事情总是让我感到担忧,因为有人认为每个人都认为自己是高于平均水平的司机。尽管我认为我可以识别错误的代码,但我还是想了解更多有关其他人认为代码气味的信息,因为很少有人在博客上或仅在少数书籍中对此进行详细讨论。尤其是,我想听到一种语言而不是另一种语言中的代码味道会很有趣。 我将从一个简单的开始: 源代码管理中注释掉代码比例很高的代码 -为什么在其中?是要删除吗?是半成品吗?也许不应该将其注释掉,而只有在有人测试某些东西时才进行注释?就个人而言,我发现这种事情确实很烦人,即使只是到处都是奇数行,但是当您看到大块的代码散布在其余的代码中时,那是完全不可接受的。通常,这也表明该代码的其余部分也可能具有可疑的质量。


14
此反模式的名称?字段作为局部变量[关闭]
在我正在查看的某些代码中,我看到的东西在道德上等同于以下内容: public class Foo { private Bar bar; public MethodA() { bar = new Bar(); bar.A(); bar = null; } public MethodB() { bar = new Bar(); bar.B(); bar = null; } } 从逻辑上讲,该字段bar是局部变量,因为其值永远不会在方法调用之间持久化。但是,由于许多方法都需要类型的对象,因此原始代码作者刚刚创建了一个type字段。FooBarBar 这显然是不好的,对吧? 此反模式有名称吗?

6
EAV-在所有情况下真的不好吗?
我正在考虑对其中一个项目中的某些内容使用实体属性值(EAV)模型,但是在Stack Overflow中有关它的所有问题最终都会导致将EAV称为反模式。 但是我想知道在所有情况下这是否是错误的。 假设商店产品实体具有共同的特征,例如名称,描述,图像和价格,它们在许多地方都参与了逻辑,并且具有(半)独特的特征,例如手表和沙滩球将通过完全不同的方面进行描述。因此,我认为EAV将适合存储那些(半)独特的功能。 所有这些假设是,为了显示产品列表,产品表中有足够的信息(这意味着不涉及EAV),并且仅在显示一个产品/比较最多5个产品/等时。使用通过EAV保存的数据。 我已经在Magento商业中看到了这种方法,并且这种方法非常流行,那么是否存在EAV合理的情况?

8
修改传入参数是否是反模式?[关闭]
我正在用Java编程,并且我总是使转换器像这样: public OtherObject MyObject2OtherObject(MyObject mo){ ... Do the conversion return otherObject; } 在新的工作场所中,模式是: public void MyObject2OtherObject(MyObject mo, OtherObject oo){ ... Do the conversion } 对我来说,这有点臭,因为我习惯于不更改传入的参数。此传入参数更改是反模式吗?它有一些严重的缺点吗?



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

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.