1®EvolvebycaseEvolvebycaseEvolvebycaseEvolvebycase代码的坏味道内容�代码的坏味道概述�代码坏味道的分类�坏味道解决之道-重构技术2剩饭剩菜的坏味道代码也有味道�坏味道(badsmell),特别是代码坏味道(codesmell),是指在代码之中潜在问题的警示信号.并非所有的坏味道所指示的确实是问题,但是对于大多数坏味道,均很有必要加以查看,并做出相应决定�代码坏味道是需要重构的症状。或者潜在的问题(PotentialProblem)或者缺陷(Flaw)�发现代码坏味道是我们代码评审的主要目的。�同时使大家3发现代码味道对的目的�发现代码坏味道是我们代码评审的主要目的,大家在一起来挑错。同时使大家一起来熟悉这些坏味道�同时使大家,在自己设计和开发过程之中,尽量避免出现这些坏味道。生病的症状4中国中医-望闻问切�中医在长期的医疗实践中,总结出了四种论断疾病的方法,这就是望、闻、问、切四诊。�望诊就是医生运用视觉来观察病人全身或局部的神、色、形、态的变化;�闻诊就是医生凭听觉和嗅觉辨别病人的声音和气味的变化;�问诊就是医生凭听觉和嗅觉辨别病人的声音和气味的变化;问诊即通过询问病人和家属,了解疾病的发生与发展过程,以及目前症状及其它与疾病有关的情况;�切诊包括切脉和按诊,是切按病人的脉搏和触按病人的皮肤、手、腹部、四肢及其它部位以诊断疾病的方法。不同的症状不同的治疗方案治疗的办法(药/步骤)不治疗的后果引起的原因症状5代码坏味道�坏味道(CodeSmell)-坏味道名称�症状(Symptoms)-有助于找出问题的线索�原因(Causes)-对问题如何会发生的说明�采取的措施(WhatToDo)-可能的重构�收益(PayOff)-代码在哪些方面有所改善�不适应情况-在哪些情况下不适用的情况随着经验的逐渐积累,提高确诊能力6专家号已售完伟大程序员的标准�“我不是什么伟大的程序员,我只是一个有着很多好习惯的程序员”----KentBeck语。7任重而道远内容�代码的坏味道概述�代码坏味道的分类�坏味道解决之道-重构技术�常见的症状8重构代码坏味道-1�1.DuplicatedCode�代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志(请参见我的duplicatedcode一文:http://www.erptao.org/download.PHP?op=viewsdownload&sid=6)。�2.Longmethod�它是传统结构化的“遗毒“。一个方法应当具有自我独立的意图,不要把几个意图放在一起,我的《大类和长方法》一文中有具体描述。�3.LargeClass�大类就是你把太多的责任交给了一个类。这里的规则是OneClassOneResponsibility。�4.DivergentChange�一个类里面的内容变化率不同。某些状态一个小时变一次,某些则几个月一年才变一次;某些状态因为这方面的原因发生变化,而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。9代码坏味道-2�5.ShotgunSurgery�这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。�6.FeatureEnvy�对象的目的就是封装状态以及与这些状态紧密相关的行为。假如一个类的方法频繁用get方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。�7.DataClumps�某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中,一起出现在许多方法的参数中…..,这些数据或许应该自己独立形成对象。�8.PrimitiveObsession�面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围,他们会使用两个数字。对于Money,他们会用一个浮点数来表示。因为你没有使用对象来表达问题中存在的概念,这使得代码变的难以理解,解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型,用小对象来表示范围、金额、转化率、邮政编码等等。代码坏味道-3�9.SwitchStatement...