Sonar中的坏习惯详解
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中的坏习惯详解的更多相关文章
- 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...
- Java中的main()方法详解
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...
- PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等
页面导航: 首页 → 网络编程 → PHP编程 → php技巧 → 正文内容 PHP安全 PHP开发中常见的安全问题详解和解决方法(如Sql注入.CSRF.Xss.CC等) 作者: 字体:[增加 减小 ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- 011-Scala中的apply实战详解
011-Scala中的apply实战详解 object中的apply方法 class中的apply方法 使用方法 apply方法可以应用在类或者Object对象中 class类 必须要创建实例化的类对 ...
- C# WinForm 中 MessageBox的使用详解
1.C# WinForm 中 MessageBox的使用详解:http://www.cnblogs.com/bq-blog/archive/2012/07/27/2611810.html
- JScript中的条件注释详解(转载自网络)
JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
随机推荐
- OCR(Optical Character Recognition)算法总结
https://zhuanlan.zhihu.com/p/84815144 最全OCR资料汇总,awesome-OCR
- iOS史上最简单修改导航栏分隔线颜色方法!!!
override func viewDidLoad() { super.viewDidLoad() if let imageView = self.findNavLineView(view: navi ...
- Hadoop window win10 基础环境搭建(2.8.1)(转)
下面运行步骤除了配置文件有部分改动,其他都是参照hadoop下载解压的share/doc/index.html. hadoop下载:http://apache.opencas.org/hadoop/c ...
- Guide of Apache Directory Studio
Default User and Password admin secret
- Kubernetes+Istio
Kubernetes+Istio 微服务.SpringCloud.k8s.Istio杂谈 一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产 ...
- JVM Server与Client运行模式
JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是: 当虚拟机运行在-client模式的时候,使用的 ...
- 长乐国庆集训Day3
T1 动态逆序对 题目 [题目描述] 给出一个长度为n的排列a(1~n这n个数在数列中各出现1次).每次交换两个数,求逆序对数%2的结果. 逆序对:对于两个数a[i],a[j](i<j),若a[ ...
- C#:蓝牙串口读数据和写数据
首次使用C#编写与COM口有关的程序,期间遇到了很多问题,写下自己的经验总结,如有错漏,欢迎批评指正! 1.新建一个串口类( SerialPort类) //Create a serial port f ...
- 简单端口映射、转发、重定向工具-Rinetd
一.简介 Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具.Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd中指定的 ...
- arc079
D. Decrease (Contestant ver.) 大意: 每次操作选一个最大数$-n$,其余数全$+1$. 要求构造一个序列$a$, 使得恰好$k$次操作后最大值不超过$n-1$. 只要让$ ...