读程序员的制胜技笔记07_重构

这篇具有很好参考价值的文章主要介绍了读程序员的制胜技笔记07_重构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读程序员的制胜技笔记07_重构文章来源地址https://www.toymoban.com/news/detail-746064.html

1. 理查德·费曼(Richard Feynman)曾经说过:“如果你想真正学习一门学科,就写一本关于它的书。”

2. 重构是改变代码结构的艺术

2.1. 写出好代码通常只是成为高效开发者的一半标准

2.2. 另一半标准则是敏捷地转换代码

2.3. IDE提供了很好的重构工具

2.4. 将重构视为一项日常任务,是我们编程工作的一部分

2.5. 大多数时候,重构操作根本不影响代码的可靠性

3. 要点

3.1. 重构带来的好处比你认为的还要多

3.2. 可以在增量步骤来完成重大的架构改动

3.2.1. 总得有一个路线图来指导进行增量工作

3.3. 使用测试以在大型重构工作中减少隐患

3.4. 你要估计的不仅仅是成本,还有风险

3.5. 当重构的成本大于收益时,就得对重构打个问号了

3.6. 使用依赖注入来消解那些强依赖关系

3.6.1. 可以降低代码的刚性

4. 为什么要重构

4.1. 减少重复,增加代码的可复用场景

4.1.1. 将一个可以被其他组件复用的类移到公共位置,这样其他组件就能使用它

4.1.2. 从代码中提取方法并使它们能够被复用

4.2. 让实现代码和你的心理预期更加接近

4.2.1. 重命名是重构过程中的一部分,可以帮你实现更好的设计,使之更接近你的心理预期

4.3. 让代码更容易理解和维护

4.4. 防止某些类别的bug出现

4.4.1. 把一个类改成一个结构,可以防止与null有关的bug

4.4.2. 在项目中启用可空引用(nullable reference)并将数据类型改为不可为空(non-nullable)的,这是重构中避免bug的基本操作

4.5. 为重大的架构变化做准备

4.6. 摆脱代码中的刚性部分(rigid part of the code)

4.6.1. 通过依赖注入,你可以去掉依赖关系,拥有一个松散的耦合设计

5. 架构修改

5.1. 一次性进行大规模的架构修改几乎没有什么好下场

5.2. .NET Framework是最初的软件生态系统,在20世纪90年代末创建,增强了开发者的生活幸福感

5.3. .NET Framework相当于JDK(Java开发工具包),JDK也有Java运行时、Java语言编译器、Java虚拟机,可能还有一些从Java衍生的其他东西

5.4. 微软创建了一个通用的API规范,定义了一个通用的.NET功能子集,被称为.NET标准

5.4.1. Java没有类似的问题,因为甲骨文公司用它的律师“梦之队”成功地扼杀了所有不兼容的竞品

5.5. 微软后来创建了新一代的.NET Framework,它是跨平台的

5.5.1. 它最初被称为.NET Core

5.5.2. 从.NET 5开始改名为.NET

5.5.3. 与.NET Framework不直接兼容,但它们可以使用一个共同的.NET标准子集规范进行互操作

5.6. 识别组件

5.6.1. 处理大型重构工作的最好方式就是将你的代码分割成在语义上不同的组件(component)

5.6.2. MVC(model-view-controller,模型-视图-控制器模式)

5.6.3. MVVM(model-view-view model,模型-视图-视图模型)

5.6.4. MVP(model-view-presentation,模型-视图-演示模式)

5.6.5. 将不同的关注点相互解耦

5.7. 评估工作量和风险

5.7.1. 如何知道会有多少工作量

5.7.1.1. 只有在对两个框架的工作方式有了初步的概念之后才能确定

5.8. 树立威信

5.8.1. 其他开发同事不可能没注意到代码库里的新项目,但只要你事先和他们沟通你要实现的改动,并且他们能直接适应,那么在项目进展中实现改动应该是没有问题的

5.8.2. 核心目的还是减少工作量,与此同时尽可能地保持与主分支的同步

5.9. 重构让重构更容易

5.9.1. 在跨项目移动代码时,你会遇到比较难拆分的强依赖关系

5.9.2. 依赖注入(dependency injection,DI)

5.9.2.1. 不要把它和依赖倒置(dependency inversion)混淆

5.9.2.2. 基本含义是“在抽象层面的依赖”(depend on abstraction)

5.10. 最后冲刺

5.10.1. the final stretch

5.10.2. 在某些时候,你必须冒着与其他开发者起冲突的风险,将你的代码迁移到新的代码库中

6. 可靠重构

6.1. 让重构可靠的“秘术”是测试

6.2. 如果你能确保你的代码有一个良好的测试覆盖率,你可以有更多重构的操作空间

7. 什么时候不重构

7.1. 重构的好处是,它能让你思考代码如何改进

7.2. 重构的坏处是,在某些时候,你可能会仅仅为了重构而重构,它成了一种目的而不是一种方法

7.3. 不重构的标准

7.3.1. 重构的唯一理由是“这样更优雅”

7.3.1.1. 优雅不仅是主观的,而且是模糊的,因此意义不大

7.3.2. 目标组件赖于一个非常小的组件集

7.3.2.1. 意味着以后对它的重构和迁移会非常方便

7.3.3. 重构缺乏测试覆盖

