共性和个性

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

继承的粒度

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

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

    1. 二进制和八进制表示法 从 ES5 开始,在严格模式之中,八进制就不再允许使用前缀0表示,ES6 进一步明确,要使用前缀0o表示. ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0 ...

  2. Selenium 进行参数化

    Selenium参数化分为大小: 小:list.dict.函数 大:txt.excel.mysql.redis 哪种方式使自己的工作简单高效就选那种!!! Selenium进行参数化有多种形式: 本文 ...

  3. Angular——内置过滤器

    基本介绍 在AngularJS中使用过滤器格式化展示数据,在“{{}}”中使用“|”来调用过滤器,使用“:”传递参数. 基本使用 过滤器可以串起来使用,只要用   |  来衔接就行了,可以将上次返回的 ...

  4. ElasticSearch学习笔记--一些规范,会持续更新

    我们在ElasticSearch中存储的数据一般是采用json的格式存储,所以ElasticSearch中有一个叫Mapper的东西用来定义jsonschema来规范这个json 但是这个mapper ...

  5. 用rownum先排序后分页

    今天突然想到rownum可以解决分页问题,于是做了各种实验,找个几个文章,最后有了一定成果. 现有表tablename,含有字段showorder,要求提取showorder的第11行到20行数据. ...

  6. Vue核心知识-computed和watch的使用场景和方法

    https://www.jianshu.com/p/bb7a2244c7ca

  7. [转]SAS盘和SATA盘之间的区别

    很多人一提到SAS盘和SATA盘之后,首先想到的是接口方面的区别,SAS的接口速度比SATA高很多,所以认为SAS盘要比SATA盘快,性能高.其实,接口方面的区别并不是主要的,只是很小的一方面.那么, ...

  8. iOS中NSAttributedString的使用--对关键字着色,以及处理html实例

    1,最近项目中用到了一个功能,一个很好的功能.就是用户在搜索的时候,搜索结果出来后对你输入的关键字进行红色标记.这样用户就很请楚的看到自己输入什么后会出现什么样子的结果.还有一个功能是,现在有一段文字 ...

  9. 洛谷——P2158 [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队 找规律大水题嘛,如果你做过P1170 兔八哥与猎人 这题得到的规律是$a,b,c,d$,若$gcd(a-b,c-d)==1$ 那么$a,b$就能看到$c,d$ ...

  10. TestNG安装及配置

    1. 在idea中新建一个maven项目 2. 在pom.xml中添加testng和reportng依赖 <dependencies> <!-- 添加testNG依赖 --> ...