共性和个性

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

继承的粒度

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

  • 首先。必须基于需求来确定集成的力度,假设提取对象的某一个共性对于我们要解决的问题没有不论什么帮助。或者仅仅有非常小的帮助。就不是必需提取该共性而添加继承的复杂程度了
  • 其次,对象的某些共性更适合用于属性而不是用新的基类和派生类来表达。比如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. CSS垂直居中和水平居中的几种方法

    垂直居中 方法一 这个方法把div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align属性. <!DOCTYPE html> <html lang=" ...

  2. Python学习日记之文件读取操作

    Python内置了文件读写的函数open,read 用法示例: open('/home/root/files.txt ') 在打开文件后,操作完成后可以使用close()关闭文件,但比较好的文件读写方 ...

  3. 逻辑回归(Logistic Regression)推导

    出自BYRans博客:http://www.cnblogs.com/BYRans/ 本文主要讲解分类问题中的逻辑回归.逻辑回归是一个二分类问题. 二分类问题 二分类问题是指预测的y值只有两个取值(0或 ...

  4. C#.NET,技巧篇(DataGridView线程操作)

    这个系列的文章,主要是平时做C#.NET(Framework 3.5)开发的时候,积累的经验和技巧.我们平时总有这样的体会,遇到一个特别难解决的问题,网上寻它千百度也没能搜索到有用的信息.这时你肯定会 ...

  5. Xcode 动态库及Framework 安装路径设置

    使用Xcode开发动态库及Framework时,需要为其设置Install path.在设置Install path时,可能会使用到以下几个路径: 1)绝对路径:               绝对路径 ...

  6. 【sqli-labs】 less63 GET -Challenge -Blind -130 queries allowed -Variation2 (GET型 挑战 盲注 只允许130次查询 变化2)

    引号闭合 http://192.168.136.128/sqli-labs-master/Less-63/?id=1' or '1'='1 剩下的和Less62一样

  7. Java_大数值_16.5.12

    如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math包中的BigInteger和BigDecimal这两个类.这两个类可以处理包含任意长度数字序列的数值.BigInteger类实现了 ...

  8. 批量生成随机字符串并保存到excel

    需要导入jxl.jar,commons-lang-2.6.jar 链接:https://pan.baidu.com/s/1NPPh24XWxkka68x2JQYlYA 提取码:jvj3 链接:http ...

  9. Android 各大网络请求库的比较及实战

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  10. 数据结构---链表ADT C++实现

    最近在学习数据结构,刚开始一直在看书,但是总是感觉似懂非懂,心想还不如自己操练一波,势必有所收获.现将实现代码发表此地,以备日后复习,若有错误或者建议,欢迎告知本人! 1. 节点类 class Nod ...