`
sg552
  • 浏览: 620078 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
47437293-94b9-3b04-9152-8971c7580049
白手起家学习使用Flex
浏览量:18709
社区版块
存档分类
最新评论

反面模式一览 (antipattern)

 
阅读更多

注意:  copied from:    http://zh.wikipedia.org/wiki/%E5%8F%8D%E9%9D%A2%E6%A8%A1%E5%BC%8F


已知的反面模式

[编辑 ] 组织结构的反面模式

  • 从天而降的责任 (accidental ownership):雇员们接手了一个与当前系统完全无关的系统,在没有合适的训练、学习或关心下就得维护它(在90年代的电话->网络管理员中很常见)
  • 分析麻痹 (Analysis paralysis):在项目的分析阶段付出的努力太少
  • 引擎室里的船长 (Captain in the engine room):团队带头人把时间和精力全花在技术问题上,没有人开船
  • 摇钱树 (cash cow):盈利的老产品通常会导致对新产品的自满
  • 持续退化 (Continuous obsolescence):不成比例地投入精力把系统移植到新环境下
  • 经费转移 (Cost migration):项目经费转移到弱势的部门或商业伙伴那里
  • 危机模式 (Crisis mode)或救火模式 (firefighting mode):硬是等到火烧屁屁的时候才去解决问题,结果是每个问题都成了危机问题
  • 委员会设计 (Design by committee):很多人同时进行设计,却没有统一的看法
  • 委员会扩张 (Escalation of commitment):明知错了还不能收回之前的决定
  • 英雄模式 (Hero-mode):长期依赖成员的英雄式的努力来满足不可能的任务期限,同时又忽视从一开始就没有注重软件品质带来的损失
  • 我早就说过 (I told you so):某人之前的警告没得到重视,事后又被人发现是正确的,并引起了关注
  • 主观管理 (Management by hope):认为平静的表象就代表一切顺利
  • 通过忽视的管理 (Management by neglect):过多地委任
  • 用数字管理 (Management by numbers):过于关注非本质而又不易取得的数字指标
  • Perkele管理 (Management by perkele):用完全听不进异议的独裁作风进行管理
  • 思考管理 (Management by wondering):希望一个团队定义自己的目标,然后考虑他们要做什么
  • 精神危险 (Moral hazard):不让做决定的人知道他的决定会带来什么结果
  • 蘑菇管理 (Mushroom management):有事也不通知雇员或是错误地通知(像种蘑菇一样放在黑地里施肥)
  • 不是这里发明的 (Not invented here):拒绝使用组织外的主意或方案
  • 精益求精 (Polishing the polish):把已经完成的项目交给下属去做,禁止他们做其它的事,又报怨他们低效率
  • 规模爬行 (另外两个类似的词是复杂度陷阱功能主义者 ):不适当控制项目的规模的增加
  • 烟囱 (Stovepipe):结构上支持数据主要在上下方面的流动,却禁止平行的通信
  • 客户套牢 (Vendor lock-in):使一个系统过于依赖外部提供的部件
  • 小提琴弦组织 (Violin string organization):高度调整和裁减却没有灵活性的组织

[编辑 ] 项目管理的反面模式

  • 死亡征途 (Death march):除了CEO ,每个人都知道这个项目会完蛋。但是真相却被隐瞒下来,直到大限来临
  • 拖后腿的无知 (Heel dragging blindness):项目经理的无知拖了后腿。出于某些动机,员工趋向于减少努力来延长项目时限。例如,他们是按时间(而非结果)付费,又没有能顺利转移过去的后续项目
  • 烟和镜 (Smoke and mirrors):展示还没完成的函数会是怎样
  • 软件膨胀 (Software bloat):允许系统的后续版本使用更多的资源

[编辑 ] 团队管理的反面模式

  • 缺席的经理 (Absentee manager):经理长时间不出现的情况
  • 破釜沉舟 Cage match negotiator:经理用“不惜一切代价也要取胜”的方式来管理
  • 喜怒无常 :某些经理或同事刚才还平易近人,过了一下就变得难于相处
  • 无底洞 (Fruitless hoops):经理在做出决定前要求大量的(通常是无意义的)数据
  • 黄金小孩 (Golden child):依据人情而不是实际的表现,特殊的责任、机会、认可、奖励被给予团队成员
  • 无头苍蝇 (Headless chicken):经理总是处于恐慌中
  • 领导而非经理 (Leader not manager):经理是一个好的领导,却缺乏行政和管理能力
  • 管理克隆 (Managerial cloning):经理对所有人的雇佣和指导的方法都是一样的:像他们的老板
  • 经理而非领导 (Manager not leader):经理能胜任行政和管理职责,却缺乏领导能力
  • 指标滥用 (Metric abuse):恶意或是不适当地使用指标
  • 好好先生 (Mr. nice guy):经理想成为每个人的朋友
  • 鸵鸟 (Ostrich):有些人员整天做些空洞的事情却忽视那些需要在最后期限前被解决的事情还以为会没事,通常更希望看起来很忙,但实际上会浪费和用尽时间
  • 平民英雄 (Proletariat hero):口头上称赞普通员工技术如何如何之牛,实际上管理层只是把他们当成棋子,目的是有借口更多的摊派任务以及增加生产目标
  • 得势的暴发户 (Rising upstart):指这样一些潜在的新星,他们急不可耐地想要爬上去,不愿花费量些必要的时间去学习和成长
  • 海鸥管理 (Seagull management):飞进来,弄得鸡飞狗跳、一片儿狼藉,然后就拍拍屁股走人
  • 懦弱的执行者 (Spineless executive):管理者没有勇气来面对当前形势、来承担责任、或是来保护自己的下属
  • 三个脑袋的骑士 (Three-headed knight):没有决断力的管理者
  • 终极武器 (Ultimate weapon):有些人完全依赖自己的同事或是组织,好像他们自己只是一个导体,把问题全部传给别人
  • 热身状态 (Warm bodies):指有些员工几乎不能达到工作的最低要求,因此不断地从一个项目转到另一个项目,或是从一个团队换到另一个团队。
  • 只会说是的人 (Yes man):指一些管理者当面对CEO说的每句话都说是,CEO不在的情况下他可能说的又是另一回事

[编辑 ] 分析方式的反面模式

  • 尿布说明 (Napkin specification):把给开发团队的功能或技术说明写在尿布上(即是说,不正式,又缺乏细节),和根本就没有说明一样
  • 假需求 (Phony requirements):所有的需求都是通过网络会议或是电话通知给开发团队的,没有任何功能、技术上的说明或其它说明文档
  • 火箭说明 (Retro-specification):在项目已经启动之后才开始写技术、功能说明

[编辑 ] 一般设计上的反模式

  • 抽象倒置 (Abstraction inversion):不把用户需要的功能直接提供出来,导致他们要用更上层的函数来重复实现
  • 用意不明 (Ambiguous viewpoint):给出一个模型(通常是OOAD,面向对象分析与设计)却没有指出用意何在
  • 大泥球 (Big ball of mud):系统的结构不清晰
  • 斑点 (Blob):参考上帝对象 (God object)
  • 气体工厂 (Gas factory):复杂到不必要的设计
  • 输入问题 (Input kludge):无法指出和实现对不正确的输入的处理
  • 接口膨胀 (Interface bloat):把一个接口做得过于强大以至于极其难以实现
  • 魔力按键 (Magic pushbutton):直接在接口的代码里编写实现,而不使用抽象
  • 竞争危机 (Race hazard):无法知道事件在不同顺序下发生时产生的结果
  • 铁轨方案 (Railroaded solution):由于没有预见和在设计方面欠缺灵活性,提出的方案即使很烂,也成了唯一选择
  • 重复耦合 (Re-coupling):不必要的对象依赖
  • 烟囱系统 (Stovepipe system):根本就不能维护的被病态的组合在一起的组件
  • (Staralised schema):指这样的数据库方案,包含了两种用途的表,一是通用的,另一种是有针对性的

[编辑 ] 面向对象设计的反面模式

  • 贫血的域模型 (Anemic Domain Model):仅因为每个对象都要有属性和方法,而在使用域模型的时候没有加入非OOP的业务逻辑
  • (BaseBean):继承一个工具类,而不是代理它
  • 调用父类 (Call super):需要子类调用父类被重载的方法
  • 圆还是椭圆问题 (Circle-ellipse problem):基于变量的子类化关系进行子类化
  • 空子类的错误 (Empty subclass failure):创建不能通过“空子类测试”的类,因为它和直接从它继承而来没有做其它任何修改的子类表现得不同
  • 上帝对象 (God object):在设计的单一部分(某个类)集中了过多的功能
  • 对象粪池 (Object cesspool):复用那些不满足复用条件的对象
  • 不羁的对象 (Object orgy):没有成功封装对象,外部可以不受限制地访问它的内部
  • 幽灵 (Poltergeists):指这样一些对象,它们唯一的作用就是把信息传给其它对象
  • 顺序耦合 (Sequential coupling):指这样一些对象,它们的方法必须要按某种特定顺序调用
  • 单例爱好者 (Singletonitis):滥用单例(singleton)模式
  • 又TMD来一层(Yet Another Fucking Layer):向程序中添加不必要的层次结构、库或是框架。自从第一本关于编程的模式的书出来之后这就变得很普遍。
  • 唷唷问题 (Yo-yo problem):一个结构(例如继承)因为过度分裂而变得难于理解

[编辑 ] 编程上的反模式

  • 意外的复杂度 (Accidental complexity):向一个方案中引入不必要的复杂度
  • 积累再开火 (Accumulate and fire):通过一系列全局变量设置函数的参数
  • 在远处行动 (Action at distance):意料之外的在系统分离的部分之间迭代
  • 盲目信任 (Blind faith):缺乏对bugfix或子函数返回值的正确性检查
  • 船锚 (Boat anchor):在系统中保留无用的部分
  • bug磁铁 (Bug magnet):指很少被调用以至于最容易引起错误的代码,或是易出错的构造或实践
  • 忙循环 (Busy spin):在等待的时候不断占用CPU,通常是因为采用了重复检查而不是适当的消息机制
  • 缓存失败 (Caching failure):错误被修正后忘记把错误标志复位
  • 货运崇拜编程 (Cargo cult programming):在不理解的情况下就使用模式和方法
  • 检查类型而不是接口 (Checking type instead of interface):仅是需要接口符合条件的情况下却检查对象是否为某个特定类型。可能导致空子类失败
  • 代码动力 (Code momentum):过于限制系统的一些部分,因为在其它部分反复对这部分的内容做出假设
  • 靠异常编程 (Coding by exception):当有特例被发现时才添加新代码去解决
  • 隐藏错误 (Error hiding):在显示给用户之前捕捉到错误信息,要么什么都不显示,要么显示无意义的信息
  • 异常处理 (Expection handling):使用编程语言的错误处理系统实现平常的编程逻辑
  • 寫死 (Hard code):在实现过程中对系统环境作假设
  • 熔岩流 (Lava flow):保留不想要的(冗余的或是低质量的)代码,仅因为除去这些代码的代价太高或是会带来不可预期的结果
  • loop-switch序列 (Loop-switch sequence)使用循环结构来编写连续步骤而不是switch语句
  • 魔幻数字 (Magic numbers):在算法里直接使用数字,而不解释含义
  • 魔幻字符串 (Magic strings):直接在代码里使用常量字符串,例如用来比较,或是作为事件代码
  • 猴子工作 (Monkey work):指在一些代码复用 性或设计上很差的项目中的反复出现的支持性的代码。通常会被避免或是匆忙完成,因此易于出错,有可能会很快变为bug磁铁。
  • 守财奴:由于长时间不及时释放动态分配的内存而消耗了过量的内存
  • 类似保护 (Parallel protectionism):随着代码变得复杂和脆弱,很容易就克隆出一个类似的的结构,而不是直接往现有的结构中添加一些琐碎的属性
  • 巧合编程 (Programming by accident):尝试用试验或是出错的方式解决问题,有时是因为很烂的文档或是一开始就没把东西搞清楚
  • 馄饨代码 (Ravioli code):系统中有许多对象都是松散连接的
  • 软代码 (Soft code):在配置文件里保存业务逻辑而不是在代码中
  • 面条代码 (Spaghetti code):指那些结构上完全不可理解的系统,尤其是因为误用代码结构
  • 棉花里放羊毛 (Wrapping wool in cottom):常见的情况是某些类的方法只有一行,就是调用框架的代码,而没有任何其它有用的抽象

[编辑 ] 方法学上的反面模式

  • 拷贝粘贴编程 (Copy and paste programming):拷贝(然后修改)现有的代码而不是构造通用的解决方案
  • 拆除 (De-factoring):去掉功能,把它转化成文档的过程
  • 黄金大锤 (Golden hammer):认为自己最喜欢的解决方案是到处通用的(见:银弹)
  • 未必有之事 (Improbability factor):认为已知的错误不会出现
  • 低处的果子 (Low hanging fruit):先处理更容易的问题而忽略更大更复杂的问题。这个问题有些类似于这种情况:科学、哲学和技术上的发现在早期都比较容易得到,一旦问题已经被人研究过了,再要有所创新就难了
  • 不是这里做的 (Not built here):见“重新发明轮子”、“不是这里发明的”
  • 不成熟的优化 (Premature optimization):在编码的早期追求代码的效率,牺牲了好的设计、可维护性、有时甚至是现实世界的效率
  • 转换编程法 (Programming by permutation):试图通过连续修改代码再看是否工作的方式来解决问题
  • 重新发明方的轮子 (Reinventing the square wheel):已经有一个很好的方案了,又再搞一个烂方案来替代它
  • 重新发明轮子 (Reinventing the wheel):无法采纳现有的成熟的方案
  • 银弹 (Silver bullet):认为自己最喜欢的技术方案能解决一个更大的问题
  • 测试人员驱动开发 (Tester driven development):软件工程的需求来自bug报告

[编辑 ] 测试反面模式

  • 敌意测试 (hostile testing):对抗实际的开发方案,使用过量的测试
  • 自身测试 (Meta-testing):过度设计测试过程以至于它本身都需要测试,也被称为“看门人的看门人”
  • 移动标的 (Moving target):连续修改设计和实现从而逃避现有的测试过程
  • 奴隶测试 (Slave testing):通过发匿名电邮或贿赂的方式控制测试人员,从而达到股东的要求

[编辑 ] 配置管理反面模式

  • 依赖的地狱 (Dependency hell):需要的产品的版本导致的问题
  • 路径地狱 (Classpath hell):和特定库有关的问题,例如依赖关系和要满足程序运行所需的版本
  • 扩展冲突 (Extension conflict):苹果系统在Mac OS X版本之前的不同扩展的问题
  • DLL地狱 (DLL hell):不同版本带来的问题,DLL可见性和多版本问题,在微软的Windows上尤为突出
  • JAR地狱 (JAR hell):JAR文件不同版本或路径带来的问题,通常是由于不懂类加载模型导致的

 

[编辑 ] 参考文献

  1. ^ Budgen, D.. Software design . Harlow, Eng.: Addison-Wesley. 2003:  pp. 225. ISBN  0-201-72219-4 . "As described in Long (2001), design anti-patterns are 'obvious, but wrong, solutions to recurring problems'."
  2. ^ Ambler, Scott W.. Process patterns: building large-scale systems using object technology . Cambridge, UK: Cambridge University Press. 1998:  pp. 4. ISBN  0-521-64568-9 . "...common approaches to solving recurring problems that prove to be ineffective. These approaches are called antipatterns."
  3. ^ Koenig, Andrew. Patterns and Antipatterns. Journal of Object-Oriented Programming. March/April 1995, 8, (1): 46-48 [2008-04-11] .
  4. ^ Rising, Linda. The patterns handbook: techniques, strategies, and applications . Cambridge, U.K.: Cambridge University Press. 1998:  pp.387. ISBN  0-521-64818-1 .
  • Perl設計模式 – 一部開放的線上書籍。
  • Brown, William J.; Raphael C. Malveau, Hays W. McCormick III, 和 Thomas J. Mowbray. 反模式:软件重构、架构及项目危机. John Wiley & Sons. 1998. ISBN 0-471-19713-0 .
  • Laplante, Phillip A.; and Colin J. Neill. Antipatterns: Identification, Refactoring and Management. Auerbach Publications. 2005. ISBN 0-8493-2994-9 .
分享到:
评论

相关推荐

    Antipatterns 英文版 (pdf)

    本书不仅提供了一种识别这些问题模式的方法,还深入探讨了如何对这些模式进行重构以及如何有效地进行项目管理。以下是本书中涉及的一些关键概念和技术: 1. **Antipatterns(反模式)**:在软件工程领域,指那些在...

    Antipattern based Use Case Refactorings-开源

    "Antipattern"文件或文件夹很显然是针对反模式的研究和定义,其中可能包含了各种常见的用例反模式的描述,以及如何使用ATL来识别和解决这些反模式的具体方法。 总的来说,"Antipattern based Use Case Refactorings...

    rest-api-antipattern-inspector:Node.js + TypeScript程序,用于检测API中的REST反模式

    REST API反模式检查器这是一个用于检测API中的REST设计反模式的程序。指示开始吧要运行此程序,需要安装Node.js版本10.0.0(或更高版本)。 使用以下命令安装依赖项: npm i 可以运行REST设计反模式检测功能正确性的...

    antipattern-writer

    反模式 概述 我遇到了一个小巧的代码段,它将代码整齐地发送到Graphite服务器。 需要注意的是,该代码不容易测试。 看看uk.co.lindgrens.antipattern.MyGraphiteMessageSender ,看看您的想法。 重构尝试1(tddstyle...

    testing_with_jest_enzyme:J使用Jest和酶测试React应用程序时常用的模式:joker:

    (我通常以组件名称来命名测试,以便于理解) 反模式可以在antipattern.test.js以及pattern.test.js旁边找到antipattern.test.js pattern.test.js 。 贡献者当使用jest和enzyme测试React代码时,发送带有您发现有趣...

    黑马程序员49期java源码-all-antipattern-demystified-blog:全反模式揭秘博客

    java源码揭开所有反模式的神秘面纱 架构师是在大多数关键技术方面拥有丰富经验的抽象主义者。 我删除了重复项并使用备用名称再次对它们进行分类。 可能其中一些在,但别担心,我们稍后会调查它们。 建筑师反模式。 1...

    SPARSE- Antipattern detection system-开源

    **SPARSE:开源的反模式检测系统** SPARSE(Symptom-based Anti-pattern REtrieval based on Semantic Web Technologies)是一个创新的开源项目,旨在利用语义Web技术进行基于症状的反模式检索。反模式,通常在软件...

    Python库 | antipattern_mitigation-0.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:antipattern_mitigation-0.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Java术语表[借鉴].pdf

    3. **反模式(Antipattern)**:在软件开发中,反模式是被广泛接受但效果不佳的解决方案,可能会导致问题或降低代码质量。 4. **匿名类(Anonymous Class)**:没有名称的类,通常用于实现接口或继承其他类,并且只...

    tfc:[Antipattern-WTF]利用git提供TFS签出签到

    TFC Team Foundation Server自动检出可执行文件 根据git status命令输出自动检出TF文件。 如何使用 安装: npm i -g @wufe/tfc 使用: tfc -m "Comment" 要求 必须安装tf客户端。 该文件夹必须具有已初始化的git...

    java 术语 a-z

    5. **反模式 (antipattern)**:在软件开发中,指的是那些常见但效率低下或可能导致问题的实践。 6. **受检异常 (checked exception)**:在编译时必须处理的异常,例如IOException。如果方法可能抛出受检异常,那么...

    Manning - Bitter EJB @2003.pdf

    此外,书中还提出了几个反模式(Antipattern),例如“The Golden Hammer”和“A Sledgehammer for a Fly”,这些反模式突显了开发者在不适当的情况下过度依赖EJB技术,导致项目复杂度和成本的无谓增加。 #### 案例...

    ScrumAntipatternCards:ScrumAntipatternCards

    什么是Scrum Antipattern卡? 您是否曾经关注Scrum并时不时犯同样的错误? 它们是可识别的模式。 可以教他们,但是您必须对自己的说话方式保持警惕。这个怎么运作? 告诉某人做错了事可能是有害的。 如果让她/她理解...

    Bitter Java

    - **Antipattern:** An antipattern is a common response to a recurring problem that is usually ineffective and risks producing bad outcomes. The book seems to focus on identifying these antipatterns ...

    31天重构速成

    Remove Arrowhead Antipattern 箭头抗模式(Arrowhead)是指在一个类中过度依赖另一个类的情况。重构时,应该尽可能减少这种依赖,提高代码的解耦性。 #### 23. Introduce Design By Contract checks 通过在代码中...

    31天代码重构速成 你必须知道的重构技巧

    Remove Arrowhead Antipattern (去除箭头反模式) - **定义**:识别并去除箭头反模式。 - **目的**:提高代码的可读性和可维护性。 - **适用场景**:当发现代码中出现箭头反模式时,应考虑去除。 ##### 25. ...

Global site tag (gtag.js) - Google Analytics