代码的坏味道PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.3 Large Class(过大类)
和“拥有太多instance变量”一样, 一个class如果拥有太多代码,往往也 适合使用Extract Class (149)和Extract Subclass(330)。有个有用得技巧: 先确定客户端如何使用它们,然后运 用Extract Interface(341)为每一种使 用方式提炼出一个接口。这可以帮助 你看清楚如何分解这个class。
Large Class(过大类)
如果某个Large Class是个GUI class,需要把数据和行为移到一个独 立的领域对象(domain object)去。 还需要两边各保留一些重复数据,并 令这些数据同步(sync.)。Duplicate Observed Data(189)会告诉你该怎么 做。这种情况下,特别是如果使用旧 式AWT组件,可以采用这种方式去掉 GUI class并代以Swing组件。
Long Method(过长函数)
拥有“短函数(short method)”得对象会 活得比较好、比较长。
很久以前程序员就已认识到:程序愈长愈难 理解。 早期的编程语言中,“子程序调用动作”需要额 外开销,这使得人们不太乐意使用small method.。 让small method容易理解的真正关键在于一个好 名字。 如果能给函数起各好名字,读者就可以通过名字 了解函数的作用,根本不必去看其中写了什么。
Long Parameter List (过长参数列)
太长的参数列难以理解,太多参 数会造成前后不一致,不易使用,而 且一旦你需要更多数据,就不得不修 改它。如果将对象传递给函数,大多 数修改都将没有必要,因为很可能只 需(在函数内)增加一两条请求 (requests),就能得到更多数据。
3.4 Long Parameter List (过长参数列)
3.3 Large Class(过大类)
如果想利用单一class做太多事情,其内往往机 会出现太多instance变量。一旦如此,Duplicated Code就接踵而至了。
可以运用Extract Class(149)将数个变量一起 提炼至新class内。提炼时应该选择class内彼此相 关的变量(即有相同前缀和字尾的变量),把他 们提炼到某个组件内。如果这个组件适合作为一 个subclass,那么Extract Subclass(330)往往比较 简单。
Long Method(过长函数)
最终的效果使:你应该更积极进取 地分解函数。 遵循这样一条原则:每当感觉需要以注 释来说明点什么的时候,就把需要说明 的东西写进一个独立函数中,并以其用 途(而非实现手法)命名。
Long Method(过长函数)
如果函数内又大量的参数和临时 变量,它们会对函数的提炼形成阻 碍。,经常运用Replace Temp with Query(120)来消除这些暂时元素。 Introduce Parameter Object(295)和 Preserve Whole Object(288)则可以 将过长的参数列变得更简洁一些。 如果这么做了仍然又太多临时变量和 参数,就应该使出杀手锏:Replace Method with Method Object(135)
如果“向既有对象发出一条请求”就可以取 得原本位于参数列上的一份数据,那么应该激活 重构准则Replace Parameter with Method(292)。 上述的既有对象可能是函数所属class内的一个值 域(field),也可能是另一个参数。还可以运用 Preserve Whole Object(288)将来自同一对象的 一堆数据收集起来,并以该对象替换它们。如果 某些数据缺乏合理的对象归属,可使用Introduce Parameter Object(295)为它们制造一个“参数 对象”。
Long Method(过长函数)
如何确定该提炼哪一段代码?一个 很好的技巧是:寻找注释。如果代码 前方又一行注释,就是在提醒你:可 以将这段代码替换成一个函数,而且 可以在注释的基础上给这个函数命名。
条件式和循环常常也是提炼的信 号。可以使用Decompose Conditional (238)处理条件式。至于循环,应该 将循环和其内的代码提炼到一个独立 函数中。
代码的坏味道(Bad Smells in Code)
百度文库uplicated Code(重复的代码)
臭味中首当其冲的就是Duplicated Code。如 果在一个以上的地点看到相同的程序结构,那么 可以肯定:设法将它们合而为一,程序会变得更 好。
最单纯的Duplicated Code是“同一个class内的 两个函数含有相同表达式(expression)”。这时 候需要做的就是采用Extract Method(110)提炼 出重复的代码,然后让这两个地点都调用被提炼 出来的那一段代码。
Duplicated Code(重复的代码)
如果两个毫不相关的classes内出现Duplicated Code,应该考虑对其中一个使用Extract Class (149),将重复代码提炼到一个独立class中,然 后在另一个class内使用这个新class.。但是,重复 代码所在的函数也可能的确只应该属于某个class, 而另一个class只能调用它,抑或这个函数可能属 于第三个class,而另两个classes应该引用这第三 个class。你必须决定这个函数放在哪儿最合适, 并确保它被安置后就不会再在其他任何地方出现。
Duplicated Code(重复的代码)
另一种常见情况就是“两个互为兄弟(sibling) 的subclasses内含相同表达式”。要避免这种情况, 只需对两个classes都使用Extract Method(110), 然后再对被提炼出来的代码使用Pull Up Method (332),将它推入superclasses内。如果代码之间只 是非常类似,并非完全相同,那么就得运用Extract Method(110)将相似部分和差异部分割开,构成单 独一个函数。然后可以运用Form Template Method (345)获得一个Template Method设计模式。如果 有些函数以不同得算法做相同的事时,可以选择其 中较清晰的一个,并使用Substitute Algorithm(139) 将其他函数的算法替换掉。