重构改善既有代码的设计-代码的坏味道(下)

附:前两篇文章链接

!(https://www.jianshu.com/p/251d1b796259?v=1673184489236)[重构改善既有代码的设计-代码的坏味道(上)]
!(https://www.jianshu.com/p/efa726759259)[重构改善既有代码的设计-代码的坏味道(中)]

下面继续把重构一书代码中的坏味道进行总结与列举:

1.18 异曲同工的类(Alternative Classes with Different Interfaces)

如果两个函数做同一件事,却有着不同的名字。

使用 Rename Method(重命名函数) 重新命名这些相同功能的函数,反复运用 Move Method(搬移函数) 将这些函数移入类,如果需要移入类的函数过多,可以考虑Extract Superclass(提炼父类)来减少过多赘余的属性。

1.19 Incomplete Library Class (不完美的类库)

含义:封装好的类库中功能不能满足实际需求。

缺憾: 库中没有某些需求能够使用的方法函数等,封装好的库不能更改。

目标: 解决代码不能更改造成的不便。

实现方法:

使用 Introduce Foreign Method(162引入外加函数)
在一个无法修改的类中增加新的函数,剥离出来作为静态函数放在需要的类中使用。

或使用 Introduce Local Extension(164引入本地扩展)
你需要为服务类提供一些额外函数,但你无法修改这个类。
则你可以建立一个新类,使它包含这些额外函数,让这个拓展品成为源类的子类或包装类。

该两种重构手法看后续文章更新会进一步附上链接以及详细的总结:

1.20 Data Class(纯稚的数据类)

它们拥有一些字段,以及用于访问(读写)这些字段的函数, 除此之外一无长物.

这样的类只是不会说话的数据容器, 它们几乎一定被其他类过分细碎地操控着.

修改点:

1.这些类早期可能拥有public字段, 果真如此你应该在别人注意到它们之前, 立刻运用Encapsulate Field(封装字段) 将它们封装起来.

2.如果这些类内含有容器类字段, 你应该检查它们是不是得到了恰当的封装;

3.如果没有, 就运用 Encapsulate Collection(封装集合) 把它们封装起来. 对于那些不该被其他类修改的字段, 运用Remove Setting Method(移除设值函数)。找出这些取值/设值函数被其他类运用的地点. 尝试以Move Method 把那些调用行为搬移到Data Class来. 如果无法搬移整个函数, 那就运用Extract Method 产生一个可被搬移的函数. 不久之后你就可以Hide Method(隐藏函数) 把这些取值/设值函数隐藏起来了.

1.21 Refused Bequest(被拒绝的馈赠)

定义:

被拒绝的遗赠是指:对于某个子类,它只想继承基类的部分函数和数据,不需要基类提供的全部内容,这些不需要的内容就成为了子类的负担。

影响: 这种坏味道通常影响并不大,但如果子类拒绝实现部分接口或者基类的方法只适用于某个子类特定的方法,就会对可维护、可扩展性等造成较大影响。

改进目标: 改进不合理的继承体系,使代码结构清晰、可控。

方法:
•函数/字段下移,让超类只持有子类共享的东西[1]。
•以委托取代超类/子类。

注[1]:并不建议对所有存在“被拒绝的遗赠”的代码都进行修改,我们经常使用继承复用一些行为,可以很好的应对日常工作,所以修改的成本和收益还是需要开发者自己权衡。但是当“被拒绝的遗赠”使开发人员困惑时,就建议及时处理掉。

1.22 Comments (过多的注释)

首先声明,注释不是一种坏味道,但是我们经常遇到一段代码有非常长的注释,然后也可以推导出注释之所以这么长,是因为代码很糟糕。这种情况发生的次数多了。

注释可以帮助我们找到本章先前提到的各种坏味道。找到坏味道我们运用各种重构去重构之后,会发现注释一斤变得多余了。因为代码已经说明了一切。

做法:
如果你需要注释来解释一块代码做了什么, 试试Extract Method;
如果函数已经提炼出来,但还是需要注释来解释其行为,试试Rename Method
如果你需要注释说明某些系统的需求规格,试试Introduce Assertion(引入断言)。

首先,当你感觉需要填写撰写注释时,请先尝试重构, 试着让所有注释都变得多余。

如果你不知道该做什么, 这才是注释的良好运用时机 . 除了用来记录将来的打算之外, 注释还可以用来标记你并无十足把握的区域. 你可以在注释里写下自己"为什么做某某事". 这类信息可以帮助将来的修改者, 尤其是那些健忘的家伙.

以上就是重改改善既有代码的设计中列举的代码中的坏味道,希望我们开发人员在开发、迭代功能、需求、解决bug或者优化代码时,能够多多思考,对坏味道多多体会的同时,能够尽量减少这些坏味道。

注这几篇文章中,比较复杂,有意思的重构手法会在文章中附链接,相对简单易理解的,读者可以自行百度。

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

推荐阅读更多精彩内容