7.3.3.1. 阻止你重构的红灯,尤其是在这个组件的依赖包袱非常重的情况下

7.3.3.2. 组件缺少测试也意味着你不知道你在做什么

7.3.4. 一个公共依赖项

7.3.4.1. 即便测试覆盖率还不错,并且重构理由也很充分,你也可能会打乱团队的工作流程,影响到你同事的工作效率

7.3.4.2. 如果你追求的好处不足以抵消操作成本,那你应该考虑推迟重构操作

7.3.5. 符合任何一条,就应该考虑避免重构,或者至少推迟重构的时间

到了这里,关于读程序员的制胜技笔记07_重构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读程序员的制胜技笔记10_可口的扩展

    2.8.3.1. 纯函数有一个好处,它们是100%线程安全的 2.9.1.1. 这套数据结构并不都是无锁的 2.9.1.2. 虽然它们依然使用锁,但它们是被优化过的,锁的持续时间会很短,保证了其速度,而且它们可能比真正的无锁替代方案更简单 2.9.2.1. 其中原始数据从未改变,但每个修改操作都

    2024年02月05日
    浏览(68)
  • 读程序员的制胜技笔记13_安全审查(上)

    5.6.1.1. 任何你不想丢失或泄露的东西都是资产,包括你的源代码、设计文档、数据库、私钥、API令牌、服务器配置,还有Netflix观看清单 5.6.2.1. 每台服务器都会被一些人访问,而每台服务器都会访问其他一些服务器 6.1.1.1. 设计时首先要考虑到安全问题,因为在既有基础上去

    2024年02月05日
    浏览(62)
  • 读程序员的制胜技笔记09_死磕优化(下)

    7.5.3.1. 在256KB之后,提升突然变得杯水车薪

    2024年02月05日
    浏览(74)
  • 读程序员的制胜技笔记08_死磕优化(上)

    4.3.1.1. 只能给你一堆用于比较的数字 4.3.1.2. 不能告诉你代码的运行速度是快还是慢 4.3.1.3. 可以告诉你它们比其他一些代码运行得慢还是快 4.3.5.1. 可以消除因测量误差或者调用开销产生的波动 4.3.5.2. 适用于微观基准测试 4.3.5.2.1. 适用于微观基准测试 4.3.5.3. 基准测试并没

    2024年02月05日
    浏览(81)
  • 读程序员的制胜技笔记02_算法与数据结构

    3.1.1.1. 根据你的需要,可以有更智能的算法 3.1.3.1. 算法本身并不意味着它很聪明 3.2.1.1. public static bool Contains(int[] array, int lookFor) { for (int n = 0; n < array.Length; n++) {        if (array[n] == lookFor) {            return true;        }    }    return false; } 3.3.1.1. public sta

    2024年02月06日
    浏览(62)
  • 读程序员的制胜技笔记12_与Bug共存(下)

    2.2.1.1. 故障代码(failing code)放在一个try语句块里,然后加上一个空的catch语句块,就大功告成了 2.2.1.2. 开发者为整个应用程序添加了一个通用的异常处理程序,但实际上这个程序的工作原理就是忽略所有的异常,也就防止所有的崩溃 2.2.1.3. 如果像那样添加一个空的处理程序

    2024年02月05日
    浏览(59)
  • 读程序员的制胜技笔记11_与Bug共存(上)

    2.7.3.1. 在构造时验证其有效性,这样一来就不可能包含无效值 2.8.2.1. 其主张一个花括号与声明在同一行 2.9.1.1. 看看这些现成的类型 2.9.3.1. 它代表持续时间 2.9.3.2. 你没有理由用TimeSpan以外的任何东西来表示持续时间,即使你所调用的函数不接受TimeSpan作为参数 2.9.4.1. 它也

    2024年02月05日
    浏览(56)
  • 读程序员的制胜技笔记04_有用的反模式(下)

    1.3.1.1. 自己做自己的甲方 3.2.2.1. 紧耦合(tight coupling) 3.2.2.2. 依赖性是万恶之源 3.3.7.1. 因为你可能需要用接口而不是具体的引用来定义依赖关系,但这也会使代码摆脱依赖关系 5.2.3.1. 没有其他错误发生时执行的代码部分 5.3.3.1. 退出点(exit point)是指函数中导致其返回给调用

    2024年02月06日
    浏览(86)
  • 读程序员的制胜技笔记03_有用的反模式(上)

    4.5.4.1. 你在物理数据库结构上增加了一个依赖项 4.5.4.2. 如果你需要改变信息表的布局或所使用的数据库技术,你就必须检查所有的代码,确保所有的东西都能与新的表布局或新的数据库技术一起工作 4.5.6.1. 这是保持组件或整个层尽可能简单的关键 4.8.3.1. 每个成员只对自己

    2024年02月06日
    浏览(47)
  • 读程序员的README笔记07_测试(下)

    2.5.2.1. 首先应该关注代码中的高风险的区域 2.5.2.2. 那些低风险或被废弃的代码并不值得测试 3.2.1.1. 如果网络出现问题,那么测试也会失败 3.5.2.1. 使用常数种子的随机数生成器的测试将总是通过或总是失败 3.7.3.1. 注入式时间戳将让你使用模拟来精确控制测试中的时间流逝

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包