《重构 改善既有代码的设计 2》重新组织函数、数据

Extract Class(提炼类) 动机 你也许听过类似这样的教诲:一个类应该是一个清楚的抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿加入一些功能,在那儿加入一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个单独的类。于是,随着责任不断增加,这个类会变得过分复杂。很快,你的类就会变成一团乱麻。 做法 决定如何分解类所负的责任。 建立一个新类,用以表现从旧类中分离出来的责任。 建立“从旧类访问新类”的连接关系(有可能需要一个双向连接。但是在真正需要它之前,不要建立“从新类通往旧类”的连接)。 对 阅读详情
/**
 @startTime 2020-12-20 15:30
 @endTime 2020-12-20 21:00
 @startPage 103 
 @endPage 130
 @efficiency 130/5 = 26页/天
 @needDays 412/26 = 16天
 @overDay 2020-12-16 + 16天 = 2020-12-31
*/

第五章 重构列表

第5~12章构成了一份重构列表草案,其中所列的重构手法来自作者数年的编程心得。

1、重构的记录格式

  1. 首先是名称(name)。建造一个重构词汇表,名称是很重要的。
  2. 名称之后是一个简短概要(summary)。简单介绍此重构手法的适用场景,以及它所做的事情。这部分可以帮助你更快找到你所需要的重构手法。
  3. 动机(motivation)为你介绍“为什么需要这个重构”和“什么情况下不该使用这个重构”。
  4. 做法(mechanics)简明扼要地一步一步介绍如何进行此重构。
  5. 范例(examples)以一个十分简单的例子说明此重构手法如何运作。

2、寻找引用点

不要盲目的进行查找-替换,应该检查每一个引用点,确保它的确指向你想要替换的东西。
可以让编译器帮助你捕捉引用点,但是这也会存在一些问题,比如:

  1. 如果被删除的部分在继承体系中声明不止一次,那么编译器也会被迷惑。
  2. 编译器可能太慢。
  3. 编译器无法找到通过反射机制得到的引用点

3、这些重构手法有多成熟

小步前进、频繁测试。
设计模式,为重构提供了目标。
模式和重构之间有着一种与生俱来的关系,模式是你希望达到的目标,重构则是到达之路。

第六章 重新组织函数

我的重构手法中,很大一部分是对函数进行整理,使之更恰当地包装代码。

1、提炼函数

将一段代码放进一个独立函数中,并让函数名称解释该函数的用途。
「动机」

  1. 如果每个函数的粒度都很小,那么函数被复用的机会就会很大;
  2. 使高层函数读起来就像一系列注释;
  3. 如果函数都是细粒度的,那么函数的覆写也会更容易些;
    一个函数多长算合适?在我看来,长度不是问题,关键在于函数名称和函数本体之间的语义长句。如果提炼可以强化代码的清晰度,那么就去做,就算函数名称比提炼出来的代码还长也没无所谓。

2、内联函数

在函数调用点插入函数本体,然后移除该函数。

3、内联临时变量

将所有对该变量的引用动作,替换为对它赋值那个表达式本身。

4、以查询取代临时变量

将这个表达式提炼到一个独立函数中,将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。

5、引入解释性变量

将复杂表达式的结果放进一个临时变量,以此变量名称来解释表达式用途。
「动机」
在条件逻辑中,引入解释性变量特别有价值,你可以用这项重构将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。使用这项重构的另一种情况是,在较长算法中,可以运用临时变量来解释每一步运算的意义。

6、分解临时变量

针对每次赋值,创造一个独立、对应的临时变量。
「动机」
如果临时变量被赋值超过一次,就意味着它们在函数中承担了一个以上的责任。如果临时变量承担多个责任,它就应该被替换为多个临时变量,每个变量只承担一个责任。同一个临时变量承担两件不同的事情,会另代码阅读者糊涂。

