面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构

共性和个性

根据面向对象的原理,类是对象的抽象,也就是说,类是一系列的既有共性又有个性的对象的高度概括,类的属性和方法代表了隶属于该类的所有对象的共性,类的每个对象实例都可以有不同的属性值,这反映了每个对象的个性

继承的粒度

对于一颗继承树,应该把继承的层次细化到什么程度才算合适呢?

  • 首先,必须基于需求来确定集成的力度,如果提取对象的某一个共性对于我们要解决的问题没有任何帮助,或者只有很小的帮助,就没必要提取该共性而增加继承的复杂程度了
  • 其次,对象的某些共性更适合用于属性而不是用新的基类和派生类来表达,例如CPu的一级缓存和二级缓存只是简单的数量值,用一个属性来表达非常方便
  • 最后,要清楚,利用类和对象来模拟现实世界是手段而不是目的,不能为了提取类而提取类,我们最终的目的是最大限度的实现代码复用,提高软件质量,因此,如果不能带到复用代码的目的,就没有必要在提取新的类了

聚合的粒度:

在UML语言中,聚合关系指的是整体和部分之间的关联关系;在处理聚合的粒度问题遵循的原则和处理继承粒度的原则完全一样,模拟世界只是手段而不是目的,最终目的是改善代码结构,提高代码的复用性

纯粹为代码复用而存在的设计方案:

在许多的实际的软件设计方案里,许多设计是纯粹为代码复用而存在的,也就是说,设计方案中的某些类无法对英语现实世界中的实际物体和关系,但是这些类的存在有助于提高代码的复用性,减少代码的重复

类的重构的方法;

  • 提炼类:在迭代的过程中,可能会为同一个类不断地添加属性和方法, 当类越来越大时,他的职责就不是很明确了,这时。我们可以把一部分属性和方法分离出去,形成新的类,使两个类都具有较高的内聚性。也就是说,如果一个类的工作应该有两个类来完成,就必须创建一个新类,并且把相关的属性和方法移动到新类中,这样产生的新类和旧类通常以聚合关系联结在一起
  • 将类内联化:在提炼类的过程中,有可能造成一些类太小,负责的指责过少,这时,我们可以把该类的属性和方法移动到其他类中,然后删除该类,这时提取类的反向过程
  • 以类取代型别码:如果在某一个类中有一个表达具体对象的代码(型别码),该型别码影响了该类的行为,并可能使得该程序中频繁出现与该型别码相关的分支语句,这时,我们应该创建新的派生类,并且使用多态来代替他
  • 提炼子类:有时,一个类中的某些属性只对部分对象实例有意义,这说明该类的计划并不完美,我们还可以把这些属性单独提取出来,形成该类的一个派生类
  • 提炼超类:如果两个类有相同的属性和方法,两个类中就必定有一些代码是重复的,为了消除重复代码的坏味道,可以创建两个类的公共基类。把重复的属性和方法移动到基类中
  • 折叠继承体系:在迭代和重构的过程中,有可能发现某个基类和它的派生类非常相似,只有很少的差异,这时,可以把这两个类合并起来,用属性表达二者之间的差异
时间: 2024-08-11 15:06:22

面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构的相关文章

61条面向对象设计的经验原则

你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚.但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起. -----Arthur J.Riel (1)所有数据都应该隐藏在所在的类的内部.p13 (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者.p15 (3)尽量减少类的协议中的消息.p16 (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝).相等性判断.正确输出内容.从ASCII描述解析等等]. p16 (5)不要把实现细节(例如放置共用代码的私

Delphi面向对象设计的经验原则(61条)

(1)所有数据都应该隐藏在所在的类的内部. (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者. (3)尽量减少类的协议中的消息. (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝).相等性判断.正确输出内容.从ASCII描述解析等等]. (5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中. 如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数. (6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口. (7)类之间应该

# 61条面向对象设计的经验原则-《OOD启思录》Arthur J.Riel

61条面向对象设计的经验原则-<OOD启思录>Arthur J.Riel 原文 http://blog.csdn.net/cpluser/article/details/129291 61条面向对象设计的经验原则 摘抄自<OOD 启思录>--Arthur J.Riel 著 鲍志云 译 "你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚.但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起." ----------Arthur J.Riel (1)

Effective C++(20) 继承与面向对象设计

本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure virtual? 缺省参数值与virtual函数有什么交互影响? 继承如何影响C++的名称查找规则? 什么情况下有比virtual更好的选择? 这些都是我们将要从这一章里学到的内容. 1 确定你的public继承可以塑模出is-a关系 谨记public继承的含义: 如果class D以public形式继承cl

【C++常识】effective C++ 使用条款——内存管理/继承和面向对象设计/杂项

第六章 继承和面向对象设计 条款35: 使公有继承体现 "是一个" 的含义 1.子类对象一定"是一个"基类对象,基类对象不一定是子类对象 条款36: 区分接口继承和实现继承 1.希望派生类只继承成员函数的接口--将函数声明为纯虚函数 2.希望派生类同时继承函数的接口和实现,但允许派生类改写实现--将函数声明为虚函数 3.希望同时继承接口和实现,并且不允许派生类改写任何东西--声明为非虚函数 条款37: 决不要重新定义继承而来的非虚函数 1.基类声明为非虚的函数表示这

Effective C++笔记06:继承与面向对象设计

关于OOP 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 1,继承可以是单一继承或多重继承,每一个继承连接可以是public.protected或private,也可以是virtual或non-virtual. 2,成员函数的各个选项:virtual或non-virtual或pure-virtual. 3,成员函数和其他语言特性的交互影响:缺省参数值与virtual函数有什么交互影响?继承如何影响C++的名称查找规则?设计选项有如些?如果class的行为

Effective c++(笔记)之继承关系与面向对象设计

1.公有继承(public inheritance) 意味着"是一种"(isa)的关系 解析:一定要深刻理解这句话的含义,不要认为这大家都知道,本来我也这样认为,当我看完这章后,就不这样认为了. 公有继承可以这样理解,如果令class D以public 的形式继承了class B ,那么可以这样认为,每一个类型为D的对象同时也可以认为是类型为B的对象,但反过来是不成立的,对象D是更特殊化更具体的的概念,而B是更一般化的概念,每一件事情只要能够施行于基类对象身上,就一定可以应用于派生类对

继承和面向对象设计

继承与面向对象设计 32. 确定你的public继承塑模出is-a关系 "public继承"意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived class对象也都是一个base class对象 33. 避免遮掩继承而来的名称 derived classes 内的名称会遮掩base classes 内的名称.在public继承下从来没有人希望如此. 为了让被遮掩的名称再见天日,可使用using 声明式或转交

【Effective C++】继承与面向对象设计

关于OOP 1,继承可以是单一继承或多重继承,每一个继承连接可以是public.protected或private,也可以是virtual或non-virtual. 2,成员函数的各个选项:virtual或non-virtual或pure-virtual. 3,成员函数和其他语言特性的交互影响:缺省参数值与virtual函数有什么交互影响?继承如何影响C++的名称查找规则?设计选项有如些?如果class的行为需要修改,virtual函数是最佳选择吗? 4,public继承意味着“is-a”. 5