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功能介绍—我们 ...
随机推荐
- Celery-系统守护进程
1. 使用systemd控制Celery 用法: systemctl {start|stop|restart|status} celery.service 配置文件: /etc/celery/cele ...
- Promise.resolve解析
总结自:https://blog.csdn.net/lq15310444798/article/details/81275278 Promise.resolve返回一个Promise实例 参数分4种情 ...
- 【ARM-Linux开发】Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- electron+vue实现菜单栏
公司开发的产品都是用c++写的,而且还都是几个人,老板想搞下创新,就是看看能否通过其它的方式来实现前后端分离.然后我就了解到了electron这个东西,之前学安卓的时候看到过flutter,不经意间看 ...
- css3网站响应式写法
css3响应式写法因为media不支持ie9以下的浏览器 所有要加个判断<pre> <!-- 全部通用的 --><link rel="stylesheet&qu ...
- Docker下安装zookeeper(单机 & 集群)
启动Docker后,先看一下我们有哪些选择. 有官方的当然选择官方啦~ 下载: [root@localhost admin]# docker pull zookeeper Using default ...
- mac下php配置
打开/关闭服务 sudo apachectl start sudo apachectl stop 查看apche版本 apacectl -v 修改项目默认路径: 打开配置文件目录/private/et ...
- 使用 Redis 的 sorted set 实现用户排行榜
要求:实现一个用户排行榜,用户数量有很多,排行榜存储的是用户玩游戏的分数,对排行榜的读取压力比较大,如何实现? 思路分析: 实现排行榜,可以考虑使用 Redis 的 zset 结构: 用户数量很多的话 ...
- MySQL表关系--外键
一.外键前戏 如果我们把所有的信息都记录在一张表中会带来的问题: 1.表的结构不清晰 2.浪费磁盘空间 3.表的扩展性极差 所以我们要把这种表拆成几张不同的表,分析表与表之间的关系. 确定表与表之间的 ...
- python_操作linux上的mysql
在编写初期,遇见一个问题,发现怎么连接不上mysql,一直报错1045: 最后发现,只要下面的,连接写正确,不会出现这个问题, 只要你保证你的user.pwd是正确的, import pymysqld ...