不要让“Clean Code”更难维护,请使用“Rule of Three”

当人们试图将”代码整洁之道(Clean Code)”的原则应用于现有的代码库时,我经常会问这个问题。

我认为这是合情合理的。

当我们开始重构遗留代码时,通常会将内容提取到较小的方法中。然后再将方法提取到类中。很快,我们可能就能感觉到原来 30 行的方法现在已经分散在不同的类中。

我们想知道的是:这在实际上是否是更容易维护了呢。

也许我们是一个小团队。也许我们必须支持我们继承的一个相对较大(并且没有文档记录的)的代码库。

寻求代码可维护性是一件好事。

错误在于,认为代码可维护性与代码行数(lines of code,LOC)相关。LOC 可能是一个有趣的度量指标,但它并不是关键所在!

不要使用 LOC 作为代码可维护性的度量指标。

简短的代码并没有更好的可读性

如果你对此有所怀疑,那么应该看看”短码之美(Code Golf )”。

当我们进行”短码竞赛”时,我们的目标是找到一些聪明的技巧,用最少的代码字符来实现相同的功能:

但当然,这只是一个”strawman”的论点!

我相信我们不会以”短码竞赛”的方式来编写生产中的代码。

然而,有一个重要的原则,我们需要记住:

简而言之:编写代码是要供他人阅读的。

易于理解的代码才是易于维护的代码。

还是,难道我们还不够聪明,而无法阅读冗长的函数吗?出于可读性的考虑,添加一堆一次性使用的助手函数又有什么好处呢?

如果这些问题能引起我们的共鸣,那么我们需要知道一个秘密……

过早的重构是项目失败的根源

任何极端的做法都是有害的。

即使是遵循”代码整洁之道”的原则。

我们正在尝试一些事情。当然,我们可以按照最佳实践来重构代码,但这同时也会增加了维护的难度。如果我们为了达到此目的而只是封装了一个条件语句,那么它可能没有帮助!

不,我们不应该为了可读性,而将所有内容都提取到”一次性助手函数”中。如果我们每次阅读代码时都需要阅读这些函数的主体,那么这一点也没有帮助。它只会是阻碍。

我们应该做的是,创建正确的抽象。

正确的抽象,正确地划分职责。它们阐明了代码的意图。它们可以防止代码重复。

当我们找到正确的抽象时,我们会觉得这 4 个类实际上比原来的 30 行代码更易于维护。

但是,要找到正确的抽象确实很困难。因此,这就是我们应该关注的重点。

坏的抽象比重复更糟糕

你是否听说过”不要重复你自己(Don’t Repeat Yourself,DRY)”原则?

这是一颗共同发展智慧的明珠,而且非常有效。但它也经常被误解。

两段代码看起来是一样的,但却代表了不同的概念。不同的抽象。在这种情况下,重复是偶然的。保留重复会更好。

什么时候应该将代码提取到函数 / 方法 / 类中?什么时候应该保留重复?我们怎么知道我们有正确的抽象呢?

使用”Rule of Three”

Also called Write Everything Twice (WET). Pun intended.

这也称为”什么都写两遍(Everything Twice,WET)”。这是个双关语(与 DRY 原则相对)。

"三次重复攻击,就重构"

重构原则”Rule of Three”是一条经验规则,当我们有疑问时可以使用它。

在引入抽象之前,请等待第三次重复的出现。出现重复的次数越多,就越容易找到要提取的共性。

遵循”Rule of Three”原则。它能使我们更容易地找到正确的抽象。

超越”Rule of Three”

这里的”Rule of Three”原则是为了提醒我们,重复是可以的。

这也有点教条。就像”代码整洁之道”的原则一样,不要在任何时候都盲目地 100% 应用它。

有时,即使出现了 3 次重复,我们也可能找不到正确的抽象。不要强求对代码库进行过度的抽象。如果我们不能给它起一个清晰的名字,它就确实不够清晰。

毫无疑问,违反规则是可以的。等待更多的重复。

宁可重复,也不要错误的抽象。不要为了抽象而创建抽象。

如果抽象不好,则必须使用布尔型的参数和 if 语句来简化它的实现,以覆盖新的用例。这只是一种暗示、一种警告,告诉你你走错了方向。

