一些常见的代码异味及解决之道

0?wx_fmt=gif

相关阅读:

300本计算机编程的经典书籍下载

WePhone开发者被逼自杀案续,在翟欣欣身上的各种消费清单明细及细节曝光


如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹。正如食物要腐坏之前,经常会发出一些异味一样。我们管这些痕迹叫做 代码异味 。




1重复代码 (Duplicated Code)



解决方案:

  • 同一个class内的两个函数含有相同的表达式。——需要Extract Method,提炼出重复代码,然后让两个地点都调用被提炼出来的那一段代码。

  • 两个互为兄弟的subclass内含相同的表达式,要避免这种情况——需要两个class都使用Extract Method,把Extract的Method推入superclass内。

  • 两个毫不相干的classes内出现Duplicate Code,你应该考虑对其中一个使用Extract Class,将重复代码提炼到一个独立class中,然后在另一个class内使用这个新class。



2过长方法 (Long Method)



所谓 “ 好处 ”

  • 避免额外开销

  • 不需要跳转上下文就能理解程序

解决方案:

  • 注释

  • 条件式

  • 循环



3过大类 (Large Class)



解决方案:

  • 变量 & 方法

  • 重新抽象



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



会导致哪些问题

  • 无用/开关/分类参数

  • 难以理解

  • 前后不一致,不易使用

  • 经常需要修改

解决方案:

  • 抽象成类



5发散式变化 (Divergent Change)



表现:一个类受到多种变化的影响

解决方案:

  • 重构,保持类功能单一



6散弹式修改 (Shotgun Surgery)



表现:一种变化引发多个类相应修改

解决方案:

  • 提取变化部分为公共的类



7依恋情节 (Feature Envy)



表现:使用了大量其他类的成员

解决方案:

  • 需要在一起的,就让他们在一起



8数据泥团 (Data Clumps)



表现:常一起出现的一堆数据

解决方案:

  • 那么有基情,就在一起吧,给他们一个新的类。



9基本类型偏执 (Primitive Obsession)



解决方案:

  • 反复出现的一组参数,抽象成类

  • 有关联的多个数组,抽象成类



10switch惊悚现身 (Switch Statements)



解决方案:

  • state/strategy/多态



11平等继承体系 (Parallel Inheritance Hierarchies)



表现:每当你为某个class增加一个subclass,必须也为另一个class相应增加一个subclass。

解决方案:

  • 应该有一个类是可以去掉继承关系



12冗余类 (Lazy Class)



解决方案:

  • 删除



13夸夸其谈未来 (Speculative Generality)



解决方案:

  • 删除



14临时字段 (Temporary Field)



解决方案:

  • 抽象成类



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



表现:用户向一个对象索求另一个对象,然后再向后者索求另一个对象,然后再索求另一个对象……这就是Message Chain

解决方案:



16中间转手人 (Middle Man)



表现:某个类接口有一半的方法都委托给其它类

实质:委托的过度使用

解决方案:

  • 继承代替委托



17太亲密 (Inappropriate Intimacy)



表现:两个类彼此使用对方私有的成员或方法

解决方案:

  • 划清界限拆散/合并/单向联系



18不同接口的相似类 (Alternative Classes with Different Interfaces)



解决方案:

  • 合并



19不完善的类库 (Incomplete Library Class)



解决方案:

  • 包一层函数或包装成新的类



20纯稚的数据类 (Data Class)



解决方案:

  • 将相关操作封装进去,减少public成员变量



21被拒绝的遗赠 (Refused Bequest)



表现:父类里面方法很多,子类只用有限几个

实质:继承体系设计错误

解决方案:

  • 用代理替代继承关系



22过多注释 (Comments)



解决方案:

  • 避免用注释解释代码,而是说明代码的目的,背景等,好代码自己会说话


看完本文有收获?请转发分享给更多人


欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 640?wx_fmt=jpeg

    如想加群讨论学习,请点击右下角的“加群学习”菜单入群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值