代码异味是经常会对应于系统中深层次的问题的表面迹象。
重复代码
过长方法
庞大的类
长参数表
不同方向的变化
霰弹式修改(shotgun surgery)(改一个地方得改其他地方)
shotgun surgery是软件开发中的反模式,发生在开发人员向应用程序代码库添加功能的地方,这些代码库在单个更改中跨越多个实现者或实现。
依恋情结:(feature envy):标志和症状:方法访问另一个对象的数据而不是其自己的数据。问题的原因:字段移动到数据类后可能会出现这种smell。
数据堆积(Data Clumps)
基本类型迷恋(primitive obsesstion)
Switch语句
平行继承层次(Parallel Inheritance Hierarchies)
冗余类(Lazy Class)
暂时的区域(temporary field)
消息链(message chain)
中间人(middle man)
过度亲密(inappropriate intimacy)
具有不同接口的替代类(Alternative Classes with Different Interfaces)
不完全的库类(Incomplete Library Class)
数据类(Data Class)
拒绝的馈赠(Refused Bequest):子类并没有用到很多被继承的成员
注释
有不止一处的相同的代码结构(源于代码复制)
因为你修改一处重复的代码而不能同时修改其他的,这很糟糕,你可能会引入bug
过长的方法很难去理解;
许多简短方法的性能问题在很大程度上已经过时了
类致力于减少聚合
经常会出现很多实例变量
很难去理解,有时可能会变得不一致,很难去使用
和聚合(cohesion)有关
症状:一种类型的更改需要更改一个方法子集; 另一种类型的更改需要更改另一个子集(由于不同的原因,一个类通常以不同的方式更改)。
每次修改一次,你不得不对不同的类做出很多的小的修改;
很难去认证和做出彻底的修改
一个方法看上去对另外一个类更加有兴趣,而非自己所在类(例如,把很多个getter()方法在另一个对象里面去计算数值)
一串串的数据,束在一起。例如:几个类中的字段,许多方法签名中的参数。
代码使用内部建类而不是应用类
结果:减少不可理解性,过长方法,重复代码,增加复杂性
经常的,你发现一样的switch语句将一个程序分解成到了不同的地方,如果你增加一个新的子句给switch,你不得不找到所有这些switch语句,并且修改他们。
霰弹式修改的一个特殊的例子就是:每次你编写一个类的子类的时候,你也得不得不去写另外一个类的子类
一个类不再起到足够作用,引起你的注意。
例子:可能是类被之前的重构缩小,也可能是表示计划中的功能,却并未起作用。
对象的属性直再特定的环境下被设置,但是对象应该需要所有它的属性
当一个用户通过一个类访问另一个类时,然而它之后还会访问另一个类,一直这样下去。
用户被耦合至传递的结构。任何对中间关系的改变都会导致用户不得不改变其他。
一个类的绝大多数方法都为人给了另外的这个类
类变得过于亲密,并在相互的私有部分花了太多的时间去搜素
两个类表现的完全相同,但是却有不同的方法名
原因是:创建这种类的程序员可能不知道已经有一个功能等价的类存在了。
迟早的,库不再能满足我们的需求了,唯一的解决办法——更改库文件——一般不太可能源于类的只读性
库的作者并没有提供你需要的功能,或者拒绝去实现他们
这些是拥有字段的类,为字段编写方法,仅此而已。他们是数据的保存者,但是对象应当是有关于数据以及行为。
一个子类忽略绝大多数他从父类继承的功能
子类可能通不过“IS-A”test
注释有时候被用来藏匿不好的代码