夏夜寂寞属壁虎对《重构(第2版)》的笔记(3)

夏夜寂寞属壁虎
夏夜寂寞属壁虎 (像树一样自由)

想读 重构(第2版)

重构(第2版)
  • 书名: 重构(第2版)
  • 作者: [美] Martin Fowler
  • 副标题: 改善既有代码的设计
  • 页数: 422
  • 出版社: 人民邮电出版社
  • 出版年: 2019-3
  • 3.11 基本类型偏执(Primitive Obsession) 78
    大多数编程环境都大量使用基本类型,即整数、浮点数和字符串等。一些库会引入一些小对象,如日期。但我们发现一个很有趣的现象:很多程序员不愿意创建对自己的问题域有用的基本类型,如钱、坐标、范围等。于是,我们看到了把钱当普通数字来计算的情况、计算物理量时无视单位(如把英寸与毫米相加)的情况以及大量类似if (a < upper && a >lower)这样的代码。 字符串是这种坏味道的最佳培养皿,比如,电话号码不只是一串字符。一个体面的类型,至少能包含一致的显示逻辑,在用户界面上需要显示时可以使用。“用字符串来代表类似这样的数据”是如此常见的臭味,以至于人们给这类变量专门起了一个名字,叫它们“类字符串类型”( stringly typed)变量。
    引自 3.11 基本类型偏执(Primitive Obsession) 78

    《算法》里把图这个数据类型做成了相对复杂的类(比如增加邻接边数量这一成员变量)。一开始我还对一些看似多余的逻辑感到烦躁,后来看到拓扑排序的bfs算法时发现这种做法省了一部分算法实现的代码量。当然计算钱和物理量时在这方面欠缺考虑导致的后果自然更严重。

    2020-08-26 20:12:23 回应
  • 1.10 结语 43
    开展高效有序的重构,关键的心得是:小的步子可以更快前进,请保持代码永远处于可工作状态,小步修改累积起来也能大大改善系统的设计。这几点请君牢记,其余的我已无需多言。
    引自 1.10 结语 43

    个人心得:小步改动不仅适用于重构代码,也适用于构建代码项目。小步改动、小步测试,充分利用多分支版本控制系统的回退、分支功能,commit -m的注释也要写清楚,包括但不限于改动的类型、对什么文件做了改动(虽然可以用git diff查看两个commit的差别,但如果改动的文件少最好加上)、用一句话进一步阐述具体改动,可以大大便利写/重构代码、debug的过程。

    补充:要保持代码永远处于工作状态,可以用 pre-commit 一类的钩子检查提交到 git 前代码的状态,比如是否能通过函数功能测试、文档是否齐全、使用的依赖是否都没有违反 license。

    2020-12-17 14:05:15 1人喜欢 回应
  • 2.5 重构的挑战 55
    很多团队采用这样的版本控制实践:每个团队成员各自在代码库的一条分支上工作,进行相当大量的开发之后,オ把各自的修改合并回主线分支(这条分支通常叫master或trunk),从而与整个团队分享。常见的做法是在分支上开发完整的功能,直到功能可以发布到生产环境,才把该分支合并回主线。这种做法的拥趸声称,这样能保持主线不受尚未完成的代码侵扰,能保留清晰的功能添加的版本记录,并且在某个功能出问题时能容易地撤销修改。 这样的特性分支有其缺点。在隔离的分支上工作得越久,将完成的工作集成(Integrate)回主线就会越困难。为了减轻集成的痛苦,大多数人的办法是频繁地从主线合并(merge)或者变基( rebase)到分支。但如果有几个人同时在各自的特性分支上工作,这个办法并不能真正解決问题,因为合并与集成是两回事。如果我从主线合并到我的分支,这只是一个单向的代码移动一一我的分支发生了修改,但主线并没有。而“集成”是一个双向的过程:不仅要把主线的修改拉(pull)到我的分支上,而且要把我这里修改的结果推(push)回到主线上,两边都会发生修改。假如另一名程序员 Rachel正在她的分支上开发,我是看不见她的修改的,直到她将自己的修改与主线集成;此时我就必须把她的修改合并到我的特性分支,这可能需要相当的工作量。其中困难的部分是处理语义变化。现代版本控制系统都能很好地合并程序文本的复杂修改,但对于代码的语义它们一无所知。如果我修改了一个函数的名字,版本控制工具可以很轻松地将我的修改与 Rachel的代码集成。但如果在集成之前,她在自已的分支里新添调用了这个被我改名的函数集成之后的代码就会被破坏。
    引自 2.5 重构的挑战 55

    这学期和小组队友用git协同开发安卓app的时候的确很被这点困扰。之前没意识到这一点,队友也觉得应该在自己的分支上把功能写完再并入master,导致每次把自己的分支merge到master上的时候总要花一些时间专门处理merge conflicts。

    2020-12-18 10:11:12 回应

夏夜寂寞属壁虎的其他笔记  · · · · · ·  ( 全部179条 )

咖啡行者的全息烘焙法(第二版)
6
花衣魔笛手
3
我将宇宙随身携带
4
Fluent Python, 2nd Edition
5
Programming Rust, 2nd Edition
2
程序员的职业素养
1
代码2.0
2
我与地坛
1
程序员修炼之道(第2版)
2
C++语言的设计和演化
3
古希腊思想通识课:希罗多德篇
1
R语言实战
1
权力意志与永恒轮回
2
代码大全(第2版)
2
TCP/IP网络编程
1
程序员的自我修养
5
历史学十二讲(增订本)
2
深入理解计算机系统(原书第3版)
1
The Complete Software Developer's Career Guide
1
哲学是做出来的
3
深度探索C++对象模型
2
七周七语言
1
蒙田随笔
3
你想活出怎样的人生
3
历史的巨镜
1
Unix/Linux编程实践教程
2
深入Linux内核架构
1
社会学之思(第3版)
1
C++ Primer
1
Operating Systems
1
深入理解计算机系统(原书第2版)
2
C专家编程
1
C Primer Plus
2
やがて君になる 佐伯沙弥香について(3)
1
Selected Poems of Dickinson
3
On Love and Loneliness
3
数学之美 (第二版)
1
中国近代思想史论
1
家庭、私有制和国家的起源
5
我的孤独是一座花园
1
鲁拜集
1
家庭、私有制和国家的起源
1
禅与摩托车维修艺术
4
Mother, Madonna, Whore
1
卡尔·波普尔
1
裴洞篇
2
劝学篇
4
计算机病毒防范艺术
1
30天自制操作系统
5
黑客
1
黑客与画家
2
复杂性思想导论
4
汇编语言(第3版)
1
The C Programming Language
4
阿拉伯─伊斯兰文化史(第一册)
3
The Communist Manifesto
3
论优美感和崇高感
1
How Behavior Spreads
2
同性恋研究
3
沙漏做招牌的疗养院
3
现代性与大屠杀
7
麦克白
1
道德形而上学的奠基
1
极权主义的起源
3
自由与多元论
5
社会运动、政治暴力和国家
6
こころ
4
Justice
1
Word Power Made Easy
1
JavaScript
8
Political Philosophy
8