读程序员的README笔记03_变更代码

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

读程序员的README笔记03_变更代码

1. 行为准则

读程序员的README笔记03_变更代码文章来源地址https://www.toymoban.com/news/detail-749128.html

2. 变更代码

2.1. 变更代码和在新代码库中写代码完全不一样,你必须在不破坏现有行为的情况下进行这些修改

2.1.1. 必须理解其他开发者的想法,坚持原有的代码风格和设计模式

2.1.2. 必须在工作中温和地改进代码库

2.2. 善于利用现有代码

2.2.1. 安全地在现有代码库中修改代码的步骤

2.2.1.1. 定义变更点

2.2.1.2. 寻找测试点

2.2.1.3. 打破依赖关系

2.2.1.4. 编写测试

2.2.1.5. 进行修改和重构

2.2.2. 找到你需要修改的代码,并想出如何测试它

2.2.2.1. 如果需要的话,为了让测试成为可能,可以对代码进行重构

2.2.2.2. 针对现有的软件行为也要添加测试用例

2.2.2.3. 一旦竖起栅栏,你的修改点周围的区域就得到了很好的保护,然后就可以在里面修改代码了

2.2.3. 一旦你定位了代码,就要找到它的测试点

2.2.3.1. 测试点是你想要修改的代码的入口,也就是测试用例需要调用和注入的区域

2.2.3.2. 测试点揭示了代码在被你变更之前的行为,你需要使用这些测试点来测试你自己的变更

2.2.4. 依赖关系不是指类库或服务的依赖关系,而是指测试你的代码时所需要的对象或方法

2.2.4.1. 打破依赖关系意味着改变代码结构,使其更容易测试

2.2.4.1.1. 将一个大的、复杂的方法拆分成多个小的方法,这样就可以分别去测试独立的特性片段
2.2.4.1.2. 引入一个接口(或其他中介),为测试提供一个复杂对象的简单实现——不完整,但要满足测试需要
2.2.4.1.3. 注入明确的控制点,允许你模拟难以控制的执行的切片,如时间的推移

2.2.4.2. 你只有改变代码,才能将你的测试挂起来,并提供合成的输入

2.2.4.2.1. 这些代码变更一定不要改变原有的代码行为

2.2.5. 不要为了方便测试去改变访问声明

2.2.5.1. 将私有(private)方法和变量公开以让测试用例访问代码,但同时也破坏了封装,这是一种糟糕的方式

2.2.5.2. 破坏封装会增加你在项目的生命周期内必须保证的原有行为一致性的覆盖面积

2.2.6. 当你重构和打破依赖关系时,应该添加新的测试来验证旧的行为

2.2.6.1. 在迭代过程中要频繁地运行测试套件,包括新的和旧的测试用例

2.2.6.2. 考虑使用自动测试工具来生成捕获现有行为的测试用例

2.3. 过手的代码要比之前更干净

2.3.1. 帮助你的代码随着时间的推移而变得更好

2.3.2. 在不影响整个项目持续运转的情况下要持续地重构工程,这样重构的成本就会平摊在多次的版本更迭中

2.3.3. 当你修复错误或增加新的特性时,只清理有关联性的代码

2.3.4. 不要不顾一切地去找“脏”代码,要“随缘”一些

2.3.5. 尽量将清理代码的提交和改变行为的提交各自分开

2.3.5.1. 分开提交可以让你在不会丢失针对代码清理的提交的基础上,更容易地去恢复代码变更

2.3.5.2. 较小的提交也更容易针对变更的部分进行评审

2.3.6. 代码异味(code smell)

2.3.6.1. 要随时定位有异味的代码

2.4. 做渐变式的修改

2.4.1. 使用较小规模的提交

2.5. 对重构要务实

2.5.1. 重构是指在不改变软件行为的情况下改进内部代码结构

2.5.1.1. 经常发生在添加新特性的时候,因为它使新特性可以更容易地被添加

2.5.1.2. 在修复bug的过程中,则经常删除代码

2.5.1.3. 使用重构以打破依赖关系是工作中风险最大的部分

2.5.1.3.1. 采取小步前进的方式,在这个阶段不要引入任何新特性

2.5.2. 重构并不总是明智的选择

2.5.2.1. 因为团队的工作有截止日期和排他的优先事项,重构需要花费时间

