我们看过许许多设计模式的理论,实际工作过程中也或多或少的使用过设计模式,不同类型设计模式适用于不同的应用场合,但如果设计模式使用不当,不但无法帮助产品提升,反而会导致日后的重蹈覆辙。因此,我们有必要了解在日常工作中经常错误使用模式的场合,通常将这些内容称之为反面模式(anti-pattern)。
反模式(anti-pattern)是指在实践中经常出现,会导致效率低下的有待优化的设计模式。反面模式的类型多种多样,其中包含项目管理、团队管理、分析方式、编程、方法学、测试、配置管理等多个方面,今天主要介绍面向对象设计过程中常见反面模式:
1.基类(BaseBean):继承一个工具类,而不是代理它
这种对象设计错误在开发过程中是非常常见的,通常造成这种设计错误是为了使用方便,继承一个工具类,可以非常方便的在对象中使用工具类提供的方法,但这种设计会造成了对象意义混乱,通常只有在分类学角度上具有意义时,才使用继承,从里氏替换原则考虑,一个工具类必定有自己特定的行为特征,一个封装了逻辑的对象,不可能是工具类型的一中,因此,不要从工具类继承,如果要使用或者扩展工具类服务,使用代理模式是较好的选择。
2.调用父类(Call super):需要子类调用父类中被子类重载的方法
在面向对象设计中,子类具有拓展超类的责任,而不是具有置换掉或注销掉超类的责任。如果子类需要大量的置换掉超类的行为,那么这个子类不应当成为这个超类的子类。如果子类需要调用父类中被子类重载的方法,这是非常不合理的,子类应当具备父类的所有特性,同时是对父类的扩展。
3.不羁的对象(Objectorgy):没有成功封装对象,外部可以不受限制地访问它的内部
这也是开发过程中的常见现象,通常是为了减少代码量,例如对象属性均使用public修饰符,这样可以减少编写对象类时的访问代码,但这也使得对象封装没有了意义。
4.幽灵(Poltergeists):指这样一些对象,它们唯一的作用就是把信息传给其它对象
如果在设计的时候已经确定一个对象向另外一个对象传送的信息内容,使用对象封装传送是很不好的,这种对象作用非常单一,也是没必要的,和幽灵一样!
5.顺序耦合(Sequentialcoupling):指这样一些对象,它们的方法必须要按某种特定顺序调用
如果方法需要按特定顺序调用,良好的对象设计应当把这些方法顺序调用的逻辑封装在对象内部,而不是要求外包调用时按照特定的顺序,这极容易造成对象使用错误。
6.单例爱好者(Singletonitis):滥用单例(singleton)模式
单例模式的意思就是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,通常是为了避免当实例存在多个时可能会造成程序逻辑错误的问题。滥用单例模式会造成许多问题,例如对象并发访问等。
8.又TMD来一层(Yet Another FuckingLayer):向程序中添加不必要的层次结构、库或是框架。
这种情况在构建技术框架时很常见,JAVA有众多的开源框架或者库,因此,在构建技术框架初期,经常把许多没必要的库、框架引入。这对开发及最终目标系统都没好处,会导致整个系统技术架构混乱及运行时的性能问题。
9.唷唷问题(Yo-yo problem):一个结构(例如继承)因为过度分裂而变得难于理解
对象设计时,没有意义的分裂对象是个灾难,除了导致最终对象结构难以理解外没有任何好处。
10.对象粪池(Object cesspool):复用那些不满足复用条件的对象。
对不满足复用条件的对象复用,本身就是个灾难!
11.空子类的错误(Empty subclassfailure):创建不能通过“空子类测试”的类,因为它和直接从它继承而来没有做其它任何修改的子类表现得不同
创建了一个子类,该子类不具备父类的特征,从面向对象设计而言,这不符合继承。
12.上帝对象(God object):在设计的单一部分(某个类)集中了过多的功能
合适的对象行为在面向对象设计过程中非常重要,在单一部分集中了过多的功能会导致后续的类维护变得极为困难。
更多反面模式,参见:
http://zh.wikipedia.org/wiki/%E5%8F%8D%E9%9D%A2%E6%A8%A1%E5%BC%8F#.E7.BC.96.E7.A8.8B.E4.B8.8A.E7.9A.84.E5.8F.8D.E6.A8.A1.E5.BC.8F
分享到:
相关推荐
书中不仅提到了经典的设计模式,如Singleton(单例模式),还有新颖的模式,如FinalizerGuardian(终结函数守卫者)和DefensiveReadResolve(保护性readResolve方法)。这些模式和习惯用法通过丰富的代码示例呈现,...
在实际开发中,我们还需要考虑代码的可读性和可维护性,比如添加适当的注释、遵循一定的编码规范和使用面向对象的设计。此外,还可以扩展此游戏,比如增加计分系统、多人模式等功能,以提升游戏的复杂性和趣味性。 ...
#### 第十一章:面向对象编程 - **Person** ['pə:sn]:人,可能是指一个具体的类,表示人类的信息。 - **Start** [stɑ:t]:启动,可能是指程序的启动过程。 - **Menu** ['menju:]:菜单,用于显示用户可以选择的...
本论文主要论述了如何使用JAVA语言开发一个数字工坊网站,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。 在系统分析中,作者将论述数字工坊网站的当前背景以及...
5. 方法重载:方法重载是面向对象编程的一个特性,允许在同一类中定义多个同名方法,但这些方法的参数列表不同,如参数数量、类型或顺序不同。 6. Excel单元格输入:在Excel中,只有活动单元格才能接受输入信息,...
本PPT主要讲述了如何使用JAVA语言开发一个影城管理系统,该系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。 2. 研究背景 随着网络不断的普及发展,影城管理系统依靠...
本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站,该系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述汉服文化平台网站的当前背景以及...
在Java编程中,理解面向对象的三大特性——封装、继承和多态,是掌握面向对象编程思想的基础。通过旧项目中的代码,学习者可以看到这些概念如何在真实项目中被应用。此外,对Java集合框架的使用、文件IO操作、以及多...
3. **面向对象编程**:Java是一种面向对象的语言,硬币投掷程序可能包含一个名为`Coin`的类,封装硬币的属性(如面值)和行为(如投掷)。`Coin`类可以有一个`flip()`方法来表示投掷硬币。 4. **枚举类型**:为了更...
SpringMVC常常用于控制器的分类工作模式,与模型对象分开,程序对象的作用与自动取款机进行处理。MyBatis是一个良好的可持续性框架,支持普通SQL查询,同时允许对存储过程的高级映射进行数据的优化处理。 系统分析 ...
#### 面向对象的编程 - **依赖注入**: 实现依赖注入以简化模块间的耦合。 - **Trait**: 使用Trait来实现多重继承。 - **可见性**: 理解Scala的访问修饰符和作用域规则。 - **结构类型**: 使用结构类型来编写松耦合的...
4.4.2exit(3) 在C++ 中不是线程安全的.. . . . . . . . . . . . . . . . 94 4.5善用__thread 关键字.. . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4.6多线程与IO . . . . . . . . . . . . . . . . ....