zoukankan      html  css  js  c++  java
  • 面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构

    共性和个性

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

    继承的粒度

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

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


    聚合的粒度:

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

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

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

    类的重构的方法;

    • 提炼类:在迭代的过程中,可能会为同一个类不断地加入属性和方法, 当类越来越大时,他的职责就不是非常明白了,这时。我们能够把一部分属性和方法分离出去。形成新的类。使两个类都具有较高的内聚性。

      也就是说,假设一个类的工作应该有两个类来完毕,就必须创建一个新类,而且把相关的属性和方法移动到新类中,这样产生的新类和旧类通常以聚合关系联结在一起


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

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

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

    • 提炼超类:假设两个类有同样的属性和方法,两个类中就必然有一些代码是反复的,为了消除反复代码的坏味道,能够创建两个类的公共基类。把反复的属性和方法移动到基类中

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





  • 相关阅读:
    Media change : please insert the disk labeled
    ubuntu 关闭和开启防火墙
    CentOS6.3上部署Ceph
    Keepalived_vrrp: ip address associated with VRID not present in received packet
    Python 错误和异常小结
    nova network-vif-plugged 事件分析1
    ansible 之条件语句 when
    ansible 判断和循环
    openvswitch dpdk
    ES6之Promise
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6859629.html
Copyright © 2011-2022 走看看