/**
 @startTime 2020-12-21 21:30
 @endTime 2020-12-21 23:50
 @startPage 131 
 @endPage 188
 @efficiency 188/6 = 31.3页/天
 @needDays 412/31.3 = 13天
 @overDay 2020-12-16 + 13天 =  2020-12-28
*/

7、移除对参数的赋值

以一个临时变量取代该参数的位置。
首先,我要确定大家都清楚“对参数赋值”这个说法的意思。如果你把一个名为user的对象作为参数传给某个函数,那么“对参数赋值”意味着改变user,使它引用另外一个对象。如果你在“被传入对象”身上进行什么操作,那没问题,我也总是这样干。我只针对“user被改而指向另一个对象”这种情况来讨论。

8、以函数对象取代函数

你有一个大型函数,其中对局部变量的使用使你无法采用提取函数,将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段,然后你可以在同一个对象中将这个大型函数分解为多个小型函数。
「动机」
我在本书中不断向读者强调小型函数的优美动人。只要将相对独立的代码从大型函数中提炼出来,就可以大大提高代码的可读性。
「做法」

  1. 建立一个新类,根据待处理函数的用途,为这个类命名。
  2. 在新类中建立一个final字段,用以保存原先大型函数所在的对象。我们将这个字段称为“源对象”。同时,针对原函数的每个临时变量和每个参数,在新类中建立一个对应的字段保存之。
  3. 在新类中建立一个构造函数,接收源对象及原函数的所有参数作为参数。
  4. 在新类中建立一个compute函数。
  5. 将原函数的代码复制到compute()函数中。如果需要调用源对象的任何函数,请通过源对象字段调用。
  6. 编译。
  7. 将旧函数的函数本体替换为compute()函数。

9、替换算法

将函数本体替换为另一种算法。

第七章 在对象之间搬移特性

1、搬移函数

你的程序中,有个函数与其所在类之外的另一个类进行更多的交流,在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托关系,或是将旧函数完全移除。
“搬移函数”是重构理论的支柱。如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落地实现系统交付的任务。

2、搬移字段

3、提炼类

某个类做了应该由两个类做的事,建立一个新类,将相关的字段和函数从旧类搬移至新类。

4、将类内联化

某个类没有做太多的事情,将这个类的所有特性搬移至另一个类中,然后移除该类。

5、隐藏委托关系

客户端通过一个委托类来调用另一个对象时,在服务类上建立客户所需的所有函数,用以隐藏委托关系。

public Person getManager(){
	return _department.getManager();
}

只有完成了对Department所有函数的委托关系,并相应修改了Person的所有客户,我就可以移除Person中的访问函数getDepartment()了。

6、移除中间人

某个类做了过多的简单委托动作时,让客户直接调用受委托类。

7、引入外加函数

Date start = new Date(previous.getYear(),previous.getMonth(),previous.getDate()+1);

变为

Date start = nextDay(previous);
private static Date nextDay(previous.getYear(),previous.getMonth(),previous.getDate()+1);

貌似懂了一点。
外加函数终归是权宜之计,如果有可能,仍然应该讲这些函数搬移至它们应该在的地方。

8、引入本地扩展

你需要为服务类提供一些额外函数,但你无法修改这个类,建立一个新类,使它包含这些额外函数,让这个扩展类成为原类的子类或包装类。
「动机」
在子类和包装类之间做选择时,我通常首选子类,因为这样的工作量比较少。制作子类的最大障碍在于,如果原数据是可修改的,一个修改动作无法改变两个副本,这时就必须改用包装类
「做法」

  1. 建立一个扩展类,将它作为原始类的子类或包装类。
  2. 在扩展类中加入转型构造函数,所谓转型构造函数,是指“接受原对象作为参数”的构造函数。如果采用子类化方案,那么转型构造函数应该调用适当的超类构造函数;如果采用包装类方案,那么转型构造函数应该将它得到的传入参数以实例变量的形式保存起来,用作接受委托的原对象。
  3. 在扩展类中加入新特性。
  4. 根据需要,将原对象改为扩展对象。
  5. 将针对原始类定义的所有外加函数搬移至扩展类中。

