重构(三)代码的坏味道

神秘命名Mysterious Name
重复代码 Duplicated Code
过长函数 Long Function
过长参数列表 Long Parameter List
全局数据 Global Data
  • 最大的问题在于,从代码库的任何一个角落都可以修改它,而且没有任何机制可以探测出到底哪段代码作出了修改。
  • 解决:把全局数据用函数包装起来,控制对它的访问。将这个函数搬移到一个类或模块内,只允许模块内的代码使用它,从而尽量控制其作用于。
可变数据Mutable Data
  • 一个变量只能有一个业务含义,var a =1 ;a = ‘aa’
发散式变化 Divergent Change
  • 遇到某种变化,需要在一个模块内或一个类内修改多处。
霰弹式修改 Shotgun Surgery
  • 遇到某种变化,需要在多处不同的模块或类内做修改。
  • 解决:改变只在一处发生,不要多处修改。将总是一起变化的东西放到一块儿。
    i#####依恋情结 Feature Envy
  • 所谓模块化,就是力求将代码分出区域,最大化区域内部的交互、最小化跨区域的交互。
  • 当一个函数跟另一个模块中的函数或者数据交流格外频繁,远胜于在自己所处模块内部的交流,这就是依恋情结的典型情况。
  • 解决:将该函数与其交流最多的模块放在一起。
数据泥团 Data Clumps
  • a\b\c三个变量,经常同时出现在多个函数的参数列表中。
  • 解决:那么考虑把a\b\c封为一个类内,以此类当参数。
基本类型偏执 Primitive Obsession
  • 用合适的类型匹配合适的对象描述。
  • 表现为:用简单的基本类型描述不同的含义的对象描述。
  • 不合适的情况举例,如:0表示数学,1表示英语,2表示语文。那么可以考虑将数学/英语/语文的012用枚举定义,更易理解。
重复的switch Repeated Switches
  • 表现为:在多处不同的地方,重复使用完全相同的switch语句或ifelse语句。
  • 这样的问题在于,如果产生变化,需要多处修改。
循环语句。Loops
  • 使用管道操作,如filter/map等,代替循环语句。
  • 好处在于使得我们更快地看清被处理的元素以及处理它们的动作。
冗赘的元素 Lazy Element
  • 指的是,多层不必要的包装。
  • 如:方法a中包的是b,b包的是c,c包的是d。但是bc只是基于某种考虑的纯粹包装,而从未有其他变化,这时可以让a直接包d,bc就去掉吧。
夸夸其谈通用性 Speculative Generality
  • 指的是,过度设计,假象的灵活机制。从未被用到的。
临时字段 Temporary Field
  • 一个类内,应该具备统一的逻辑体现。
  • 举例:class Letter{ a. b. c. 牛 d. e. }
过长的消息链 Message Chains
  • a想获得f,过程是:c = b.getC(),d = c.getD(),e = d.getE(),f=e.getF();
  • 类似一个导航链。
中间人。Middle Man
  • 对象的基本特征之一就是封装-对外部世界隐藏其内部细节。封装往往伴随着委托。
  • 过度委托,举例:a使用b的b1 b2 b3三个函数,但是b1 b2 b3这三个函数都是c的c1 c2 c3。那么就把b这个中间人去掉,直接a使用c1 c2 c3
内幕交易 Insider Trading
  • 避免模块间的私下交流,把模块间的交流放到明面上,统一交流方式,约定都使用这些统一的方式。
过大的类 Large Class
  • 让类业务功能单一,避免一个类干很多事情。
异曲同工的类 Alternative Classes with Different Interfaces
纯数据类 Data Class
  • 一种情况是,这真的是纯数据类,存放数据的容器,不会改变类的变量值。这种情况没有问题。
  • 另一种情况是,类内有一些字段,以及访问这些字段的函数。但是在很多其他地方频繁的对该类的字段进行访问修改。那么可以考虑,将这些频繁的行为搬移到类的内部。也就是说,把处理数据的行为从客户端搬移到纯数据类里来。
被拒绝的遗赠 Refused Bequest
  • 指的是,子类只想继承超类的部分字段和函数,其他的拒绝使用。这意味着继承体系设计错误。超类中的字段函数应该是子类的必备数据。
  • 继承体系设计时,应该是真是一个体系。而不应因为多个并行的类有某些行为相像的函数,而抽取超类。比如猪和牛都有四条腿和一个尾巴,但不应该抽取一个只有四条腿和一个尾巴的超类,猪牛不是一个体系的。
注释 Comments
  • 一段又长又臭的代码,无法自解释,只能靠注释解释其含义。这不是注释原本的意义。
  • 注释可以用来记述将来的打算之处,标记并无十足把握的区域,或是写下“为什么做某某某事”,这类信息可以帮助将来的修改者,尤其是那些健忘的家伙。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容