相关阅读:

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、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

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

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

一些常见的代码异味及解决之道相关推荐

  1. 19日下午三点直播:DevOps体系中数据库端的四大问题及解决之道

    如今,DevOps理念已经深入人心,其在业务研发和业务运营相结合上为企业带来的高效沟通.协作和整合有目共睹,并且在开源和商业云计算领域已经拥有一整套完整的工具链或解决方案.但是,纵观目前现有的解决方案 ...

  2. SVN版本管理工具使用中常见的代码提交冲突问题的解决方法

    相信刚开始学习使用SVN的小伙伴在项目合作开发的过程中一定经常遇到一些影响到自己编写的代码的苦恼,我这里列举了几种常见的问题以及问题的解决方法: 1.误删除和误操作的问题 问题1:有A和B两个人一块合 ...

  3. ue4如何恢复初始状态_如何解决三菱伺服电机上常见报警代码

    如何解决三菱伺服电机上常见报警代码,伺服电机报警时电机停止方式与报警解除呢?那么报警解除具体方法有哪些?下面小编为你分享如何解决三菱伺服电机上常见报警代码. 1.报警时伺服电机的停止方式 停止方式中记 ...

  4. 力士乐驱动器原理图_力士乐伺服驱动器的常见故障代码和解决方法

    力士乐伺服驱动器的常见故障代码和解决方法:上海仰光维修中心和网友们一起分享下比较常见的故障代码和检修技巧,以供大家参考! 一. 力士乐伺服驱动控制器毛病 伺服驱动由伺服驱动控制器DKC 及程序模块组成 ...

  5. 如何解决三菱伺服电机上常见报警代码

    如何解决三菱伺服电机上常见报警代码,伺服电机报警时电机停止方式与报警解除呢?那么报警解除具体方法有哪些?下面小编为你分享如何解决三菱伺服电机上常见报警代码. 1.报警时伺服电机的停止方式 停止方式中记 ...

  6. c语言e1 e2 e3,樱花燃气热水器常见毛病代码,从E1 E2 E3 E4 E5 E6的解决方法!如燃气阀体内橡胶薄膜变形...

    樱花燃气热水器在运用中,可能会出现一些小毛病,比如,常见毛病代码,这是什么问题,显现显现E1,你知道怎么处理吗?关于燃气热水器常见毛病代码,排查可能性因素,然后履行,详细的检修步骤如下: 燃气热水器常 ...

  7. 光复印机常见故障代码及解决办法

    光复印机常见故障代码及解决办法光复印机常见故障代码及解决办法光复印机常见故障代码及解决办法光复印机常见故障代码及解决办法 sc194,302,320,322,390,401,402,500,541,5 ...

  8. 【Python3爬虫】常见反爬虫措施及解决办法(二)...

    [Python3爬虫]常见反爬虫措施及解决办法(二) 这一篇博客,还是接着说那些常见的反爬虫措施以及我们的解决办法.同样的,如果对你有帮助的话,麻烦点一下推荐啦. 一.防盗链 这次我遇到的防盗链,除了 ...

  9. python错误-新手常见Python错误及异常解决处理方案

    写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...

  10. mysql 死锁原因_Mysql并发时经典常见的死锁原因及解决方法

    1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒 ...

最新文章

  1. vue - check-versions.js for child_process
  2. postman简单教程,如何在请求中引用上次请求返回的值
  3. RTEMS文件系统(4):系统调用开发信息(上)
  4. python怎么打印列表长度_关于python:生成器输出的长度
  5. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 6 ----asp.net MVC+Extjs
  6. flash数字时钟_数字电路设计在嵌入式中的应用
  7. 不能导入android项目备注
  8. 2010 模板下载 罗斯文_俄罗斯签证办理攻略
  9. 2019深圳杯获奖论文_2019年第六届深圳南山杯全国手风琴网络邀请赛获奖名单、成绩公布!...
  10. 快速检查REST API是否有效的方法-从清单文件中获取详细信息
  11. java中跨时区的日期格式转换
  12. 《C++字符串完全指南——第一部分:win32 字符编码》
  13. 【leetcode刷题笔记】Single Number
  14. apache服务器工作原理,Apache服务器的原理简介
  15. java基础- 与null的区别
  16. 会写helloworld,不等于入门
  17. python类的构造函数是_python类(class)的构造函数、初始化函数、析构函数
  18. vim介绍与一些使用方式
  19. 【分享贴】PCB设计思路
  20. 闭环系统零、极点位置对时间响应性能指标的影响

热门文章

  1. Windows 2008-TS测试-TS GateWay
  2. Unity文件操作路径
  3. [Android] View动画特效(四)
  4. 关于‘挖矿’minerd
  5. TMG自动发现功能配置正常,但客户端却检测不到TMG服务器。
  6. Samba通过ad域进行认证并限制空间大小
  7. aswing学习笔记2-不规则外框-请教思路
  8. Illustrator 教程,如何在 Illustrator 中使用图层组织内容?
  9. 类 ACDSee图像浏览工具Lyn for Mac
  10. 【WPF】在MenuItem中下划线“_”显示不正常