第八章 重新组织数据

1、自封装字段

为字段建立取值/设置函数,并且只以这些函数来访问字段。

2、以对象取代数据值

你有一个数据项,需要与其它数据和行为一起使用才有意义,将数据项变成对象。

3、将值对象改为引用对象

4、将引用对象改为值对象

你有一个引用对象,很小且不可变,而且不易管理,此时,将它变成一个值对象。
要在引用对象和值对象之间做出选择,有时并不容易。做出选择后,你常会需要一条回头路。
如果引用对象开始变得难以使用,也许就应该将它变为值对象。引用对象必须被某种方式控制,你总是必须向其控制者请求适当的引用对象。它们可能造成内存区域之间错综复杂的关联。在分布式系统和并发系统中,不可变的值对象特别有用,因为你无需考虑它们的同步问题。

5、以对象取代数组

以对象取代数组,对于数组中的每一个元素,以一个字段来表示。
「动机」
数组是一种常见的用以组织数据的结构。不过,它们应该只用于“以某种顺序容纳一组相似对象”。有时你会发现,一个数组容纳了多种不同对象,这会给用户带来麻烦,因为它们很难记住像“数组的第一个元素是人名”这样的约定。对象就不同了,你可以运用字段名称和函数名称来传达这样的信息,也无需使用注释。而且使用对象,你还可以将信息封装起来,并使用“搬移函数”将它加上相关行为。
我之前做过一个数据上传系统,有这么个结构:

Map<String,String[]> hashMap = new HashMap<String,String[]>();
String[] data = new Data[4];
data[0] = "1";//状态state
data[1] = "1";//延展状态exstate
data[2] = "1";//数值
data[3] = "2020-12-21 23:22:00";//数据生成时间
String key = "01A01";//测点编号
hashMap.put(key,data);
...
for(String key : hashMap.keySet){
	//状态state、延展状态exstate、数值、数据生成时间
	String[] data = hashMap.get(key);
	String state = data[0];
	String exstate = data[1];
	String value = data[2];
	String time = data[3]'
}

因为数据存在基本数据、实时数据、分钟累计数据,这种结构的代码项目中比比皆是,写的那叫一个烂,这个上传程序折磨的我苦不堪言,往事不堪回首。
「做法」

@Data
public class BasicData(){
	private int state;
	private int exstate;
	private double value;
	private Date time;
}

Map<String,BasicData> hashMap = new HashMap<String,BasicData>();
BasicData basicData = new BasicData();
basicData.setState = "1";
basicData.setExstate = "1";
basicData.setValue = 3.12;
String str = "2020-12-21 23:22:00";
basicData.setTime = DateUtil.StringToDate(str,"yyyy-MM-dd hh:mm:ss");
String key = "01A01";//测点编号
hashMap.put(key,basicData);
...
for(String key : hashMap.keySet){
	//状态state、延展状态exstate、数值、数据生成时间
	BasicData basicData = hashMap.get(key);
	String state = basicData.getState();
	String exstate = basicData.getExstate();
	double value = basicData.getValue();
	Date time = basicData.getTime();
}

多么痛的领悟。
其实很简单。

/**
 @startTime 2020-12-22 21:30
 @endTime 2020-12-22 22:50
 @startPage 189 
 @endPage 235
 @efficiency 235/7 = 33.6页/天
 @needDays 412/33.6 = 12天
 @overDay 2020-12-16 + 12天 =  2020-12-27
*/

6、复制“被监视数据”

