问题标签 [anti-patterns]
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.
java - 避免并行继承层次结构
我有两个并行的继承链:
我的经验是,随着并行继承层次结构的增长,它们可能会成为维护方面的难题。
即不向toXML(), toSoap(), toYAML()
我的主要课程添加方法。
如何在不破坏关注点分离概念的情况下避免并行继承层次结构?
performance - 这种反模式的名称是什么?
你们中的一些人肯定已经处理过这个问题。当程序员对 OO 过于执着而忘记了性能和拥有数据库时,往往会发生这种情况。
例如,假设我们有一个电子邮件表,它们需要由该程序发送。在启动时,它会查找需要发送的任何内容,如下所示:
从不要重复自己的角度来看,这是一件好事,但有时这是不可避免的,应该是:
这个有名字吗?
ruby - “混乱多态”反模式
在相当大的 Ruby 应用程序中,我们遇到给定对象由以下几项标识的情况:例如名称和 ID。这些值类型中的每一个都有不同的用途,因此并不完全等价(id 和 name 在不同的地方保留)。因此,我们最终会在应用程序中传递各种值(id、名称和对象)。这种情况至少在某种程度上似乎是一个问题,因为我们已经被错误所困扰,这些错误涉及不清楚应该将什么类型传递给给定函数。实际上,我记得这些年来在许多应用程序中看到过类似的问题代码,尽管我再也没有给它一个具体的名字。
Ruby 作为一种无类型语言,不像 C++ 那样允许经典的基于类型的多态函数。作为一种解决方法,一位同事经常使用这种代码:
这段代码围绕我们的代码库(不仅仅是初始化程序)的扩散导致了我所说的“混乱多态”。它通常有效,但有时会产生非常令人费解的情况。
我对此有三个问题。
- 有没有正式的名称作为反模式?“混乱的接口?”,“混乱的多态性?” 或者是其他东西?
- 人们认为这有多糟糕?
- 有系统的方法来重构它吗?我们在普通重构中遇到的挑战是,我们创建的许多测试都使用这种松散类型,因此我们必须同时更改测试和实现,因此不会产生普通基于测试的重构的脚手架效应。我认为实际上可以“加强”这种松散的多态性,并将代码抽象为一个函数,而不是立即将其撕掉。但这会是个好主意吗?
c# - C# 属性可以接受多个值吗?
这可能有点反模式,但是 C# 类上的属性是否可以接受多个值?
例如,假设我有一个 Public int 属性,我总是希望它返回一个 int,但我希望能够通过分配小数、整数或其他数据类型来设置属性。所以我的问题是属性是否可以接受多个值?
java - 秘密握手反模式
我刚刚遇到了一个我以前见过的模式,并想得到关于它的意见。有问题的代码涉及这样的接口:
预期的用法是这样的:
其中有一些原因。setText(...) 和 getOccurances(...) 之所以存在,是因为在对数据进行相同的昂贵分析之后,您可能想要执行多个查询,但这可以重构为结果类。
为什么我认为这很糟糕:实现以接口未明确指示的方式存储状态。我还看到过类似的事情,涉及需要调用“prepareResult”,然后是“getResult”的接口。现在,我可以想到使用其中一些功能的精心设计的代码。Hadoop Mapper 接口扩展了 JobConfigurable 和 Closeable,但我看到了很大的不同,因为它是一个使用用户代码实现这些接口的框架,而不是一个可以有多个实现的服务。我认为与包含必须调用的“关闭”方法相关的任何事情都是合理的,因为没有任何其他合理的方法可以做到这一点。在某些情况下,例如 JDBC,这是抽象泄漏的结果,但在我想到的两段代码中,它
我的问题是:
- 每个人都同意这是一个设计不佳的界面吗?
- 这是描述的反模式吗?
- 这种初始化是否属于接口?
- 这对我来说似乎是错误的,因为我偏爱函数式风格和不变性吗?
如果这很常见以至于值得命名,我建议对接口使用“秘密握手”反模式,当接口本身不是有状态的(如集合)时,它会强制您以特定顺序调用多个方法。
php - 您知道哪些特定于 PHP 的反模式?
PHP 作为一种钝器
我听说 PHP 最近经常受到抨击。在相当多的项目中,我看到了疯狂的 php 代码库——太糟糕了,你真的想知道这个人在编写代码时是否服用了致幻药物。有时,我想知道如果最初的开发人员对不做什么有更多的指导,代码会是什么样子。
然而,我也看到了一些组织良好的 PHP 项目,这些项目是 100% OOP 完成的,维护起来很愉快,但它们不是由“php 程序员”编写的。
我给我们所有的初级开发者一个指向Java Anti-Patterns的链接。该页面的优点之一是特定于 Java 的示例,因为 Java 的许多特性会导致常见错误。我希望找到一个类似的 php 列表,但谷歌搜索并没有发现任何有意义的东西。
对于开发人员在编写 PHP 时应该知道的内容,已经存在一些问题,但我想关注负面的。
您在 PHP 中看到哪些应该避免的常见事情,以及以更好的方式做同样事情的常见解决方案是什么?
一些对我来说很明显的例子,我认为会被提及但不是特定于 PHP 的:
- 不要连接 SQL。使用准备语句或适当的转义。
- 不要盲目地将 PHP 嵌入 HTML - 使用模板/MVC。
- 不要盲目地发布未经过滤的原始用户输入 - 清除它以进行 XSS 攻击。
- 不要手动尝试解析所有 POST 和 GET - 使用 Web 框架。
以下是一些我认为 PHP 特定的示例:
- 不要有太多层文件包含/需要链接,并尽量避免条件链接。相反,要有一个合理的命名约定并与您的组织保持一致。
- 除非您能提供帮助,否则不要使用 PHP 的原始数据库 API,而是使用ADODB之类的数据库框架。
- 不要过度使用 PHP 的动态类型,在一个地方将变量设置为字符串,在其他地方设置布尔值,然后期望布尔测试有意义。
那么,你最喜欢的 PHP不做的事情是什么,你是如何做到的呢?
anti-patterns - 混淆实践的通用设计?
您看到混淆人群在设计中使用了哪些常见做法?我发现从事不允许重写的项目很有趣,而这将是解决问题的更快和最有效的解决方案。
java - 高可用性和灾难恢复软件 AntiPatterns
如果您必须在涉及高可用性和灾难恢复时审核 Java 应用程序的最差做法,您可能会寻找硬编码的 IP 地址和绑定句柄的次优缓存。还应该考虑什么?
anti-patterns - 什么是软编码?(反模式)
我发现关于软编码反模式的维基百科条目简洁而令人困惑。那么什么是软编码?在什么设置下是不好的做法(反模式)?此外,什么时候可以认为它是有益的,如果是,应该如何实施?
jsp - 将标签等放在属性文件中是否是一种反模式(与 JSP 和 Web 开发有关)
我看到很多 J2EE 开发人员将标签放在属性文件中,但不使用不同的语言环境。所以,你会得到很多缺失的属性异常。最主要的是它使调试和读取 JSP 页面变得困难。因此,随着时间的推移,您将拥有数千行可能与 JSP 文件一起使用或不使用的属性文件。
对我来说,这似乎是一个糟糕的设计,特别是如果您不打算使用具有不同语言的属性文件并根据区域设置更改为英语或法语。
我只是想知道您是否有同感,是否有 J2EE/JSP 反模式的列表或 URL。