`
xiebh
  • 浏览: 612737 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

初学者经典:61条面向对象设计的经验原则

阅读更多
《转》http://www.cnblogs.com/wjun530/archive/2007/10/10/919481.html

(1)所有数据都应该隐藏在所在的类的内部。:LG=
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  Fix
(2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。yv1#
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  0~
(3)尽量减少类的协议中的消息。Vj3
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  D7-r
(4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。n
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  3Rpn
(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。d
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  $[
如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。#bE
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  Na
(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。^1
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  :Mm
(7)类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。jbOje8
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  "y&wc
(8)类应该只表示一个关键抽象。Y.us
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  BFg9|<
包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响。T
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  MLw
(9)把相关的数据和行为集中放置。Vu*(7
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  :
设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。 BU+ev"
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  <
(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。B2
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  UN
朝着稳定的方向进行依赖。

(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。i
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ]\
(12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。w"
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  W
(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。C5k
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  #
规划一个接口而不是实现一个接口。"*s
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  @"[
(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。c
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  bQ
(15)对包含太多互不沟通的行为的类多加小心。DIYZY
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  o)
这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。TJ:1A
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  F
(16)在由同用户界面交互的面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。^'c
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  )=w
(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。 $<A('b
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ESOg-
(18)从你的设计中去除不需要的类。J_-:F5
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  %eM1>2
一般来说,我们会把这个类降级成一个属性。2^^
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  g5{=
(19)去除系统外的类。g?
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  xJV
系统外的类的特点是,抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。bL
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  =VV
(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类,特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。~ifBii
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  Fm'j
(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段,我们常会发现很多代理没有用的,应当去除。FXT2Qt
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  t_1-:
(22)尽量减少类的协作者的数量。HW)V
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  mB
一个类用到的其他类的数目应当尽量少。S'U88h
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  bn0~F&
(23)尽量减少类和协作者之间传递的消息的数量。g\
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  {R
(24)尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。W`
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  l)N4
(25)尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。>ws
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  8
(26)如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。也即:包含关系总是意味着使用关系。,WL_=Y
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  H~ez"!
(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。O2?p
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  F2_G~
(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。$F
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  di
当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。<lU%"a
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  o/h|\}
(29)让系统功能在窄而深的继承体系中垂直分布。<`CWr
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  d@3
(30)在实现语义约束时,最好根据类定义来实现。这常常会导致类泛滥成灾,在这种情况下,约束应当在类的行为中实现,通常是在构造函数中实现,但不是必须如此。 in
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  Rq
(31)在类的构造函数中实现语义约束时,把约束测试放在构造函数领域所允许的尽量深的包含层次中。-@
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ow%WZp
(32)约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。Q
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ]
(33)约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。\g
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ?#nXI
(34)类必须知道它包含什么,但是不能知道谁包含它。vD#<
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  <dJ
(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。R!
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  uF
(36)继承只应被用来为特化层次结构建模。LsU
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  <{4
(37)派生类必须知道基类,基类不应该知道关于它们的派生类的任何信息。3.j"\
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  $
(38)基类中的所有数据都应当是私有的,不要使用保护数据。K
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  0`JPT
类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。BG
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  <
(39)在理论上,继承层次体系应当深一点,越深越好。)p7P8$
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ?
(40)在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。QQb!k
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  U'Y
(41)所有的抽象类都应当是基类。jb"
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  %79(
(42)所有的基类都应当是抽象类。8I
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  9Y
(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。K[Zj
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  )%ef
(44)如果两个或更多个类共享公共数据(但没有公共行为),那么应当把公共数据放在一个类中,每个共享这个数据的类都包含这个类。/
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  s4e"?G
(45)如果两个或更多个类有共同的数据和行为(就是方法),那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。c]4t
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  |AnI
(46)如果两个或更多个类共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共基类继承。dI
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  HJ2h~
(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下,设计者应当使用多态。W{
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  !k}
(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构,每个属性值都被变换成一个派生类。2#&
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  n%F\3M
(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。(hKW
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  !M
(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。.=TG
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ih>~vH
(51)如果你觉得需要在运行时刻创建新的类,那么退后一步以认清你要创建的是对象。现在,把这些对象概括成一个类。D
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  kI
(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。Rl
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  SsA:
(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。sl
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  )IF7:
(54)在创建继承层次时,试着创建可复用的框架,而不是可复用的组件。^_ar
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  `tyn8d
(55)如果你在设计中使用了多重继承,先假设你犯了错误。如果没犯错误,你需要设法证明。m|QR
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  N
(56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承的那个东西的一个特殊类型?(2)基类是不是派生类的一部分?l|y6)N
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  ,q>
(57)如果你在一个面向对象设计中发现了多重继承关系,确保没有哪个基类实际上是另一个基类的派生类。,Xr%E&
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  .iTI
(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择,请选择包含关系。V%pn
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  |gV
(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。nI+
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  SMUN.J
(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是,在对逻辑设计作出决策的过程中我们经常用到物理设计准则。C,vcG?
©中国Java实验室(ChinaJavaLab)技术论坛 -- 中国Java实验室技术论坛  f+lK
(61)不要绕开公共接口去修改对象的状态。
分享到:
评论

相关推荐

    设计模式:可复用面向对象软件的基础.zip

    通过学习和掌握这些设计模式,开发者可以更好地理解和应用面向对象的设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。这些原则和模式的结合,可以帮助我们构建出更加模块化、可扩展...

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则.zip

    本资源“C#面向对象设计模式纵横谈(1):面向对象设计模式与原则”包含了对这一主题的深入探讨,包括PDF文档和视频教程,旨在帮助开发者理解并熟练应用这些模式。 PDF文档“20051011面向对象设计模式与原则”可能会...

    设计模式:可复用面向对象软件设计基础(附源码)

    在面向对象设计中,设计模式起到了指导作用,它们是经过验证的、在不同上下文中有效的设计原则和结构。这些模式帮助开发者遵循良好的设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则等,以提高代码...

    61条面向对象分析设计的经验原则.txt

    本文旨在对《61条面向对象分析设计的经验原则》中的关键点进行详细的解读与分析,帮助读者更好地理解面向对象设计的核心思想及其应用实践。 #### 核心原则解析 1. **原则的重要性:** - **概述:** 文档开头提到...

    UML面向对象设计基础

    这样的选择反映了面向对象设计原则的普适性,即设计的原理和概念不应该受限于特定编程语言,而是应该适用于各种面向对象语言。 #### UML的现实意义与应用 UML对于软件设计者和开发者来说具有深远的影响。它不仅提供...

    设计模式可复用面向对象软件的基础(C++)——强烈推荐

    总结来说,这本书是面向C++程序员的一份宝贵资源,它深入探讨了设计模式的理论与实践,通过具体的案例分析,帮助读者掌握面向对象设计的核心原则。无论是初学者还是经验丰富的开发者,都可以从中受益,提升自己的...

    戏说面向对象设计原理

    ### 面向对象设计原理解析 ...这些原则不仅对于初学者来说非常重要,即使是经验丰富的开发者也能从中获得新的启示。通过学习和应用面向对象设计的原则,我们可以编写出更加健壮、灵活和高效的代码。

    实用面向对象软件工程教程

    5. 面向对象设计原则:讲解OOD的基本原则,并提供实际案例展示如何遵循这些原则进行设计。 6. 质量保证和测试:讨论面向对象系统如何进行单元测试、集成测试和系统测试,确保设计的质量。 7. 案例研究:通过实际案例...

    Ruby 面向对象设计实践--2013年

    《Ruby面向对象设计实践》是一本关于如何在Ruby语言中实现面向对象编程(Object-Oriented Programming, OOP)的经典著作。该书首次出版于2013年,作者是Sandi Metz,一位著名的软件工程师和培训师,在软件开发领域...

    最新版深入浅出面向对象分析与设计(中文高清)

    3. **设计原则**:介绍SOLID(单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则)等面向对象设计的基本原则,这些原则有助于创建可维护和可扩展的软件系统。 4. **设计模式**:书中会涵盖一些...

    PHP 面向对象 设计模式详解

    在实际项目中,结合面向对象编程原则(如SOLID原则)和设计模式,我们可以构建出更灵活、易于扩展的系统。同时,良好的文档和注释也是必不可少的,它们有助于团队间的沟通和代码的维护。 总的来说,学习和掌握PHP的...

    面向对象程序设计与c++语言 朱战立

    面向对象程序设计是一种重要的编程范式,它基于“对象”的...总的来说,《面向对象程序设计与C++语言》是一本全面介绍C++面向对象编程的教材,适合初学者和有一定经验的程序员阅读,有助于提升编程技能和软件设计能力。

    设计模式:可复用面向对象软件的基础(中文版+英文版打包)

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。...无论是初学者还是经验丰富的开发者,这本书都是一个宝贵的参考资料,帮助他们掌握面向对象设计的核心原则和最佳实践。

    面向对象程序设计(C++语言描述)教程

    本教程旨在帮助开发者理解并掌握C++中的面向对象编程理念,通过实例和讲解来阐述如何利用C++实现面向对象的设计原则。 1. **面向对象程序设计概论**: - 面向对象编程(Object-Oriented Programming,OOP)的核心...

    面向对象(思想,分析与设计)

    面向对象(Object-Oriented Programming,简称OOP)是一种编程范式,旨在提供更符合人类思维方式...此外,还可以参考其他经典的面向对象设计书籍,如《设计模式:可复用面向对象软件的基础》等,以丰富自己的知识体系。

    面向对象分析与设计电子教案

    本教程“面向对象分析与设计电子教案”针对初学者,旨在帮助他们理解并掌握这一重要技术。 面向对象编程(Object-Oriented Programming,OOP)的基础在于“对象”,每个对象都包含数据(属性)和操作这些数据的方法...

Global site tag (gtag.js) - Google Analytics