你有一些领域数据置身于GUI控件中,而领域函数需要访问这些数据。将该数据复制到一个领域对象中。建立一个Observer模式,用以同步领域对象和GUI对象内的重复数据。
「动机」
一个分层良好的系统,应该讲处理用户界面和处理业务逻辑的代码分开。之所以这样做,原因有以下几点:

  1. 你可能需要使用不同的用户界面来表现相同的业务逻辑,如果同时承担两种责任,用户界面会变得过分复杂;
  2. 与GUI隔离之后,领域对象的维护和演化都会变得更容易,你甚至可以让不同的开发者负责不同部分的开发。

7、将单向关联改为双向关联

两个类需要使用对方特性,但其间只有一条单向连接。
添加一个反向指针,并使修改函数能够同时更新两条连接。

8、将双向关联改为单向关联

去掉不必要的关联。

9、以字面常量取代魔法数

你有一个字面数值,带有特殊的含义。创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。

10、封装字段

将字段封装为private,并提供相应的访问函数。

11、封装集合

12、以数据类取代记录

记录型结构是许多编程环境的共同性质,你可能处理一些遗留程序,也可能需要通过传统API与记录结构交流,或者是从数据读出的记录。这些时候你就有必要创建一个接口类,用以处理这些外来数据。将这些数据搬移到Java的bean中。

13、以类取代类型码

14、以子类取代类型码

借助多态处理变化行为。

15、以state/strategy取代类型码

你有一个类型码,它会影响类的行为,但你无法通过继承手法消除它。此时,就可以以状态对象取代类型码。

16、以字段取代子类

你的各个子类的唯一差别就只在“返回常量数据”的函数身上,修改这些函数,使它们返回超类中的某个新增字段,然后销毁子类。

上一篇:《重构 改善既有代码的设计 1》重构原则
下一篇:【编写高质量代码:改善Java程序的151个建议】

FPGA开发避坑:AXI BRAM Controller读时序的3个关键信号(ARREADY/RREADY/RLAST)详解 本文深入解析FPGA开发中AXI BRAM Controller读时序的3个关键信号(ARREADY/RREADY/RLAST),结合Xilinx Vivado设计环境和实际工程案例,详细探讨这些信号的行为特征及其对系统性能的影响。通过ILA抓取的真实波形分析,提供调试指南和性能优化方案,帮助开发者避免常见设计陷阱,提升AXI4协议下的BRAM访问效率。 阅读详情

相关推荐

代码重构,高效编码,写出好代码是有套路的!

重构的方法往往是零散的,大家在记忆时也是零散的,不系统。代码怎么写更好,你肯定能说出几点来,但还不够系统。 这里梳理记录一些重构方法与案例,意义在于系统的梳理后可以在平时写代码时做参照,写出更好的代码。 你想想每次重构的时候都能在这篇文章里找到对应的套路那该多爽。知道的套路多了,自然能写出更好的代码,毕竟“套路得人心”嘛。 所以本文刻意最求广而全,也将不断补充更新相关案例,可以关注或收藏,不时翻出来温故下。 一、开发界的墨菲定律 下面的或许我们都经历过: 你写的bug,迟早会被后面接收的程序

950

重构系列之对象间的重构:《重构》对象之间搬移特性

在面对对象的设计中,“决定把责任放到哪儿”即使不是最重要的事情,也是最重要的事之一。我使用对象技术十几年了,但还是不能一开始就保证做对。这曾经让我很苦恼,但现在我知道,在这种情况下,可以运用重构,改变自己原先的设计。 Move Method 移动函数 类的行为做到单一职责 不要越俎代庖: 你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用。在该函数最常用引用的类中建立一个有

有心好书 1792

在 CentOS Stream 10 上搭建 Kubernetes 集群并支持开发调试与日志查看

搭建 Kubernetes 集群的每个步骤详细的文档。

灵犀物润 1640

重构——12提炼类(Extract Class)

