美文网首页
代码的坏味道(2)——过大的类

代码的坏味道(2)——过大的类

作者: 静默虚空 | 来源:发表于2016-12-09 13:47 被阅读0次

坏味道——过大的类(Large Class)

特征

一个类含有过多字段、方法、代码行。

imgimg

问题原因

类通常一开始很小,但是随着程序的增长而逐渐膨胀。

类似于过长方法,程序员通常觉得在一个现存类中添加新特性比创建一个新的类要容易。

解决方法

设计模式中有一条重要原则:职责单一原则。一个类应该只赋予它一个职责。如果它所承担的职责太多,就该考虑为它减减负。

imgimg
  • 如果过大类中的部分行为可以提炼到一个独立的组件中,可以使用 提炼类(Extract Class)
  • 如果过大类中的部分行为可以用不同方式实现或使用于特殊场景,可以使用 提炼子类(Extract Subclass)
  • 如果有必要为客户端提供一组操作和行为,可以使用 提炼接口(Extract Interface)
  • 如果你的过大类是个GUI类,可能需要把数据和行为移到一个独立的领域对象去。你可能需要两边各保留一些重复数据,并保持两边同步。 复制被监视数据(Duplicate Observed Data) 可以告诉你怎么做。

收益

  • 重构过大的类可以使程序员不必记住一个类中大量的属性。
  • 在大多数情况下,分割过大的类可以避免代码和功能的重复。
imgimg

重构方法说明

提炼类(Extract Class)

问题

当一个类职责不是单一的。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Extract Class - Before.png)

解决

创建新的类,将用于实现某一功能的相关字段和方法放进去。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Extract Class - After.png)

提炼子类(Extract Subclass)

问题

一个类中有些特性仅用于特定场景。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Extract Subclass - Before.png)

解决

创建一个子类,并将用于特殊场景的特性置入其中。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Extract Subclass - After.png)

提炼接口(Extract Interface)

问题

多个客户端使用一个类部分相同的方法。另一个场景是两个类中的部分方法相同。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Extract Interface - Before.png)

解决

移动相同的部分方法到接口中。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Extract Interface - After.png)

复制被监视数据(Duplicate Observed Data)

问题

如果存储在类中的数据是负责GUI的。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Duplicate Observed Data - Before.png)

解决

一个比较好的方法是将负责GUI的数据放入一个独立的类,以确保GUI数据与域类之间的连接和同步。

![img](https://raw.githubusercontent.com/atlantis1024/JavaParty/master/images/%E7%BC%96%E7%A8%8B/%E9%AB%98%E6%95%88%E7%BC%96%E7%A8%8B/%E9%87%8D%E6%9E%84/large-class/Duplicate Observed Data - After.png)

相关文章

  • 代码的坏味道(2)——过大的类

    坏味道——过大的类(Large Class) 特征 一个类含有过多字段、方法、代码行。 问题原因 类通常一开始很小...

  • 重构坏味道:过大的类

    过大的类 症状 如果单个类做了太多事情,其内往往包含了太多的实例变量,方法,代码行数,换句话说它可能拥有了太多的职...

  • 《重构》读书笔记 第三至六章

    第三章 代码的坏味道 重复代码 过长函数 过大的类 过长参数列 发散式变化(某个类经常因为不同的原因在不同的方向上...

  • 代码的坏味道

    0. 本章内容导图 1. 常见的代码坏味道 (1)重复代码 坏味道中首当其冲的就是重复代码,重复代码是万恶之源,如...

  • 代码的坏味道

    简述 今天主要简单的谈谈重构。重构在项目的开发周期中其实蛮重要的,不过很多小公司并不在乎。多数创业公司和产品都是试...

  • 代码的坏味道

    7.Feature Envy(依恋情结) 表现形式: 一个类的函数对其他类的操作多于自己类中数据的操作。 重构方案...

  • 代码的坏味道

    从我们的经验来看,没有任何度量工具比得上一个见识广博的直觉。你必须培养自己的判断力,学会判断一个类有多少实例变量算...

  • 代码的坏味道

    代码首先是写给人看的,只是恰巧(incidentally)能够运行。 ----Paul Gr...

  • 代码的坏味道

    神秘命名(Mysterious Name) 说白了就是命名不规范,无意义,字段、变量、函数、类等 重复代码(Dup...

  • 代码的坏味道

    软件设计的目的 软件设计的最终目的是使软件代码达到 高内聚低耦合从而使软件 易扩展,更强壮,可移植,更简单 不好的...

网友评论

      本文标题:代码的坏味道(2)——过大的类

      本文链接:https://www.haomeiwen.com/subject/jqbemttx.html