类的继承层次结构的宽度和深度

2023-11-16

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

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

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


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


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

经验原则5.4

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

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

经验原则5.5

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

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



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类的继承层次结构的宽度和深度 的相关文章

  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 【Redis】Redis实现点赞、点赞排行榜

    目录 一 点赞 1 思路 2 代码实现 二 点赞排行榜 1 思路 2 代码实现 一 点赞 1 思路 在我们的项目中我们有时候会碰到这样的需求 比如实现一个博客系统 当用户访问到这篇博客时可以进行点赞 那么这个功能如何去实现呢 我们可以在数据
  • JavaScript实现UTF-8字符集Base64编码

    下面是代码实现 function var BASE64 MAPPING 映射表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n
  • 【Hexo】搭建自己的博客并到Github Pages

    一 什么是Hexo 用Hexo官网的介绍https hexo io zh cn docs Hexo是一个快速 简捷且高效的博客框架 Hexo使用Markdown解析文章 可以在很短的时间内生成静态网页 二 快速构建Hexo 安装Hexo之前
  • 【vue2】计算属性(computed)与侦听器(watch)详解

    博 主 初映CY的前说 前端领域 个人信条 想要变成得到 中间还有做到 本文核心 计算属性与侦听属性的用法 目录 文末有给大家准备好的Xmind思维导图 一 计算属性computed 默认get 方法 仅是获取值 不仅仅是获取值 还具有修改
  • Django 开发实战 1-3 创建子项目

    python 项目开发实战 创建Django 项目子应用 重应用模块 01 创建子项目 02 配置python py3 001 的开发环境 创建Django 项目子应用 重应用模块 项目背景 在这里插入图片描述 https img blog
  • Webpack的loader和plugin

    loader的作用 webpack中的loader是一个函数 主要为了实现源码的转换 所以loader函数会以源码作为参数 比如将ES6转换为ES5 将less转换为css 将css转换为js 以便能嵌入到html文件 常见的loader
  • html 视差效果,html5网页3D视差效果代码

    特效描述 html5网页 3D视差效果 html5网页3D视差效果代码 代码结构 1 引入CSS 2 引入JS 3 HTML代码 var ww wh function init t 0 ww window innerWidth wh win
  • win+r,cmd快捷操作合集

    1 appwiz cpl 程序和功能 2 calc 启动计算器 5 chkdsk exe Chkdsk磁盘检查 管理员身份运行命令提示符 6 cleanmgr 打开磁盘清理工具 9 cmd exe CMD命令提示符 10 自动关机命令 Sh
  • MySQL事务、日志、锁和MVCC机制

    InnoDB中事务的四大特性 原子性 当前事务的操作要么全部成功要么全部失败 原理 原子性是由undo log来保证的 undolog记录着数据修改之前的值 比如我们insert一条语句 undolog就会记录一条delete语句 我们up
  • 升级到 Ubuntu 18.04 LTS 的理由,大波新特性到来

    随着 2018 年 4 月 24 日稳定版正式发布日期的临近 也是时候来仔细研究下 Canonical 最新 Linux 发行版 Ubuntu 18 04 LTS Bionic Beaver 的最新功能特性了 LTS 版本每两年发布一次 而
  • Flutter Android 混合开发之使用 FlutterBoost 4.0

    搜了下全网 FlutterBoost教程大都还是老版本 所有有了这篇 当前使用环境 FlutterBoost 4 2 1 Flutter 3 3 4 首先根据官方文章集成 FlutterBoost FlutterBoost 集成详细步骤 接
  • Ftrace使用及实现机制

    Ftrace使用及实现机制 版权声明 本文为本文为博主原创文章 转载请注明出处 https www cnblogs com wsg1100 如有错误 欢迎指正 文章目录 Ftrace使用及实现机制 一 使用ftrace 1 挂载 2 关键文
  • vscode中如何拉取git代码_工具

    在一个目录下clone项目 git clone XXXXXX git 使用VScode 打开项目 右击通过Code打开 使用vscode提交代码 1 打开下面视图 添加一行文字 测试提交 2 点击 相当于git add
  • 大数据学习路线

    希望可以把这篇文章推广给所有想学习或者想从事数据科学方向的朋友 我作为偏统计方向的分析师也在这里说一下自己的一些学习方向和方法 希望对大家有帮助 推荐一个大数据学习群 142973723每天晚上20 10都有一节 免费的 大数据直播课程 专
  • 【JAVA】正则表达式是啥?

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 前言 正则表达式 正则表达式语法 正则表达式的特点 捕获组 实例 前言 如果我们想要判断给定的字符串是否符合正则表达式的过滤逻辑 称作 匹配 可以通过正则表达式 从字符串中获取我们想要的
  • 深度学习在计算机视觉领域(图像,视频,3-D点云,深度图)的应用一览 计算机视觉图像处理

    先说图像 视频处理 计算机视觉的底层 不低级 图像处理 还有视频处理 曾经是很多工业产品的基础 现在电视 手机还有相机 摄像头等等都离不开 是技术慢慢成熟了 传统方法 经验变得比较重要 而且芯片集成度越来越高 基本上再去研究的人就少了 经典
  • 1024 CodeGenerator

    答 水一下 CodeGenerator package com example springtest author LeCodeYang version 1 0 description TODO date 2022 7 11 15 22 i
  • Spring集成log4j,日志初始化过程详解

    以前研究过slf4j log4j的使用 但具体初始化过程不是很清楚 今天闲下来 翻了一下源码 一探究竟 日志组件介绍 url http www blogjava net daiyongzhi archive 2014 04 13 41236
  • Shell脚本定时清理Postgres数据库中历史数据

    Shell脚本定时清理Postgres数据库中历史数据 在系统日常运行中 会产生大量的日志 日志表会越来越加庞大 特别是对于云服务器使用者来说 每一块的空间都是很宝贵的 所以定时清理掉无用的历史日志 就显得很有意义了 其实实现数据库的日志清
  • 类的继承层次结构的宽度和深度

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