提炼类(Extract Class) 并发和事务的风险;某个类做了两个类做的事;建立一个新类,将相关的字段和函数从旧类搬移到新类 一、动机 1、让类的抽象更清楚,让类的责任更明确 2、如果某些数据和函数总是一起出现,某些数据经常同时变化甚至彼此相依,这就表示你应该将它们分离出去 3、子类化的时候你发现某些特性需要以一种方式来子类化,另外一些特性需要以另一...

weixin_33795833的博客 973

高通AI Engine SDK(QNN)使用教程(环境配置、模型转换、量化、推理、分析)

高通AI Engine使用教程

weixin_51031772的博客 1万+

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2123

重构_改善既有代码的设计_第二版(Java代码示例)

前言 最近在读《重构_改善既有代码的设计(第2版)》这本书,一本非常经典,并且非常容易读懂的书,强力推荐刚入职场或未入职场的同学去读,书中的代码示例是用JavaScript来编写的,该文只是将书中的代码示例翻译成Java版本,并不会复制书中过多的内容,其中一些做法并不完全相同,加了自己的风格或者是说一些浅显的理解,非常欢迎各位批评和指正。 第一个示例 示例需求: 设想有一个戏剧演出团,演员们经常要...

a5f4s6f4a65f4a6sf的博客 6024

RocketMQ 5.3.1 集成 Spring Boot 3.4.3 就这么简单

RocketMQ 是一个分布式消息中间件,支持发布/订阅模型,具有高吞吐量、高可用性和事务消息等特性。它广泛应用于日志处理、订单系统和异步任务等场景。Spring Boot 3.4.3 集成 RocketMQ 5.3.1 的过程异常简单,仅需少量配置即可实现消息的生产和消费。本文从环境搭建到代码实现,覆盖了核心步骤。

lssffy的博客 1385

重构 :改善既有代码的设计

笔记,回顾

DuGuYiZhao的博客 3876

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1969

2d游戏地图编辑器_[U3D]基于MarchingCubes实现的War3Editor 地表/悬崖编辑器

花了几天时间研究清楚Marching cubes后,发现这个方法是一个非常适用于地图编辑,网格编辑,procedural 生成的工具。最大的优点有着较好的边缘,表面处理。然后我用U3D写了一个悬崖/地表的编辑器。其中使用到了Marching Cubes的2.5D,2D两种降维的方法。talk is cheap,让我看效果!DemoEditor展示https://www.zhihu.com/vide...

weixin_42504649的博客 1178

《重构 改善既有代码的设计》之重构列表

1 简介 春节期间,自己也没有阅读其他的书籍,一方面是因为家里没有空调,读书写字时很冷,另外一方面就是灯光不亮,看书时很累眼睛,最后就是在家里总是无聊,心很浮躁,静不下来学习,所以也没有看其他的书籍。 在阅读完《重构 改善既有代码的设计》自己陆续写了一些博客,当然,很多时候只是一种整理,也可以说是一种变相的温故而知新吧。 读完本书时,有一些重构手法给我留下了很深刻的印象,诸如在重新组织函数节的Ex...

不当初 1162

【DRAM存储器五十五】LPDDR5介绍--command bus training

本文详细介绍了LPDDR5命令总线训练(CBT)的两种模式操作流程。在启用ODT进行高频/中频操作前,必须对命令总线进行训练,包括调整VREF(CA)电压和CA/CS信号时序。两种模式的主要区别在于VREF(CA)设置方式:模式1通过MR12直接设置,模式2通过DMI[0]引脚捕获DQ[6:0]数据更新MR12。训练流程涉及频率切换、模式寄存器配置、pattern发送及结果采样等步骤,最终确定最佳VREF(CA)和时序参数。文章还分析了不同PHY实现可能存在的差异,如训练pattern生成方式和采样次数等。

highman110的博客 648

《重构:改善既有代码的设计》 重新组织数据  之 1

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有8种。本文介绍: 自封装字段 self encapsulate field 名称:自封装字段 self encapsulate field 概要:为该字段建立取值/设值函数,并且只以这些函数来访问字段 动机: 直接访问一个字段,但与字段之间的耦合关系逐渐变的笨拙。完成自我封装后,可以在子类中根据自己的需要随意覆写取值/...

