一个对象一定会有如下4个属性:

1,它的身份标示,可能只是它在内存中的地址;

2,它的类的属性(通常是静态属性)和这些属性的值(通常是动态的);

3,它的类的行为(从实现者的角度看);

3,它的公开接口(从用户的角度看).

2.1 所有数据都应该隐藏在它所在的类内部.

考虑最简单的点Point类(X,Y),再考虑可能点的实现是用的极坐标,那么是否该领悟到这一点了?

 
2.2,类的使用者必须依赖类的公共接口,但类不能依赖它的使用者.    
房子可以依赖闹钟,但是闹钟不能依赖房子,否则这个闹钟就不能放到别的地方了
 
2.3,尽量减少类的的方法的数量    
几年前,部分人所提倡的原则与此正好相反,他们认为凡是能想到的,将来用户可能都能用上.    
那么既然如此,那么你一定喜欢我的链表类,它的公共接口有4000个.(这里我第一次大笑)
 
2.4,实现所有类都能理解的最基本公共接口    
如:拷贝操作(深拷贝和浅拷贝),相等性判断,正确输出内容(打印),从字符串解析等
 
2.5,不要把实现细节放到类的公共接口    
目的是降低使用者的复杂度
 
2.6,用户不感兴趣的或无法使用的内容不要放到类的公共接口   
与2.5类似的
 
2.7,类之间应该零耦合,或者只有导出耦合关系.   
即:一个类要么同另一个类豪无关系,要么只使用另一个类的公共接口中的操作.   
低耦合,高内聚原则   
耦合:衡量两个类之间的关系.   
类聚:衡量类的实现,高类聚的最理想状态是:类的所有方法都使用了其所有字段或属性,不存在一半方法使用了这一半属性或字段,而另一半方法使用了另外一半的属性或字段.     如果是这样,那这个类本身就应该被劈开为两个类.
 
2.8,类应当只表示一个关键抽象,反之亦然.   
如果一个关键抽象被表示为多个类,则表明设计者把这个关键抽象的每个功能表示为一个类了.    反之,表明这个类表示了多个关键抽象,导致庞大复杂的类,还不好用(因为每次使用都牵扯到两个关键抽象概念)
 
2.9,把相关的数据和行为集中放置    
否则为了满足单一的需求变更,而不得不在两个或更多的地方进行修改
 
2.10,把不相关的信息放到另一个类中   
高类聚的原则
 
2.11,确保抽象的是类,而不是对象   
"父亲"和"母亲"是不是类,还是某个"人"的对象?要看具体应用是否区分了这两者,如果没有区分,则表示的是对象,否则就是类.

OOD沉思录 --- 导引的更多相关文章

  1. OOD沉思录 --- 类和对象的关系 --- 包含关系4

    4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...

  2. OOD沉思录 --- 类和对象的关系 --- 包含关系3

    4.7 类包含的对象数目不应当超过开发者短期记忆数量,这个数目通常应该是6左右 4.8 让系统在窄而深的包含体系中垂直分布 假设有如下两份菜单: 正餐 --->甜瓜 --->牛排 ---& ...

  3. OOD沉思录 --- 类和对象的关系 --- 包含关系2

    4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...

  4. OOD沉思录 --- 类和对象的关系 --- 包含关系1

    4.5 如果类包含另一个类的对象,那么包含类应当向被包含的对象发送消息(调用方法).  也就是说,所有的包含关系都应当是使用关系. 如果不是这样,那么包含的类有什么用处呢?当然,面向过程的开发人员会想 ...

  5. OOD沉思录 --- 类和对象的关系 --- 使用关系原则

    4.1 尽量减少类的协作的数量,即减少使用者和被使用者的数量. 协作意味着一定程度的耦合,但是完全没有协作的类也是没有意义的,最多只能作为一个库使用. 通过抽象,依赖接口,可以最大程度减少依赖的实现类 ...

  6. OOD沉思录 --- 类和对象的关系 --- 使用关系

    使用关系 对象A的方法MethodA使用了B的方法MethodB,则表示A对B存在使用关系 使用关系的最关键问题在于,A如何找到B,存在6种方案 方案一: A包含了B,B作为一个成员定义在A的类中,那 ...

  7. OOD沉思录 --- 面向动作与面向对象 --- 避免泛滥成灾的类

    3.7 从设计中取出不需要的类 只有Get/Set方法的类不算是一个必要的类,Get/Set方法也不算是有意义的行为.这种类降级为属性更加合适. 3.8 去除系统外部的类 如果一个类只调用系统领域的方 ...

  8. OOD沉思录 --- 面向动作与面向对象 --- 避免全能类

    面向过程的软件开发通过非常集中化的控制机制来分解功能,在程序设计中表现就是大量的条件判断,深层次的循环嵌套等. 这种模式下,我们可以通过分析方法的参数,局部变量及其访问的全局变量来得到方法对数据的依赖 ...

  9. OOD沉思录 --- 继承

    一,继承只应被用来为特化层次结构建模 实际上也就是要满足LSP原则,水果类<-榴莲的继承是特化   二,派生类必须知道他们的基类,基类不应当知道他们的派生类   复用的前提   三,基类中的所有 ...

随机推荐

  1. 前端PHP入门-004-数据类型,特别需要注意字符串

    人类世界对万事万物都有种类划分,例如: 哺乳动物 人.猫.马.鸭嘴兽-.等等 蔬菜 西红柿.波菜.茄子-.等等 水果 西瓜.桃子.苹果-.等等 数据类型:就是对数据分类的一个划分而已 整型就是整数 我 ...

  2. CSS常用标签-手打抄录-感谢原未知博主-拜谢了

    CSS常用标签   CSS常用标签 一 CSS文字属性 color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-siz ...

  3. CSS盒子知识

    此随笔写于学习完CSS盒子之后,所遇到的问题和感悟记录. 1.IE盒子: IE盒子的特性:对于IE浏览器来说width不是内容宽度.而是内容+外边距+边框的内容总和. 也就是说当盒子增加10px;那么 ...

  4. 【Web】Struts之namespace

    ZZ:struts2学习:配置篇之namespace 在struts1中是没有命名空间这个概念的,通过命名空间我们可以将所有的action配置划分为一个个逻辑单元,每个单元都有它自己的标识前缀.命名控 ...

  5. Maven项目Eclipse启动时报错: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

    Eclipse中启动Maven项目时报如下错误: 严重: Error configuring application listener of class org.springframework.web ...

  6. [acmm week12]二分+dp+单调队列

    1004 抄作业         Time Limit: 1sec    Memory Limit:256MB Description Zfree虽然平时很爱学习,但是他迫于生活所迫(比如设计cpu实 ...

  7. 引用类型 ( 对象定义 )——Function 类型

    本文地址:http://www.cnblogs.com/veinyin/p/7607798.html  函数实际上是对象,也具有属性和方法,函数名实际上是指向函数对象的指针 function sum( ...

  8. CodeForces 869B

    Even if the world is full of counterfeits, I still regard it as wonderful. Pile up herbs and incense ...

  9. 深入理解Spring系列之十一:SpringMVC-@RequestBody接收json数据报415

    转载 https://mp.weixin.qq.com/s/beRttZyxM3IBJJSXsLzh5g 问题原因 报错原因可能有两种情况: 请求头中没有设置Content-Type参数,或Conte ...

  10. BAT-快速切换JDK1.6/1.7

    Code: @echo OFF rem 修改背景/字体颜色为黑/绿 color 0A rem 自动设置JDK环境变量,本程序不会对 [系统环境变量] 造成破环!不需要重启!! rem 没有%%JAVA ...