共性和个性

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

继承的粒度

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

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

聚合的粒度:

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

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

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

类的重构的方法;

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

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



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


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


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


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


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

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

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

    (1)所有数据都应该隐藏在所在的类的内部. (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者. (3)尽量减少类的协议中的消息. (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深 ...

  2. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

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

    61条面向对象设计的经验原则-<OOD启思录>Arthur J.Riel 原文 http://blog.csdn.net/cpluser/article/details/129291 61 ...

  4. Java成长第五集--面向对象设计的五大原则

    S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.以下图说明: 下面就个人的理解来说说这五大原则的含义到 ...

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

    本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...

  6. EffectiveC++ 第6章 继承与面向对象设计

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 6 继承与面向对象设计 Inheritance and ...

  7. js面向对象设计之class继承

    EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性 ...

  8. Effective C++ —— 继承与面向对象设计(六)

    条款32 : 确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味“is-a”(是一种)的关系.请务必牢记.当 ...

  9. Effective C++: 06继承与面向对象设计

    32:确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public继承表示的是"is-a"(是一种)的关系. 如果令class D以pub ...

随机推荐

  1. Oracle+struts2实现用户登入并显示访问次数

    实体类: package entity; public class userfo { private int id;//id private String name;//用户名 private Str ...

  2. sharepoint services

    I have got solution for authentication to share point web service I have use fedAuth Cookie and rtfa ...

  3. Sturts2几个常用内建拦截器的介绍

    Sturts2几个常用内建拦截器的介绍:1)conversation:这是一个处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldErro ...

  4. vue基础---表单输入绑定

    [一]基础用法 用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定.它会根据控件类型自动选取正确的方 ...

  5. blog笔录1

    (1)虚拟主机 (2)部署 部署完成后刷新页面会看到笑脸,在Home分组下控制器Application/Home/Controller/IndexController.class.php下定义显示 ( ...

  6. error: Bean property 'userDAO' is not writable or has an invalid setter method.

    使用Spring属性注入的方式,没有在ServiceImpl中setDao,导致程序报错 public class AddressServiceImpl implements IAddressServ ...

  7. Linux无人值守安装系统

    yum install dhcp -yvim /etc/dhcp/dhcpd.conf--------------------------------------------- allow booti ...

  8. 洛谷 1328 生活大爆炸版石头剪刀布(NOIp2014提高组)

    [题解] 简单粗暴的模拟题. #include<cstdio> #include<algorithm> #include<cstring> #define LL l ...

  9. PAT 1137 Final Grading

    For a student taking the online course "Data Structures" on China University MOOC (http:// ...

  10. PAT 1125 Chain the Ropes

    Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fo ...