giantmfc123 701

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4703

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《重构:改善既有代码的设计》 重新组织数据  之 2

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有8种。本文介绍: 以对象取代数据值 replace data value with object 名称:以对象取代数据值 replace data value with object 概要:有一个数据项,需要与其他数据和行为一起使用才有意义。将数据项变成对象 动机: 开发初期,以简单的数据线表示简单情况。比如一个字符串...

giantmfc123 297

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

《重构:改善既有代码的设计》 重新组织数据  之 15

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有16种。本文介绍: 以state/strategy取代类型码 replace type code with state/strategy 名称:以state/strategy取代类型码 replace type code with state/strategy 概要:有一个类型码,会影响类的行为,但你无法通过继承手法消除...

giantmfc123 385

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

重构——改善既有代码的设计 读书笔记

重构改善既有代码的设计-学习(一):封装-优快云博客。

m0_49499183的博客 1554

「重构:改善既有代码的设计」实战篇

作为(名词),重构是指在不改变软件外在功能的前提下,调整其内部结构的过程。这样的调整旨在提高软件的可理解性和降低修改成本。作为(动词),重构意味着通过一系列细微的步骤,不断地调整软件结构,以保持其设计的整洁和可维护性。重构是一种精练的技艺,它通过小的、计划好的修改来减少引入错误的风险。本质上,重构是对已完成的代码进行设计上的改进。

京东科技开发者 8346

[重构] 改善既有代码的设计

在做微服务拆分相关的课题,会涉及到模块化重构和代码重构相关的东西,重构的速度和质量很大程度上取决于代码原本质量的好坏,所以看了一下这本书,有些知识点我也不知道,所以摘抄了其中比较重要的部分规则。 文章目录重构——改善既有代码的设计序前言第1章 重构,第一个案例第2章 重构原则第3章 代码的坏味道第4章 构筑测试体系第5章 重构列表第6章 重新组织函数第7章 在对象之间搬移特性第8章 重新组织数据第...

Blanchedingding的博客 689

重构-改善既有代码的设计:类数据-重新组织数据的16种方法(六)

重新组织数据: 1.Self Encapsulate Field 自封装字段 间接访问类的属性:你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙。为这个字段建立取值/设值函数,并且只以这些函数来访问字段。 间接访问变量的好处是,子类可以通过覆写一个函数而改变获取数据的途径;它还支持更灵活的数据管理方式,例如延迟初始化。 如果你想访问

黄规速博客:学如逆水行舟,不进则退 1万+

《重构:改善既有代码的设计》 重新组织数据  之 13

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有16种。本文介绍: 以类取代类型码 replace type code with class 名称:以类取代类型码 replace type code with class 概要:类中有一个数值类型码,但它并不影响类的行为,以一个新的类替换改数值类型码 动机:类型码作为函数参数,编译器无法进行类型检验。 做法: ...

giantmfc123 256

重构-改善既有代码的设计 读书心得(一)

目录《重构-改善既有代码的设计》第一章第二章第三章 代码的坏味道第六章 重新组织函数 《重构-改善既有代码的设计》 这本书有些“年纪”了,按理说it界的书都是读新不读旧。但它有点特别,其中的关于重构和面向对象的思想我觉得放到现在也是不过时的。好多时候我们考察一个程序员,都是看他懂多少东西,知道多少概念,做过什么项目,但其实一个程序员最关键的素质是要写出好的代码。好的代码不是一天炼成,往往都要经过大...

yes1983的专栏 1804
上一篇: 《重构 改善既有代码的设计 1》重构原则
下一篇: 《重构 改善既有代码的设计 3》代码的可理解性应该是我们虔诚追求的目标
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2935原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值