面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构
共性和个性
依据面向对象的原理。类是对象的抽象。也就是说。类是一系列的既有共性又有个性的对象的高度概括,类的属性和方法代表了隶属于该类的全部对象的共性,类的每一个对象实例都能够有不同的属性值,这反映了每一个对象的个性
继承的粒度
对于一颗继承树,应该把继承的层次细化到什么程度才算合适呢?
- 首先。必须基于需求来确定集成的力度,假设提取对象的某一个共性对于我们要解决的问题没有不论什么帮助。或者仅仅有非常小的帮助。就不是必需提取该共性而添加继承的复杂程度了
- 其次,对象的某些共性更适合用于属性而不是用新的基类和派生类来表达。比如CPu的一级缓存和二级缓存仅仅是简单的数量值,用一个属性来表达非常方便
- 最后。要清楚,利用类和对象来模拟现实世界是手段而不是目的。不能为了提取类而提取类,我们终于的目的是最大限度的实现代码复用,提高软件质量。因此,假设不能带到复用代码的目的。就没有必要在提取新的类了
聚合的粒度:
在UML语言中,聚合关系指的是总体和部分之间的关联关系;在处理聚合的粒度问题遵循的原则和处理继承粒度的原则全然一样。模拟世界仅仅是手段而不是目的,终于目的是改善代码结构。提高代码的复用性
纯粹为代码复用而存在的设计方案:
在很多的实际的软件设计方案里。很多设计是纯粹为代码复用而存在的,也就是说,设计方案中的某些类无法对英语现实世界中的实际物体和关系,可是这些类的存在有助于提高代码的复用性,降低代码的反复
类的重构的方法;
- 提炼类:在迭代的过程中,可能会为同一个类不断地加入属性和方法, 当类越来越大时,他的职责就不是非常明白了,这时。我们能够把一部分属性和方法分离出去。形成新的类。使两个类都具有较高的内聚性。
也就是说,假设一个类的工作应该有两个类来完毕,就必须创建一个新类,而且把相关的属性和方法移动到新类中,这样产生的新类和旧类通常以聚合关系联结在一起
- 将类内联化:在提炼类的过程中,有可能造成一些类太小,负责的指责过少,这时,我们能够把该类的属性和方法移动到其它类中。然后删除该类,这时提取类的反向过程
- 以类代替型别码:假设在某一个类中有一个表达详细对象的代码(型别码),该型别码影响了该类的行为,并可能使得该程序中频繁出现与该型别码相关的分支语句,这时,我们应该创建新的派生类。而且使用多态来代替他
- 提炼子类:有时,一个类中的某些属性仅仅对部分对象实例有意义,这说明该类的计划并不完美,我们还能够把这些属性单独提取出来,形成该类的一个派生类
- 提炼超类:假设两个类有同样的属性和方法,两个类中就必然有一些代码是反复的,为了消除反复代码的坏味道,能够创建两个类的公共基类。把反复的属性和方法移动到基类中
- 折叠继承体系:在迭代和重构的过程中。有可能发现某个基类和它的派生类非常相似,仅仅有非常少的差异,这时,能够把这两个类合并起来,用属性表达二者之间的差异
面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构的更多相关文章
- Delphi面向对象设计的经验原则(61条)
(1)所有数据都应该隐藏在所在的类的内部. (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者. (3)尽量减少类的协议中的消息. (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深 ...
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html < ...
- # 61条面向对象设计的经验原则-《OOD启思录》Arthur J.Riel
61条面向对象设计的经验原则-<OOD启思录>Arthur J.Riel 原文 http://blog.csdn.net/cpluser/article/details/129291 61 ...
- Java成长第五集--面向对象设计的五大原则
S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.以下图说明: 下面就个人的理解来说说这五大原则的含义到 ...
- Effective C++(20) 继承与面向对象设计
本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...
- EffectiveC++ 第6章 继承与面向对象设计
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 6 继承与面向对象设计 Inheritance and ...
- js面向对象设计之class继承
EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性 ...
- Effective C++ —— 继承与面向对象设计(六)
条款32 : 确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味“is-a”(是一种)的关系.请务必牢记.当 ...
- Effective C++: 06继承与面向对象设计
32:确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public继承表示的是"is-a"(是一种)的关系. 如果令class D以pub ...
随机推荐
- 引入css的四种方式
1.内联式引用:直接用在标签上,但维护成本高 style='font-size:16px;color:#000000' 2.外部连接式引用:css代码与html代码分离,便于代码重复使用 <li ...
- 本地编译全志R系列的步骤(Ubuntu16.04.4版本)
本地编译全志R系列的步骤(Ubuntu16.04.4版本) 2018/6/14 9:32 版本:V1.0 0.获取全志R系列的Android源码包: 请通过渠道/代理商/方案公司获取全志R系列的And ...
- 提取header头进行模块化处理
在进行爬取网上东西的时候一般网站都做了UA的过滤,解决办法就是在代码中加入. 所以才有了本篇提取header头信息单独写成一个模块或者说是函数/类的想法,直接上示例 1.把UA头信息在浏览器中复制出来 ...
- JNDI链接SQLServer数据库步骤
1.配置context.xml文件 在我们的WebRoot目录下,就是和WEB-INF同级的目录下,新建一个META-INF的目录(假如不存在),在该目录下创建一个context.xml文件,并且在c ...
- Windows sever 2003 IIS6.0 搭建DVWA
DVWA 环境: Windows Sever 2003 IIS 6.0+MYSQL+PHP5.4+FASFCGI 详细教程: http://files.cnblogs.com/files/yyx001 ...
- DIV自动居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- HDU_1242_Rescue
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1242 大意:迷宫搜索,'#'代表墙,'.'代表路,'x'代表守卫,每移动1格用1秒,杀死守卫用1秒,ang ...
- 网络编程基础_3.APC队列
APC队列 #include <stdio.h> #include <windows.h> // 保存 IO 操作的结果 CHAR Buffer1[] = { }; CHAR ...
- centos7服务器安装fail2ban配合Firewalld防护墙防止SSH爆破与防护网站CC攻击
centos7服务器安装fail2ban配合Firewalld防护墙防止SSH爆破与防护网站CC攻击 1.检查firewalld是否启用 #如果您已经安装iptables建议先关闭 service i ...
- 第一节:EasyUI样式,行内编辑,基础知识
一丶常用属性 $('#j_dg_left').datagrid({ url: '/Stu_Areas/Stu/GradeList', fit: true, // 自动适应父容器大小 singleSel ...