2.5.2.2. 你的团队可能会决定忽略重构,而去开发新特性

2.5.3. 重构的成本也可能超过其价值

2.5.3.1. 正在被替换的旧的、废弃的代码不需要被重构

2.5.3.2. 低风险或很少被触及的代码也不需要

2.6. 善用IDE

2.6.1. IDE在重构时特别有帮助

2.6.2. IDE使重构变得如此容易

2.7. 代码变更都应该被提交到版本控制系统(VCS)

2.7.1. 在开发过程中,尽早并频繁提交你的修改

2.7.2. 频繁地提交可以显示出代码随着时间的推移而发生的变化,方便你撤销修改,并将之作为一份远程备份

3. 避“坑”指南

3.1. 现有的代码都多多少少地背负历史包袱

3.2. 继承原有的代码标准可以保持代码的可读性,但前后的不统一将使开发人员难以理解代码

3.3. 如果你想重构代码或重定义标准,你的改进就必须是一个数量级层面的改进

3.3.1. 小的收益是远远不够的,因为成本太高了

3.3.2. 大多数工程师低估了惯例的价值,而高估了忽视惯例的收益

3.4. 保守一些的技术选型

3.4.1. 成功的公司留用旧的代码,比如旧的类库和旧的模式的原因是成功需要时间,而在技术上大动干戈会让人分心

3.4.2. 新技术的问题是它不太成熟

3.4.2.1. 所有的技术都会发生故障,但旧的东西以可预测的方式发生故障,新东西往往会以令人惊讶的方式发生故障

3.4.2.2. 缺乏成熟度意味着更小的社区、更低的稳定性、更少的文档,以及更差的兼容性

3.4.2.3. 新技术的收益必须超过其成本

3.4.3. 一种语言可能具有很大的优势:一种特定的编程范式,更易于实验,或消除某些类型的代码错误

3.4.3.1. 一种语言的优势必须与它的劣势保持平衡

3.4.3.2. 价值数十亿美元的公司都是建立在成熟但有些无聊的编程语言之上的,伟大的软件基本都是用C、Java、PHP、Ruby和.NET编写的

3.4.3.3. 除非某种语言正在消亡,否则它的年龄和缺乏吸引力都很难成为反对使用它的理由

3.5. 不要特立独行

3.5.1. 要因为你不喜欢你公司(或行业)的标准就忽视它们,编写非标准的代码意味着它将无法适应公司的环境

3.5.2. 改变被广泛采用的东西肯定进展很缓慢,但并不意味着不值得这样做

3.6. 不要只分叉而不向上游提交修改

3.6.1. 分叉(fork)是对一个代码库进行完整的、独立的复制,分叉之后的代码库有自己的主干、分支和标签

3.6.2. 分叉操作可以让那些对主代码库没有写入权限的人仍然可以对项目做出贡献,这是一种正常而健康的做法

3.6.3. 不太健康的做法是只分叉代码库而不打算回馈修改

3.6.3.1. 这种情况发生在对项目的方向有分歧的时候,原来的项目被废弃了,或者是很难把修改的代码合并到主代码库里

3.6.4. 分叉公司内部的代码库并进行维护特别有害

3.6.5. 没有及时贡献到上游代码库的小调整会随着时间的推移而变得复杂

3.7. 克制重构的冲动

3.7.1. 重构工作常常升级为全方位的重写

3.7.2. 不要以为重构工作会很轻松,这将是一个艰难的过程

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

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

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

