000-重构的定义

重构的定义

重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

重构与添加新功能

  • 添加新功能:不修改既有代码,只添加新功能
  • 重构:不添加功能,只改进程序结构,不再添加任何测试

为何重构

  • 改进软件设计

没有重构的代码会逐渐腐败变质

  • 使软件更容易理解

重构方便后续维护者理解自己写的代码,方便自己理解不熟悉的代码。

  • 帮助找到 bug

  • 提高编程速度

良好的设计是维持软件开发速度的根本。

何时重构

  • 添加新功能时重构
  • 修补错误时重构
  • 复审代码时重构

重构的难题

  • 数据库的重构
  • 修改接口:不过早发布接口,不发布冗余接口
  • 难以通过重构完成的设计改动
  • 现有代码无法正常运行时,重写而非重构

重构与性能

重构短期内可能会影响性能,但是重构后的代码更容易调整和优化。

性能优化阶段,对性能进行具体监控后,针对性关注并优化。

代码的坏味道

这里列举 22 种坏味道的代码

1. Duplicated Code(重复代码)

同一个类的两个函数含有相同的表达式;

互为兄弟的子类内含有相同表达式;

毫不相干的类出现重复代码。

2. Long Method(过长函数)

小函数使间接层的解释能力、共享能力、选择能力得到支持;

小函数容易理解的关键在于一个好名字;

需要以注释说明的时候,将说明写进独立函数,哪怕替换后的函数调用动作比函数自身还长,只要函数名称能够解释其用途就该毫不犹豫地做。因此寻找注释能定位到需要提炼的代码。

3. Large Class(过大的类)

太多实例变量,太多代码,都需要重构。

4. Long Parameter List(过长参数列)

太长的参数列难以理解;

太多参数会造成前后不一致、不易使用,一旦需要更多数据,只能修改签名;

用对象代替参数列。

5. Divergent Change(发散式变化)

某一个特定的类,会由于不同的外部原因,导致不同的变化时,应当拆分此类;

针对某一外界变化的所有相应修改都应只发生在单一类中,且新类的所有内容都应反应此变化。

6. Shotgun Surgery(霰(xiàn)弹式修改)

遇到变化时需要修改多处不同的类,则将修改点提炼成独立的类。

7. Feature Envy(依恋情节)

类中的函数关注其他类胜过自身,则将函数移位到其他类。

8. Data Clumps(数据泥团)

多处类出现相同的字段、相同的函数参数,且互相关联互相影响,则提炼独立对象。

9. Primitive Obsession(基本类型偏执)

将基本类型字段替换为对象字段。

10. Switch Statements(switch惊悚现身)

面向对象程序的一个最明显特征:少用 switch 或 case 语句。switch 的问题在于重复,且不易修改;

尝试用多态或不同函数签名代替 switch。

11. Parallel Inheritance Hierarchies(平行继承体系)

每当为一个类添加子类时,都必须为另一个类相应增加子类;

尝试用实例引用的方式去除重复性。

12. Lazy Class(冗赘类)

删除无足够工作或几乎没用的冗赘类。

13. Speculative Generality(夸夸其谈未来性)

用不到的类或函数均需移除。

14. Temporary Field(令人迷惑的暂时字段)

类中某个实例变量仅为特定情况、特定函数而设置,则将变量和相关代码提炼为单独的类;

通常出现在类中的复杂算法,需要多个变量,同时不易于用参数传递,因而采用了类实例变量的方式。

15. Message Chains(过渡耦合的消息链)

消息链表示由一串对象前后调用的逻辑,代码与导航结构紧密耦合,一旦关系发生变化,则代码就需要修改。

16. Middle Man(中间人)

中间人仅仅承担接口委托的职责,则应该直接与负责对象打交道,去掉中间人。

17. Inappropriate Intimacy(狎昵关系)

类之间耦合严重,关系过于亲密,需要解耦合。

18. Alternative Classed with Different Interfaces(异曲同工的类)

两个逻辑相同而签名不同的函数,需要合并。

19. Incomplete Library Class(不完美的库类)

针对库类的不合理处也需要弥补。

20. Data Class(纯稚的数据类)

数据类除了拥有字段和访问函数外一无长物,需要增添职责,封装和隐藏字段。

21. Refused Bequest(被拒绝的遗赠)

子类继承了超类,而没有完全继承超类的函数和数据;

尝试新建兄弟类,转移函数和数据。

22. Comments(过多的注释)

注释常常意味着代码需要重构,重构使注释变得多余。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容