`
zgqynx
  • 浏览: 1363780 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转: 【入门】初学者经典:61条面向对象设计的经验原则

    博客分类:
  • java
阅读更多
转:http://www.cnblogs.com/wjun530/archive/2007/10/10/919481.html
【入门】初学者经典:61条面向对象设计的经验原则
Posted on 2007-10-10 12:51 王君 阅读(81) 评论(1)  编辑  收藏 所属分类: Java
(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)不要绕开公共接口去修改对象的状态。
分享到:
评论

相关推荐

    UML面向对象设计基础

    ### UML面向对象设计基础 #### 基本概念与符号表示 ...该书不仅帮助开发者理解面向对象设计的细节,而且鼓励他们有意识地在编程之前进行良好的设计,最终设计出更符合面向对象原则的高质量软件系统。

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

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

    面向对象程序设计——入门

    这份名为“面向对象程序设计——入门”的资料,以PPT的形式,为初学者提供了一个系统的学习路径,涵盖了面向对象的基本概念、核心原则以及在Java语言中的实现方法。 1. **面向对象的基本概念** - **对象**:对象是...

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

    本资源包含的是面向对象思想、分析与设计的学习资料,是C++等面向对象语言初学者的经典教程。 **面向对象思想**: 面向对象的核心思想是将现实世界中的问题抽象为计算机程序中的对象,这些对象具有属性(数据)和...

    Java面向对象程序设计(清华版)压缩卷3

    本书综合介绍了Java语言编程技术和面向对象程序设计两部分内容,在讲授Internet上最流行的编程语言Java的同时,还介绍了它所采用的面向对象技术的基础理论、主要原则和思维方法。本书内容翔实全面,涵盖了从基本概念...

    java面向对象的程序设计入门

    本教程“Java面向对象的程序设计入门”将引导初学者进入这一领域。 首先,我们需要理解面向对象的基本概念。面向对象有三大核心原则:封装、继承和多态。封装是将数据和操作这些数据的方法绑定在一起,形成一个独立...

    Java面向对象程序设计(清华版)压缩卷1

    本书综合介绍了Java语言编程技术和面向对象程序设计两部分内容,在讲授Internet上最流行的编程语言Java的同时,还介绍了它所采用的面向对象技术的基础理论、主要原则和思维方法。本书内容翔实全面,涵盖了从基本概念...

    面向对象程序设计之C#版Grady Booch.pdf

    本书不仅覆盖了面向对象的基本原理,还深入探讨了高级设计模式和技术,对于初学者乃至有经验的开发者来说都是不可多得的资源。 #### 重点章节解读 **代序:四大发明之活字印刷——面向对象思想的胜利** - **面向...

    C#面向对象入门实战-通讯录01

    在本课程"**C#面向对象入门实战-通讯录01**"中,我们将深入学习C#编程语言的基础以及如何运用面向对象编程(OOP)原则来构建实际应用。面向对象编程是一种强大的软件开发方法,它允许我们通过模拟现实世界中的对象和...

    Java面向对象程序设计-电子教案

    本电子教案主要针对初学者,旨在提供一个简单易懂、实用的学习路径,帮助他们掌握Java编程语言的基础和面向对象的核心思想。 Java是一种强类型、面向对象的语言,由Sun Microsystems(现为Oracle公司)于1995年推出...

    写给大家看的面向对象编程书

    书中《写给大家看的面向对象编程书》可能涵盖了以上所有内容,并通过易于理解的方式讲解面向对象编程的概念,包括实例解析和实践指导,适合初学者入门。 通过深入学习和实践面向对象编程,开发者能够更好地理解和...

    面向对象JavaScript精要(英文原版pdf)

    《面向对象JavaScript精要》是一本非常有价值的书籍,不仅适合初学者入门,也适合有一定经验的开发者进阶学习。通过学习本书,读者可以全面掌握面向对象编程的基本概念,并学会如何将这些概念应用到JavaScript中,...

    C++程序设计(面向对象经典教程)

    《C++程序设计(面向对象经典教程)》是一本深入探讨C++面向对象编程的权威指南,适合有志于提升C++技能的程序员们。该教程涵盖了C++语言的高级特性,包括类、对象、继承、多态、模板等核心概念,旨在帮助读者理解和...

    面向对象编程入门教程.pptx

    - 学习曲线较陡,初学者可能需要花费较多时间理解面向对象的概念。 - 封装和继承可能导致性能损失。 - 过度设计可能会增加代码的复杂度。 ### 第2章 面向对象编程语言 #### 常见的面向对象编程语言 - **Java**:...

    c++面向对象设计下载教学资源

    "c++面向对象设计下载教学资源"这个压缩包可能提供了更直观、更易理解的教学材料,帮助初学者快速掌握面向对象编程的基本概念和技巧。 这个资源包很可能包含了丰富的实例代码、解释性的文字资料、可能还有互动式的...

    tcs.zip_C#_whatgpg_简单_贪吃蛇_面向对象入门

    这个项目为初学者提供了一个实践面向对象设计的实例,通过编写这个游戏,可以深入理解面向对象编程的基本原则。 【描述】提到的“简单的贪吃蛇游戏”是一个经典的计算机游戏,玩家控制一条蛇在网格中移动,通过吃...

    java面向对象程序设计(java入门教程ppt)

    Java面向对象程序设计是编程领域的核心概念,尤其对于Java开发者来说,掌握这一技术至关重要。本教程将通过PPT的形式,帮助初学者理解并掌握Java的面向对象特性。以下是基于提供的标题和描述所涵盖的一些关键知识点...

    《Java面向对象程序设计(第2版)》

    总的来说,《Java面向对象程序设计(第2版)》是一本全面介绍Java编程的教材,适合初学者入门和有经验的开发者巩固提升。通过学习这本书,读者将能够掌握Java编程基础,理解并应用面向对象设计原则,为未来的软件开发...

    面向对象程序设计入门PPT课件.pptx

    总之,这个PPT课件为初学者提供了面向对象程序设计的基本概念和C#中的实现方式,涵盖了类、对象、封装、继承和多态的核心概念,以及类的定义、成员变量、属性和对象创建等方面的知识,是学习面向对象编程的良好起点...

    C++面向对象程序设计教材ppt

    本教程的PPT旨在为初学者提供一个深入理解C++面向对象编程概念的基础。以下是对该主题的详细阐述: 1. **类与对象**:在C++中,类是一种自定义的数据类型,它封装了数据(成员变量)和操作这些数据的方法(成员函数...

Global site tag (gtag.js) - Google Analytics