0_refactor (EN)

Essentially, refactoring is improving the design of code after it’s been written. If you want to add a feature to a program, but find that the code isn’t easy to change due to a lack of good structure, refactor that program first so that it’s easier to add the feature, and then add the feature. It is the change in requirements that makes refactoring necessary. The refactoring technique is to modify the program at a tiny pace....

September 5, 2024

Deep Dive Into Design Patterns

一、面向对象 程序设计 简介 对象之间的关系 依赖:对类 B 进行修改会影响到类 A 。 关联:对象 A 知道对象 B。类 A 依赖于类 B。 聚合:对象A知道对象B且由B构成。类A依赖于类B。 组合:对象 A 知道对象 B、由 B 构成而且管理着 B 的生命周 期。类 A 依赖于类 B。 实现: 类 A 定义的方法由接口 B 声明。 对象 A 可被视为对象 B。类 A 依赖于类 B。 继承: 类 A 继承类 B 的接口和实现, 但是可以对其进行扩 展。对象 A 可被视为对象 B。类 A 依赖于类 B。 二、设计模式简介 设计模式是针对软件设计中常见问题的工具箱, 其中的工具 就是各种经过实践验证的解决方案。 创建型模式提供创建对象的机制, 增加已有代码的灵活性和可复用性。 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。 行为模式负责对象间的高效沟通和职责委派。 三、软件设计原则 优秀设计的特征 代码复用 代码复用是减少开发成本时最常用的方式之一。 复用的三个层次:...

September 5, 2024

Refactor

本质上,重构就是在代码写完之后改进其设计。 如果你想给程序添加一个功能,但发现由于结构不佳导致代码不易修改,那么应该先重构,让它更容易加功能,然后再加功能。 正是需求的变化使得重构变得必要。 重构的技巧是以极小的步幅修改程序。一旦出错,也更容易被发现。 好代码的检验标准:它有多容易被修改。 总结: 高效且有条理的重构关键点是:小步快跑、让代码始终处于可工作的状态、微小改动最终会累积成更好的系统设计。重构不是“银弹”,更像“银钳子”——它能帮助你始终牢牢控制住代码。重构是一种工具。 1. 代码中的坏味道(Bad Smells) 1. 神秘命名(Mysterious Name) 计算机科学只有两件难事:缓存失效(cache invalidation) 以及命名(naming things)—— Phil Karlton 命名是编程中最难的两件事之一。因此,重命名大概也是最常用的重构手法:包括修改函数声明(用于重命名函数)、重命名变量、重命名字段。 2. 全局数据(Global Data) 封装变量(Wrapped Variables)。少量全局数据未必有害,但数量越多,处理起来的难度往往呈指数级上升。 3. 可变数据(Mutable Data) 封装变量可以确保所有数据更新操作都通过很少的几个函数完成,从而更易监控与演进。 如果一个变量在不同时间存放不同含义的东西,可以用“拆分变量(Split Variable)”把它拆成各司其职的多个变量,从而避免危险的更新操作。 使用“搬移语句(Move Statements)”与“提炼函数(Extract Function)”,尽量把逻辑从处理更新操作的代码里挪出去,把无副作用的代码与执行数据更新的代码分离开。 在设计 API 时,可以使用 命令-查询分离(Command-Query Separation, CQS) 来分离查询函数与修改函数。 尽早使用 移除设值函数(Remove Setting Method / Remove set-value functions) 来缩小变量的作用域。 4. 过长函数(Long Functions) 主动分解函数。 原则:每当我们觉得需要用注释解释某段代码时,就把需要解释的内容提炼成一个独立函数,并按“目的”命名(而不是按实现方式命名)。 什么样的函数算太长?超过 50 行?超过 70 行?关键不在于行数,而在于函数的“做什么(what)”与“怎么做(how)”之间的语义距离有多远。 如何判断应该提炼哪段代码?一个好技巧是去找注释:注释往往提示了“做什么”与“怎么做”的语义距离。 条件表达式和循环也常常是需要提炼的信号。 条件表达式可以通过分解条件(Extract/Decompose Conditional)来处理。 对于巨大的 switch,每个分支都应该通过提炼函数变成一次独立的函数调用。 如果存在多个 switch 都基于同一个条件进行分支选择,应考虑用多态替换条件表达式(Replace Conditional with Polymorphism)。...

September 5, 2024

重构(中文)

Thinking… We just translate sentence. Keep markdown bold. Should be Chinese: “基本上,重构就是在代码已写完后改进其设计。” Ensure preserve markdown. …done thinking. 基本上,重构就是在代码已写完后改进其设计。 Thinking… We just translate text to Simplified Chinese. Keep Markdown. There’s only a paragraph. No code fences or inline code. So translate: “If you want to add a feature to a program, but find that the code isn’t easy to change due to a lack of good structure, refactor that program first so that it’s easier to add the feature, and then add the feature....

September 5, 2024