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

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

共性和个性

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

继承的粒度

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

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


聚合的粒度:

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

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

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

类的重构的方法;

  • 提炼类:在迭代的过程中,可能会为同一个类不断地添加属性和方法, 当类越来越大时,他的职责就不是很明确了,这时。我们可以把一部分属性和方法分离出去,形成新的类,使两个类都具有较高的内聚性。也就是说,如果一个类的工作应该有两个类来完成,就必须创建一个新类,并且把相关的属性和方法移动到新类中,这样产生的新类和旧类通常以聚合关系联结在一起

  • 将类内联化:在提炼类的过程中,有可能造成一些类太小,负责的指责过少,这时,我们可以把该类的属性和方法移动到其他类中,然后删除该类,这时提取类的反向过程

  • 以类取代型别码:如果在某一个类中有一个表达具体对象的代码(型别码),该型别码影响了该类的行为,并可能使得该程序中频繁出现与该型别码相关的分支语句,这时,我们应该创建新的派生类,并且使用多态来代替他

  • 提炼子类:有时,一个类中的某些属性只对部分对象实例有意义,这说明该类的计划并不完美,我们还可以把这些属性单独提取出来,形成该类的一个派生类

  • 提炼超类:如果两个类有相同的属性和方法,两个类中就必定有一些代码是重复的,为了消除重复代码的坏味道,可以创建两个类的公共基类。把重复的属性和方法移动到基类中

  • 折叠继承体系:在迭代和重构的过程中,有可能发现某个基类和它的派生类非常相似,只有很少的差异,这时,可以把这两个类合并起来,用属性表达二者之间的差异





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