《重构:改善既有代码的设计》 读书笔记 第三章

第三章 代码的坏味道

3.1 神秘命名

命名是编程中很难的事情,所以最常用的重构手段就是去改个名字。

如果你发现改名很难,那就说明代码设计有问题。

3.2 重复代码

同一类的两个函数含有相同的表达式,就应该提炼。

3.3 过长函数

活得最长,最好的函数,一般都很短。

如果你觉得需要写注释,大部分情况就代表这个东西需要写进一个独立的函数里面,然后根据用途来命名比较好。

3.4 过长的参数列表

将几个函数共用的参数抽象成类,然后再调用类。

3.5 全局数据

全局数据的问题是,全局数据在任何地方都可以被修改。

所以正确的做法是将全局数据封装起来,用函数将其包起来,这样就知道那些地方修改了它。

3.6 可变数据

核心是缩小作用域。

3.7 发散式变化

如果这个模块,加不同原因的需求的时候,修改的模块都不相同的话,你需要考虑是否要分离出来。比如说你加入redis需要改3个地方,加入mysql需要改4个地方,你就应该抽离出来。

3.8 霰弹式修改

在每次修改的时候,应该只修改一处,而不是到处的修改。如果你说你要加入一个数据库,需要修改3个函数,那么这就需要思考,你是否应该抽离出来。

3.9 依恋情结

模块化,力求代码分出区域,最大化区域内部交互,最小化区域间交互。

如果两个模块交互频繁,你应该合并在一起。

3.10 数据泥团

如果在多个类中,出现了很多相同项的数据,你需要想想是否要抽离出来一个对象。

3.11 基本类型偏执

我们应该创建对象,而不是用一个字符串来写任何东西。

比如有程序员用字符串来表示电话号码,实际上你应该抽象出来一个电话号码对象。

3.12 重复的switch

switch这个东西就不应该存在。

3.13 循环语句

我们应该用管道操作来替代循环,这样能更看清被处理的元素和处理他们的动作。

3.14 冗赘的元素

能简单的代码,尽量简单。未来变复杂的时候,再去考虑它。

3.15 夸夸其谈通用型

同上。

3.16 临时字段

临时的字段不应该存在。

3.17 过长的消息链

如果关系过长,你最好提炼函数。

…… (省略其中的很多点)

3.24 注释

注释是提示你,这个地方该重构啦。

如果你觉得需要写注释的时候,请先重构,试着让所有注释都变得多余。

Original: https://www.cnblogs.com/qscqesze/p/12193564.html
Author: qscqesze
Title: 《重构:改善既有代码的设计》 读书笔记 第三章

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

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

(0)

大家都在看

  • PHP通过CURL获取远程文件header头信息

    使用CURL方法获取远程文件header头信息,与内置函数get_headers不同的是,这个方法不用完整下载文件,只是下载头部信息,速度理论会快一些。 Python reques…

    技术杂谈 2023年6月1日
    092
  • 纯注解开发模式

    定义bean: 纯注解开发模式: 用SpringConfig类来代替applicationContext.xml配置文件,利用注解@configuration代表了xml里的基本配…

    技术杂谈 2023年7月25日
    077
  • Promise的状态

    Promise Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。 备注: 此特性在 Web Worker 中可用 若想了解 promise 的工作方式以及如…

    技术杂谈 2023年6月1日
    082
  • 亚马逊 IOS sts s3上传

    1 // aws oss 2 AWSBasicSessionCredentialsProvider *credentialsProvider = [[AWSBasicSession…

    技术杂谈 2023年5月31日
    078
  • Docker自定义镜像无容器日志输出

    Docker自定义镜像无容器日志输出 因工作环境需要,需自己定制一个python环境的镜像,但制作完之后, docker logs发现无日志输出,经文档查询原来需要将日志重定向到标…

    技术杂谈 2023年6月21日
    085
  • SSM(Spring,SpringMVC,Mybatis)框架整合项目

    快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境:创…

    技术杂谈 2023年7月11日
    077
  • 列表初始化

    C++11将列表初始化(大括号初始化)作为一种通用的初始化方式.可用于所有类型. 数组以前就可以用列表初始化,但 C++11 中的列表初始化新增了一些功能: 初始化数组时,可省略等…

    技术杂谈 2023年7月11日
    067
  • DWR日志 在log4j.xml配置

    一、日志 DWR依赖 Apache Commons Logging,可以使用log4j实现日志记录功能。 1.1 日志简介 和其他日志框架一样,当设置低等级的日志时所有高于此等级的…

    技术杂谈 2023年5月30日
    0102
  • Ruby系列文章

    骏马金龙 (博客已搬家:www.junmajinlong.com) 网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。爱研究、爱翻译、爱分享。特借此一亩三分田记录…

    技术杂谈 2023年5月31日
    0108
  • Zookeeper的选举机制和同步机制超详细讲解,面试经常问到!

    前言 zookeeper相信大家都不陌生,很多分布式中间件都利用zk来提供分布式一致性协调的特性。dubbo官方推荐使用zk作为注册中心,zk也是hadoop和Hbase的重要组件…

    技术杂谈 2023年7月11日
    092
  • 为在线数据库构建基于Kudu的实时数据同步

    Kudu 是 Cloudera 开源的新型列式存储系统,是 Apache Hadoop 生态圈的成员之一。它专门为了对快速变化的数据进行快速的分析,填补了以往Hadoop 存储层的…

    技术杂谈 2023年7月23日
    066
  • Apache Doris 轻松入门和快速实践

    Doris 最早是解决百度凤巢统计报表的专用系统,随着百度业务的飞速发展对系统进行了多次迭代,逐渐承担起百度内部业务的统计报表和多维分析需求。2013 年,百度把 Doris 进行…

    技术杂谈 2023年6月1日
    091
  • 导致ANR的几种情况

    KeyDispatchTimeout(5s): 按键或触摸事件在特定时间内无法处理完成 BroadcastTimeout(前台10s,后台60s): 广播在特定时间内无法处理完成 …

    技术杂谈 2023年5月31日
    085
  • kettle中变量的设置和使用介绍

    有没有能统一管理一个参数,然后让所有的transformation和job都可以读到呢? 答案是有 1.首先,打开.kettlekettle.properties(个人主机是:C:…

    技术杂谈 2023年5月31日
    096
  • JAVA8-Lambda- anyMatch&allMatch(检查流是否满足给定的条件)

    一、anyMatch (检查流中是否至少包含一个满足条件的元素) 代码示例: public static void main(String[] args) { ArrayList …

    技术杂谈 2023年7月24日
    069
  • 十五、泛型(完结)

    十五、泛型 15.1 泛型的引入 15.1.1 集合添加指定类型元素问题 需求:请编写程序,在 ArrayList 中,添加3个 Dog 对象, Dog 对象含有 name 和 a…

    技术杂谈 2023年7月11日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球