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

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(使用前将#替换为@)

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

  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

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

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