22种代码的坏味道,一句话概括:

如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹。
正如食物要腐坏之前,经常会发出一些异味一样。
我们管这些痕迹叫做“代码异味”。 参考资料:
http://blog.csdn.net/sulliy/article/details/6635596
http://sourcemaking.com/refactoring/bad-smells-in-code
Code smells
Duplicated Code --------(重复代码)难维护。
[解决方法]:提取公共函数。
Long Method ------------(函数长)难理解。
[解决方法]:拆分成若干函数。
Large Class ------------(类大)难理解。
[解决方法]:拆分成若干类。
Long Parameter List ----(参数多)难用,难理解。
[解决方法]:将参数封装成结构或者类。
Divergent Change -------(万能类)发散试修改,改好多需求,都会动他。
[解决方法]:拆,将总是一起变化的东西放在一块儿。
Shotgun Surgery --------(天女散花的逻辑)散弹试修改,改某个需求的时候,要改很多类。
[解决方法]:将各个修改点,集中起来,抽象成一个新类。
Feature Envy -----------(红杏出墙的函数)使用了大量其他类的成员 
[解决方法]:将这个函数挪到那个类里面。
Data Clumps ------------(数据团)常一起出现的一坨数据。
[解决方法]:他们那么有基情,就在一起吧,给他们一个新的类。
Primitive Obsession ----(偏爱基本类型)热衷于使用int,long,String等基本类型。
[解决方法]:反复出现的一组参数,有关联的多个数组换成类吧。
Switch Statements ------(switch语句)
[解决方法]:state/strategy 或者只是简单的多态。
Parallel Inheritance Hierarchies ---------------(平行继承)增加A类的子类ax,B类也需要相应的增加一个bx。
[解决方法]:应该有一个类是可以去掉继承关系的。
Lazy Class -------------------------------------(冗赘类)如果他不干活了,炒掉他吧。
[解决方法]:把这些不再重要的类里面的逻辑,合并到相关类,删掉旧的。
Speculative Generality -------------------------(夸夸其谈未来性)
[解决方法]:删掉
Temporary Field --------------------------------(临时字段)仅在特定环境下使用的变量
[解决方法]:将这些临时变量集中到一个新类中管理。
Message Chains ---------------------------------(消息链)过度耦合的才是坏的。
[解决方法]:拆函数或者移动函数。
Middle Man -------------------------------------(中介)大部分都交给中介来处理了。
[解决方法]:用继承替代委托。
Inappropriate Intimacy -------------------------(太亲密)两个类彼此使用对方的私有的东西。
[解决方法]:划清界限拆散,或合并,或改成单项联系。
Alternative Classes with Different Interfaces --(相似的类,有不同接口)
[解决方法]:重命名,移动函数,或抽象子类。
Incomplete Library Class -----------------------(不完善的类库)
[解决方法]:包一层函数或包成新的类。
Data Class -------------(纯数据类)类很简单,仅有公共成员变量,或简单操作函数。
[解决方法]:将相关操作封装进去,减少public成员变量。
Refused Bequest --------(继承过多)父类里面方法很多,子类只用有限几个。
[解决方法]:用代理替代继承关系。
Comments ---------------(太多注释)这里指代码太难懂了,不得不用注释解释。
[解决方法]:避免用注释解释代码,而是说明代码的目的,背景等。好代码会说话。
---------------------
版权声明:本文为CSDN博主「windcao」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/windcao/article/details/25773219

  

Sonar中的坏习惯详解的更多相关文章

  1. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  2. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  3. PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等

    页面导航: 首页 → 网络编程 → PHP编程 → php技巧 → 正文内容 PHP安全 PHP开发中常见的安全问题详解和解决方法(如Sql注入.CSRF.Xss.CC等) 作者: 字体:[增加 减小 ...

  4. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  5. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  6. 011-Scala中的apply实战详解

    011-Scala中的apply实战详解 object中的apply方法 class中的apply方法 使用方法 apply方法可以应用在类或者Object对象中 class类 必须要创建实例化的类对 ...

  7. C# WinForm 中 MessageBox的使用详解

    1.C# WinForm 中 MessageBox的使用详解:http://www.cnblogs.com/bq-blog/archive/2012/07/27/2611810.html

  8. JScript中的条件注释详解(转载自网络)

    JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...

  9. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

随机推荐

  1. shell基础知识4--别名、采集终端信息

    别名就是一种便捷方式,可以为用户省去输入一长串命令序列的麻烦.下面我们会看到如何 使用 alias 命令创建别名. 直接使用alias就是显示当前有哪些别名,否则就是创建别名 [root@dns-no ...

  2. microsoft vs code 绿化

    下载地址: https://code.visualstudio.com/#alt-downloads 各个版本比较 User Installer System Installer .zip resou ...

  3. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器和EasyDSS云平台异同

    背景分析 不同于EasyDSS流媒体服务器与EasyDSS流媒体解决方案(EasyDSS流媒体解决方案就是通过EasyDSS流媒体服务器完善业务层研发而来),EasyDSS流媒体服务器和EasyDSS ...

  4. linux 下core文件生成、路径、格式设置及调试

    core文件生成及调试1 代码 #include<stdio.h> int main() { int *p = NULL; *p = 0; return 0; } 2 在当前shell执行 ...

  5. Linux内核参数详解

    所谓Linux服务器内核参数优化(适合Apache.Nginx.Squid等多种web应用,特殊的业务有可能需要做略微调整),主要是指在Linux系统中针对业务服务应用而进行的系统内核参数调整,优化并 ...

  6. python入门之与用户交互

    目录 一.程序与用户交互 1.1 什么是与用户交互 1.2 为什么要与用户交互 1.3 如何与用户交互 1.4 python2和python3中input的区别 1.4.1 python3中的inpu ...

  7. Dockerfile & Docker Swarm & Docker Stack & Docker Compose

    Dockerfile 通俗地讲,它是为了指导单个镜像从无到有的构建过程.如果你镜像是从Docker registry上面拉下来的,那就用不到这个文件:如果你是自己的应用,想打包成镜像,那就需要这个文件 ...

  8. SpringBoot应用部署到Docker上(docker-io版本)

    配置TCP远程连接 为什么要配置这个呢,因为用到的docker-maven-plugin插件默认连接到localhost:2375上的docker.然而:1. 我们的Docker不在本地,执行打包命令 ...

  9. Python 基础 常用运算符

    Python 基础 常用运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算术运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们暂只学习 算术运算. ...

  10. 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin'

    vue+springboot项目 前端发送请求微信 URL:http:/.........(企业微信的路径) 请求成功,数据发送过去可以接收到,处理完毕后发送返回值给我 我这边前端网络响应处可以看到返 ...