`

关注产品和项目开发中的反模式

阅读更多

 

 设计模式是一个被大家熟知的话题,但是熟悉“反模式”的人就很少了,其实,从字面讲,反模式也就是一些经过惨痛教训总结出来的,被公认为不是很好的方法和行为,请在你的开发实践中,尽量避免出现这样的问题,因为很容易导致失败和错误哦!

 

维基百科对“反模式”的定义如下:

 

在实践中明显出现但又低效或是有待优化的设计模式,是用来解决问题的带有共同性的不良方法。

 

反模式分为如下几类(来自维基百科):

 

 

社会和组织结构

组织结构

  • 分析瘫痪(Analysis paralysis):花费太多精力在项目的分析阶段
  • 摇钱树(cash cow):盈利的老产品通常会导致对新产品的自负
  • 委员会设计(Design by committee):很多人同时进行设计,却没有统一的看法
  • 承诺升级(Escalation of commitment):明知错了还不能收回之前的决定
  • 独裁管理(Management by perkele):用完全听不进异议的独裁作风进行管理
  • 目标管理(Management by objectives):通过数字管理,过于关注非本质而或不易取得的数字指标
  • 道德风险(Moral hazard):不让做决定的人知道他的决定会带来什么结果
  • 蘑菇管理(Mushroom management):不通知或是错误地通知雇员信息。雇员像蘑菇一样在黑暗中吸取养分,自生自灭
  • 烟囱或者发射塔(Stovepipe or Silos):结构上支持数据主要在上下方面的流动,却禁止跨部门的通信
  • 供应商套牢(Vendor lock-in):使一个系统过于依赖外部提供的部件

项目管理

  • 雪崩模型(Avalanche):不合理的混合瀑布模型和敏捷开发
  • 死亡征途(Death march):除了CEO, 每个人都知道这个项目会成为一场灾难,但是真相却被隐瞒下来,以免项目被立即取消。(尽管CEO通常知道并且仍然继续试图最大化利润。)然而,真相被隐藏 起来,直到大限来临 ("Big Bang")。另一种定义:雇员由于不合理的deadline,被迫在深夜和周末加班。
  • 团队思维(Groupthink):在团队思维中,团队成员避免提出在一致观点之外的思维。
  • 过度设计(Overengineering):花费资源完成比实际需要的还要鲁棒和复杂的工程
  • 障眼法(Smoke and mirrors):展示还没实现的功能,就像它们已经实现了一样
  • 软件膨胀(Software bloat):允许系统的后续版本使用更多的资源

分析方式

  • 旁观冷漠(Bystander apathy):一个需求或者设计是错的,注意到这一点的人却不指出,因为这影响的是其他人。

软件工程

软件设计

  • 抽象倒置(Abstraction inversion):不把用户需要的功能直接提供出来,导致他们要用更上层的函数来重复实现
  • 用意不明(Ambiguous viewpoint):给出一个模型(通常是OOAD,面向对象分析与设计)却没有指出用意何在
  • 大泥球(Big ball of mud):没有清晰结构的系统
  • 用数据库进行进程间通信(Database-as-IPC):使用数据库进行进程间通信,而不使用更轻量级的合适的机制。
  • 镀金(Gold plating):在项目达到最高价值后还继续工作。
  • 内部平台效应(Inner-platform effect):系统可自定义的太多,以至于成为一个软件开发平台的蹩脚的复制品。
  • 输入问题(Input kludge):无法确定和实现对异常输入的处理
  • 接口膨胀(Interface bloat):把一个接口做得过于强大以至于极其难以实现
  • 魔力按键(Magic pushbutton):直接在接口的代码里编写实现,而不使用抽象
  • 竞争风险(Race hazard):输出结果受到事件执行顺序和时机的影响,在多线程环境和分布式系统中可能发生
  • 烟囱系统(Stovepipe system):过度聚集数据和功能,忽视了与其他系统和模块的共享

面向对象设计

  • 贫血的域模型(Anemic Domain Model):仅因为每个对象都要有属性和方法,而在使用域模型的时候没有加入非OOP的业务逻辑
  • (BaseBean):继承一个工具类的功能,而不是委托给它
  • 调用父类(Call super):需要子类调用父类被重定义的方法
  • 圆还是椭圆问题(Circle-ellipse problem):基于变量的子类化关系进行子类化
  • 循环依赖(Circular dependency):在对象或软件模块中,直接或间接引入循环依赖。
  • 常量接口(Constant interface):使用接口定义常量
  • 上帝对象(God object):在设计的单一部分(某个类)集中了过多的功能
  • 对象粪池(Object cesspool):复用那些不满足复用条件的对象。对象池是一种管理对象的方法,在重复使用对象前,需要针对对象进行初始化,以避免上次使用后的状态等数据影响下次的使用
  • 不羁的对象(Object orgy):没有成功封装对象,外部可以不受限制地访问它的内部
  • 幽灵(Poltergeists):指这样一些对象,它们唯一的作用就是把信息传给其它对象
  • 顺序耦合(Sequential coupling):指这样一些对象,它们的方法必须要按某种特定顺序调用
  • 悠悠问题(Yo-yo problem):一个结构(例如继承)因为过度碎片化而变得难于理解

编程

  • 偶然复杂度(Accidental complexity):向一个方案中引入不必要的复杂度
  • 远隔作用(Action at distance):意料之外的在系统分离的部分之间交互
  • 盲目信任(Blind faith):缺乏对bugfix的校验或对子函数返回值的正确性检查
  • 船锚(Boat anchor):在系统中保留无用的部分
  • 忙等待(Busy waiting):在等待的时候不断占用CPU,通常是因为采用了重复检查而不是适当的消息机制
  • 缓存失败(Caching failure):错误被修正后忘记把错误标志复位
  • 拜物编程(Cargo cult programming):由于对模式的盲目崇拜,在不理解的情况下就使用模式和方法,企图得到好的结果
  • 靠异常编程(Coding by exception):当有特例被发现时才添加新代码去解决
  • 隐藏错误(Error hiding):在显示给用户之前捕捉到错误信息,要么什么都不显示,要么显示无意义的信息
  • 硬编码(Hard code):将对系统环境的假设写入实现中
  • 熔岩流(Lava flow):保留不想要的(冗余的或是低质量的)代码,仅因为除去这些代码的代价太高或是会带来不可预期的结果
  • 循环-switch序列(Loop-switch sequence):在循环结构中使用switch语句来编写连续步骤
  • 魔幻数字(Magic numbers):在算法里直接使用数字,而不解释含义
  • 魔幻字符串(Magic strings):直接在代码里使用常量字符串,例如用来比较,或是作为事件代码
  • 软代码(Soft code):在配置文件里保存业务逻辑而不是在代码中
  • 面条代码(Spaghetti code):指那些结构上完全不可理解的系统,尤其是因为误用代码结构
  • 霰弹枪手术(Shotgun surgery):开发人员一次性在一个多个实现的代码基中增加功能

方法论

  • 拷贝粘贴编程(Copy and paste programming):拷贝(然后修改)现有的代码而不是构造通用的解决方案
  • 黄金大锤(Golden hammer):认为自己最喜欢的解决方案是到处通用的(见:银弹)
  • 不可能因素(Improbability factor):认为已知的错误不可能发生
  • 不是这里发明的(Not invented here):拒绝使用组织外的主意或方案
  • 这里发明的(invented here):拒绝组织内部实现的创新或解决方案,通常因为对成员没有信心
  • 不成熟的优化(Premature optimization):在编码的早期追求代码的效率,牺牲了好的设计、可维护性、有时甚至是现实世界的效率
  • 转换编程法巧合编程(Programming by permutation or programming by accident):试图通过连续修改代码再看是否工作的方式来解决问题
  • 重新发明方的轮子(Reinventing the square wheel):已经有一个很好的方案了,又再搞一个烂方案来替代它
  • 银弹(Silver bullet):认为自己最喜欢的技术方案能解决一个更大的问题
  • 测试人员驱动开发(Tester driven development):需求来自bug报告的软件工程

配置管理

  • 依赖地狱(Dependency hell):依赖的产品的版本导致的问题
  • DLL地狱(DLL hell):不同版本带来的问题,DLL可见性和多版本问题,在微软的Windows上尤为突出
  • 扩展冲突(Extension conflict):苹果系统在Mac OS X版本之前的不同扩展的问题
  • JAR地狱(JAR hell):JAR文件不同版本或路径带来的问题,通常是由于不懂类加载模型导致的
分享到:
评论

相关推荐

    反模式 危机中软件、架构和项目的重构.pdf

    该文件标题暗示这是一本专注于软件开发中遇到的问题(反模式)和如何在面对危机时对软件、架构和项目进行重构的电子书籍。 反模式是软件工程中的一个概念,它指的是在软件开发中反复出现的不良解决方案。这些解决...

    架构模式-反模式

    在软件开发领域,架构模式和反模式是两个重要的概念,特别是在大型系统的设计和构建中。架构模式是指在特定上下文中经过验证的、可重用的解决方案,它为常见问题提供了有效的设计策略。而反模式则是指实践中被广泛...

    java 反模式 卷4 pdf

    《Java 反模式 卷4》是一本深入探讨Java编程中常见错误做法的书籍,旨在帮助开发者避免在项目中落入这些陷阱,提升代码质量和效率。反模式是指在实践中被证明无效或者低效的设计和实现方式,了解它们可以帮助我们更...

    软件工程中的设计模式与反模式.pptx

    ### 软件工程中的设计模式与反模式 #### 第一章:软件工程概述与设计原则 ...总之,软件工程中的设计模式与反模式对于提升软件质量和开发效率至关重要。通过对这些模式的理解和应用,可以有效地提高软件项目的成功率。

    工程与技术实践-TDD中常见的10大反模式

    ### 工程与技术实践-TDD中常见的...在实践中避免这些反模式可以帮助开发团队更好地利用TDD的优势,提高软件产品的整体质量。值得注意的是,虽然这里列举了一些典型的反模式,但具体情况还需结合项目实际情况灵活处理。

    亮剑ASP.NET项目开发案例导航 ppt

    《亮剑ASP.NET项目开发案例导航》PPT是针对ASP.NET技术在实际项目中的应用进行深入探讨和指导的资料。这份文档旨在帮助开发者理解和掌握ASP.NET的核心概念,并通过丰富的案例来提升开发技能。 首先,ASP.NET是微软...

    android 中常用的开发设计模式

    以上只是部分Android开发中常见的设计模式,通过深入理解和运用这些模式,开发者可以编写出更加高效、可维护的代码,提高项目的整体质量。文件"Java23种设计模式(总结).doc"和"android设计模式.docx"可能包含更详细...

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    反模式的研究关注于软件开发中的负面解决方案,通过揭示不成功系统中存在的反模式,可以在成功系统中避免这些模式的出现,从而有助于降低软件缺陷和项目失败的频率。反模式可以清晰地定义出在软件开发过程中人们经常...

    設計模式与思想s

    本书深入探讨了在软件开发过程中常见的问题模式,通常被称为“反模式”,并提供了实用的策略来识别和克服这些障碍,从而提升项目的成功率。 ### 反模式(AntiPatterns) 反模式是软件工程中一种特殊的概念,指的是...

    C语言项目开发 网络通信编程

    在实际项目开发中,我们还需要关注错误处理、内存管理、数据序列化与反序列化、网络安全(如加密通信)、性能优化等方面的问题。例如,TCP提供了滑动窗口机制来保证数据的可靠传输,但可能会导致拥塞,因此需要理解...

    Android relaceALL替换字符串中的反斜杠

    在这个案例中,我们要关注的是如何替换字符串中的反斜杠字符`\`。 ### 1. `replaceAll`函数介绍 `replaceAll`函数的基本语法是: ```java public String replaceAll(String regex, String replacement) ``` 参数...

    一个反编译出来的项目代码,供初学者学习参考

    在IT行业中,源代码是程序设计的基础,它是由程序员用各种编程语言编写的一系列指令,用于告诉计算机如何执行特定任务。...通过深入研究和实践,你可以提高编程技能,为未来的项目开发打下坚实基础。

    Java Web应用开发模式研究.pdf

    Java Web应用开发模式是利用Java技术进行Web应用程序构建的方法,其在提高系统稳定性和开发效率方面具有显著优势,因此在IT领域备受关注。本文将深入探讨Java Web应用的基本概念、常用开发模式及其工作原理。 首先...

    担保产品设计开发应用.ppt

    《担保产品设计开发应用》这份PPT主要涵盖了担保市场的分析、担保产品的设计原则与理念以及当前重点关注的担保产品类型,特别是对于中小企业集合债券担保的探讨。以下是对这些内容的详细解读: 1. **担保市场的发展...

    ASP.NET企业级项目实战软件开发课件PPT

    在企业级项目中,MVC模式被广泛采用,因为它遵循了分离关注的原则,将业务逻辑、视图呈现和数据模型分离开来。学习ASP.NET MVC,学员需要理解控制器、模型和视图的概念,以及如何通过路由配置、动作方法和视图模板...

    软件项目安全开发规范手册

    ISO9001 是质量管理标准,虽然主要关注产品质量和服务,但也间接涉及了与信息安全相关的方面。 ##### 5.3. 三级等保 三级等保是中国的信息安全等级保护制度中的一个级别,适用于关键基础设施和其他重要信息系统,...

    DevOps“信条”-反模式能否逆袭出圈-QECon深圳站2021年全球软件质量&效能大会.pdf

    敏捷开发模式的反模式通常是指那些与敏捷开发原则相背离的行为或实践。例如,一些团队可能固守传统的需求计划驱动模式,固定变更资源和时间,而不是以价值驱动资源和时间。这种做法可能会导致项目难以适应快速变化的...

    Manning.Microservices.Patterns.2018.10.pdf 微服务架构设计模式(英文版)-有详细的书签目录

    本书不仅涵盖了微服务架构的基本理念,还提供了丰富的案例和实践,帮助读者在实际项目中高效地运用微服务模式。 本书详细地介绍了以下关键知识点: 微服务架构模式: - **应用架构模式**:包括微服务架构和传统...

    房地产项目收购的16种模式及税务风险分析.doc

    16. **拍卖竞标**:通过公开拍卖或定向竞标获得项目,需关注拍卖规则、税费计算和支付方式。 每种模式都有其特定的税务处理方式,企业在选择时应综合考虑法律、财务、市场等多方面因素,制定合理的收购策略,同时...

Global site tag (gtag.js) - Google Analytics