最近在项目开发中,各位兄弟对于现有的架构有所诟病,主要是继承的问题,层次比较深,层次之间没有很明确的功能划分,造成一定的混乱。我来承担工作,想出一套新的方案,满足大家平时开发的需求。

先总结下现在项目的问题,一个是层次深,一个是抽象的不好;大家有时候可能为了省事,就直接在一个比较高的基类里写入了一个少部分子类才会用到功能,等等;最终造成一种情况就是大家做一个功能时候要添加或者修改一个地方的时候查找的成本比较大,另外继承多了以后跳来跳去的成本,阅读理解成本比较高,尤其对于新来的开发同学也是难理解。

我想方案的整体思路也就是减少继承,增加组合来实现了,但是对于继承这个问题,肯定是避免不了的,那到底继承到什么程度是大家可以接受的,在网上找到一个关于这方面的经验值,转载一下:

原文地址:http://book.51cto.com/art/201111/302506.htm

关于继承层次结构的宽度和深度,我们能说些什么呢?对于包含关系,我们声称,包含层次结构的宽度应当限制在6个类之内。这对继承是否合理呢?不合理。包含需要这条经验原则,这是因为类的额外的数据成员增加了类的方法的复杂性。但在我们的继承层次结构中给水果增加一个新的派生类型并没有给已经存在的类增加复杂性,因为每个派生类都是互相独立的,并且基类也应当独立于所有的派生类(经验原则5.2)。如果关于继承层次结构的宽度有什么经验原则的话,那么经验原则就是层次结构越宽越好(假定这些继承关系都是正确的)。一个宽的继承层次结构意味着很多类都利用了基类所表示的抽象。每个继承链接都消除了重复的设计和实现努力。但是,值得指出的是,我们在本章中讨论的很多继承陷阱都表现为宽的继承层次结构。

经验原则5.4

在理论上,继承层次体系应当深一点,越深越好。

这条经验原则的潜台词是,对抽象有了很深的分类法,那么新的派生类就可以从这个层次中尽可能深的类派生,从而利用更加细化的抽象。例如,让猕猴桃类从环太平洋热带水果类(这个类继承自热带水果类,热带水果类又继承自水果类)继承,要比直接从水果类继承更好。这样,随着继承层次的深入,猕猴桃类就可以表示越来越多的抽象。

经验原则5.5

在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。

有些项目的设计者在设计他们的面向对象系统的时候使用了"越深越好"的原则,但结果却发现实现者迷失在深深的继承层次结构之中(在这些案例中大概在12和17层之间)。这些开发者重新设计了他们的系统,减少了抽象细化,获得的继承层次结构大概只有5到7层深。所有的项目的开发者都发现,这样的深度更好。类似于关于包含层次结构的宽度的经验原则,数字6被认为是普通人可以保留在短期记忆中的事物的数目。有的设计者指出,这个问题的原因是缺乏工具。如果设计者有一个图形用户界面,可以通过这个界面点击一个派生类,显示出这个类所有继承而来的数据和接口,那么那条理论上的经验原则显然是这两条经验原则中更合适的。而没有了这样的工具,则意味着这条实践上的经验原则更合适。

类的继承层次结构的宽度和深度相关推荐

  1. C++:随笔5---this指针和类的继承

    this指针:(通过一个典型的例子来认识他) class Human {char fishc;Human(char fishc);//构造函数}; Human::Human(char fishc)// ...

  2. 第五讲 类的封装和类的继承

    第五讲 类的封装和类的继承 主要内容 软件包的创建和使用 Java访问权限修饰词 类的访问权限修饰词 Java中类的层次结构和类的继承 对象的初始化再讨论   软件包的创建和使用 什么是软件包(pac ...

  3. 详细讲解C++ 类的继承

    一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事,就是指在公开场合,但是在类内部可以的 一.引言 在C++中,类是提供封装的逻辑单位,类的每一个对象都包含有描述其自身状态的 ...

  4. Java讲课笔记13:类的继承

    文章目录 零.本讲学习目标 1.理解继承的概念 2.掌握方法的重写 3.掌握super关键字 4.熟悉Object类 一.类的继承 1.继承示意图 2.继承的定义 3.继承的语法格式 4.继承案例演示 ...

  5. CSharp(C#)语言_第五章(类和继承)

    类和继承 5.1 类继承 5.2 访问继承的成员 5.3 所有类都派生自object类 5.4 隐藏基类成员 5.5 基类访问 5.6 使用基类的引用 5.6.1 虚方法和覆写方法 5.6.2 覆写标 ...

  6. 【廖雪峰python进阶笔记】类的继承

    1. 继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object):def __init__(self, ...

  7. LotusScript类的继承

    最近在修改产品时,时常遇到需要修改一个自定义类的方法,但是这个类又不能给整个(代码保密),这时如何调试就变得很麻烦了.下面通过类的继承就可以很方便的解决这个问题了. Option PublicClas ...

  8. java类接口实验_实验3_Java类的继承和接口的定义和使用

    本次有三题:学会Java类的继承.接口的定义和使用 // Ex3_1.java /** * 题目要求: * 修改例5.7(P95)实现在页面中拖动鼠标画出矩形,矩形的对角线为点击并拖动鼠标形成的直线线 ...

  9. python 类的继承,类中的函数调用以及类输入数组

    第一部分,类的继承 先给出一个例子: class People(): #定义类,要大写,python 2中要在括号里加如object这个单词def __init__(self,n,a,w): #定义一 ...

最新文章

  1. Ajax回退刷新页面问题的解决办法
  2. vue在微信里面的兼容问题_vuejs在安卓系统下微信X5内核这个兼容性问题如何破?...
  3. final在java中的含义_在java中一个类被声明为final类型,表示的意思是()
  4. windows phone 8 的新特性
  5. mysql 包 过程 job_mysql job实例全过程
  6. 案例 自动办公_办公自动化案例教程(双色)(含微课)
  7. mysql导出_mysql数据库导入导出
  8. 大数据 流式计算 apache storm 学习笔记 01 ---汪文君
  9. 免费全景摄影制作教程 - 摄影基础知识
  10. 【精通内核】CPU控制并发原理CPU中断控制内核解析
  11. 南海滩饮食法——不饿的情况下快速减肥的法宝
  12. 一个页面崩溃,其他页面也跟着崩溃
  13. 计算机系统启动项设置密码,电脑开机第一道密码怎么设置 - 卡饭网
  14. WIFI下无法登录百度网盘
  15. 665. Non-decreasing Array
  16. html5测网速,ajax测网速(示例代码)
  17. linux 2.6.28.7 各驱动代码位置(待验证,已验证为蓝色标识)
  18. Goland环境下同一个package下出现undefined
  19. SBOM(Software Bill of Materials,软件物料清单)
  20. c语言中 p2 amp n1表示什么意思,2005年9月全国计算机等级考试二级C语言笔试试题及答案mjj...

热门文章

  1. 51单片机实现两路AD检测、数码管显示、串口获取
  2. 按年复利和连续复利的区别及计算
  3. python外星人入侵飞船上下移动_Python实现《外星人入侵》之移动外星人
  4. 用matlab进行批量优化,多目标优化实例和matlab程序
  5. zh-un电子显示屏优盘发送与设置方法(P10单红)
  6. 王者荣耀服务器维修多久,王者荣耀服务器维护多久?苹果更新后进不去是正常的吗?...
  7. 【洛谷P4408】逃学的小孩【树的直径】
  8. 传奇怎样在脚本里添加见人就飞
  9. 计算机组成原理——计算机硬件组成原理(冯诺依曼和现代计算机)
  10. python//Jan.17th,2020//类