相关文章

  • 读程序员的README笔记11_软件交付(下)

    1.3.5.1. 通过持续交付,人力被完全从部署环节中移除 1.3.5.2. 打包、测试、发布、部署,甚至展开环节都是自动化的 1.3.6.1. Puppet、Salt、Ansible和Terraform等现成的解决方案可以与现有的工具集成,并且它们是专门为了自动化部署而设计的 1.4.4.1. 只需再次指向旧的版本 1.5.1.1. 

    2024年02月04日
    浏览(48)
  • 读程序员的README笔记10_软件交付(上)

    3.1.1.1. 打包一个构件称为发布 3.1.3.1. 部署的软件还不能被用户访问 3.1.3.1.1. 只是被安装了而已 3.1.3.2. 一旦部署,软件就会通过将用户转移到新的软件上而进行展开 3.1.4.1. 交付过程是更大的产品开发周期中的一部分 6.10.2.1. 每季度或每年发布一次

    2024年02月04日
    浏览(140)
  • 读程序员的README笔记01_学习如何学习

    6.3.2.1. 错误是不可避免的。成为一名软件工程师的路途艰辛,我们有时会失败 6.5.4.1. 代码从不说谎。注释有时却会。 6.5.4.1.1. Code never lies. Comments sometimes do 6.5.4.1.2. 去读源代码,因为它并不总是与设计文档相吻合 6.5.4.1.3. 不要只读你自己的代码库,还要去阅读高质量的开

    2024年02月05日
    浏览(36)
  • 读程序员的README笔记04_防御式编程

    1.2.1.1. 切记让你的代码安全而有弹性 1.2.1.2. 编写拥有良好防御性的代码是一种对那些运行你的代码的人(包括你自己!)富有同情心的表现 1.2.1.3. 防御性的代码较少发生故障,就算它发生故障,也更有可能恢复 1.2.1.4. 安全的代码利用编译时的校验来避免运行时的故障,使

    2024年02月05日
    浏览(37)
  • 读程序员的README笔记18_职业生涯规划

    3.1.5.1. 他们的工作职责之一是管理他们的团队,而管理的一部分就是对你投入时间 3.1.5.2. 对管理者而言,反复取消一对一面谈可以是一个有价值的信号 3.3.2.1. 每个目标都附有3到5个关键结果,它们是标志着目标达成的具体指标 3.3.2.2. 不要把关键结果变成待办事项清单 3.

    2024年02月04日
    浏览(37)
  • 读程序员的README笔记13_技术设计流程(上)

    3.4.1.1. 外界干扰是深度工作的“杀手” 3.4.1.2. 避免所有的交流方式 3.4.1.2.1. 关闭聊天 3.4.1.2.2. 关闭电子邮件 3.4.1.2.3. 禁用电话通知 3.4.1.2.4. 换个地方坐 3.4.2.1. 有形产出是一份设计文档 4.2.3.1. 如果有一个以上的问题,询问哪些问题是最优先的 4.3.7.1. 注意与外人交流时不

    2024年02月04日
    浏览(52)
  • 读程序员的README笔记14_技术设计流程(下)

    1.4.2.1. 该项目将需要至少一个月的工程时间 1.4.2.2. 变更将对软件的扩展和维护产生长期的影响 1.4.2.3. 变更将显著影响其他团队 1.5.2.1. 设计文档是一种工具,可以帮助你思考、获得反馈、让你的团队了解情况、培养新的工程师,并推动项目规划 1.5.5.1. 阅读大量的设计文档

    2024年02月04日
    浏览(31)
  • 读程序员的README笔记05_日志、监控与配置

    6.1.1.1. 测量的是某个事件发生的次数 6.1.1.2. 通过使用计数器获得缓存命中数和请求总数,你就可以计算出缓存命中率 6.1.2.1. 一个基于时间点的测量值 6.1.2.2. 既可以上升又可以下降 6.1.3.1. 根据事件的大小幅度分成不同的范围 6.1.3.2. 每一个范围都会有一个计数器,每当某

    2024年02月05日
    浏览(34)
  • 读程序员的README笔记17_构建可演进的架构(下)

    1.3.3.1. 开发人员可以只专注于和自己相关的字段,因为它们会继承其他字段的默认值 1.3.3.2. 默认值可使大型API在感觉上很小巧 1.4.1.1. OpenAPI通常用于RESTful服务 1.4.1.2. non-REST服务则使用Protocol Buffers、Thrift或类似的接口定义语言(interface definition language,IDL) 1.4.1.3. 接口定义工

    2024年02月04日
    浏览(41)
  • 读程序员的README笔记16_构建可演进的架构(上)

    3.1.1.1. 致软件依赖于其他的API或代码行为 3.1.1.2. 依赖性显然不可避免,甚至是可取的,但必须取得平衡 3.1.1.3. 高依赖性的系统很难修改 3.1.1.3.1. 它们有紧密的耦合性和高度的变更放大效应 3.1.1.3.2. 紧密的耦合性是指那些严重依赖彼此的模块,它们导致了更高的变更放大的

    2024年02月04日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包