如果我们还没有找到抽象的话,那也没关系。当我们有了更多的上下文时,仍可以重构它。等着瞧吧!

作者丨Nicolas Carlo

Original: https://www.cnblogs.com/88223100/p/Rule-of-Three.html
Author: 古道轻风
Title: 不要让“Clean Code”更难维护,请使用“Rule of Three”

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612526/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring 学习笔记

    Spring 框架是由于软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。 Spring 一. Spring Fra…

    数据库 2023年6月11日
    080
  • tomcat加载启动过程

    流程图 posted @2022-08-19 17:43 默念x 阅读(9 ) 评论() 编辑 Original: https://www.cnblogs.com/monianxd…

    数据库 2023年6月16日
    089
  • 【转】 一条 SQL 的执行过程详解

    MySQL 体系架构 – 连接池组件 1、负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行。 …

    数据库 2023年5月24日
    0101
  • innoDB对MVCC的实现

    InnoDB存储引擎在 RR 级别下通过 MVCC和 Next-key Lock 来解决幻读问题: 1、执行普通 select,此时会以 MVCC 快照读的方式读取数据 在快照读的…

    数据库 2023年6月16日
    090
  • 13 数组有没有 length()方法 String 有没有 length()方法

    数组没有length()方法,有length属性; String有length()方法。 注意:在JavaScript中,获得字符串长度是通过length属性得到的,这一点请不要和…

    数据库 2023年6月6日
    085
  • Redis锁相关

    Redis锁相关 君不见,高堂明镜悲白发,朝如青丝暮成雪。 背景:面试的时候被问到有哪些锁,很快脱口而出Volatile、Synchronized和ReentrantLock,也能…

    数据库 2023年6月14日
    078
  • B树-删除

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 删除 根据B树的以下两个特性 每一个非叶子结点(除根结点)最少有 ⌈ m/2⌉ 个子结点 有k…

    数据库 2023年6月14日
    074
  • Mysql 实现数据库读写分离

    一、Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、…

    数据库 2023年5月24日
    094
  • Spring源码分析-BeanFactoryPostProcessor

    Spring源码分析-BeanFactoryPostProcessor 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533…

    数据库 2023年6月16日
    099
  • 容器化|在 S3 备份恢复 RadonDB MySQL 集群数据

    作者:程润科、钱芬视频:钱芬 上一篇文章我们演示了如何快速实现 MySQL 高可用集群部署,以及部署集群的校验和卸载方式。本文将演示如何对集群进行备份和恢复。 部署版本为 Rado…

    数据库 2023年5月24日
    091
  • 安全生产 系统稳定性建设

    前言 安全是产品的底座,是体验的基础,也是企业的一项核心竞争力。安全生产是一项系统性的工作,同时也是一件比较琐碎的事,需要做方方面面的考虑尽一切可能保障系统安全稳定运行。个人之前一…

    数据库 2023年6月14日
    082
  • 配置中心Nacos(服务发现)

    服务演变之路 单体应用架构 在刚开始的时候,企业的用户量、数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀个⼯程中编码、编译、打包并且部署在⼀个Tomcat容器中的架构模式就是单体应…

    数据库 2023年6月9日
    0115
  • 银河麒麟V10安装MySQL8028

    记一次成功安装MySQL8028到银河麒麟V10,并实现远程访问的方法 工具/原料 数据库下载地址(实验版如图): [En] Download address of the dat…

    数据库 2023年5月24日
    092
  • 快速入门上手Markdown

    第一次接触 Markdown是写代码初期看很多大佬的 github,他们的项目一定会有一份文件叫 Readme.md的文件他们由一些简单美观的符号和汉字字母组成,编译之后成为一篇简…

    数据库 2023年6月11日
    089
  • Redis-持久化

    因为Redis是内存操作,意味着掉电就GG, 所以为了保证异常重启等问题后能尽快恢复服务,还是需要一定的持久化机制来保证。Redis提供了两种持久化机制: AOF Append O…

    数据库 2023年6月11日
    0101
  • 编译型语言和解释型语言

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月6日
    0126
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球