提取的变量
问题
你的表情让人难以理解。
解决方案
将表达式的结果或其部分放在独立的变量中,这些变量是自解释的。
之前
void renderBanner() {if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) {// do something}}
后
void renderBanner() {final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;final boolean isIE = browser.toUpperCase().indexOf("IE") > -1;final boolean wasresize = resize > 0;if (isMacOs && isIE && wasInitialized() && wasResized) {// do something}}
之前
void RenderBanner() {if((平台。toupper ().IndexOf("MAC") > -1) &&(浏览器。toupper ().IndexOf("IE") > -1) && wasInitialized() && resize > 0) {// do something}}
后
void RenderBanner() {readonly bool isMacOs = platform.ToUpper().IndexOf("MAC") > -1;readonly bool isIE = browser.ToUpper().IndexOf("IE") > -1;readonly bool wasresize =调整> 0;if (isMacOs && isIE && wasInitialized() && wasResized) {// do something}}
之前
如果(($平台- > toUpperCase()——> indexOf (MAC) > 1) & &(浏览器- > toUpperCase()——> indexOf (IE) > 1) & & $ this - > wasInitialized () & & $ this - >调整> 0){/ /做某事}
后
$isMacOs = $平台->toUpperCase()->indexOf("MAC") > -1;isIE =美元浏览器- > toUpperCase()——> indexOf (IE) > 1;$ wasresize = $this->resize > 0;if ($isMacOs && $isIE && $this->wasInitialized() && $wasResized) {// do something}
之前
def renderBanner(self): if (self.platform. touppercase (). indexof ("MAC") > -1)和\ (self.browser. touppercase (). indexof ("IE") > -1)和\ self. wasinitialized()和(self. outppercase () > -1)Resize > 0): #做一些事情
后
def renderBanner(self): isMacOs = self.platform. touppercase (). indexof ("MAC") > -1 isIE = self.browser. touppercase (). indexof ("IE") > -1 wasResized = self.platform. touppercase ()如果是macos和isIE和self.wasInitialized()和wasResized: #做一些事情
之前
renderBanner(): void {if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) {// do something}}
后
renderBanner(): void {const isMacOs = platform.toUpperCase().indexOf("MAC") > -1;const isIE = browser.toUpperCase().indexOf("IE") > -1;const wasresize =调整> 0;if (isMacOs && isIE && wasInitialized() && wasResized) {// do something}}
为什么重构
提取变量的主要原因是通过将一个复杂的表达式划分为中间部分,使其更容易理解。这些可能是:
设备的状况
如果()
操作符或部分?:
基于c语言的运算符没有中间结果的长算术表达式
多部分的长线
提取变量可能是执行的第一步提取方法如果您看到在代码的其他地方使用了提取的表达式。
好处
- 更可读的代码!试着给提取出来的变量起个好名字,响亮而清楚地说明变量的用途。可读性更强,注释更少。取一些像这样的名字
customerTaxValue
,cityUnemploymentRate
,clientSalutationString
等。
缺点
代码中有更多的变量。但这与易于阅读代码相平衡。
重构条件表达式时,请记住,编译器很可能会对其进行优化,以最小化建立结果值所需的计算量。假设你有一个下面的表达式
如果(a() || b())…
.程序不会调用该方法b
如果方法一个
返回真正的
因为结果值仍然是真正的
,不管返回什么值b
.但是,如果将该表达式的部分内容提取到变量中,则两个方法都会被调用,这可能会损害程序的性能,特别是如果这些方法要执行一些重量级的工作。
如何重构
在相关表达式之前插入新行,并在那里声明一个新变量。将部分复杂表达式赋给该变量。
用新变量替换表达式的这一部分。
对表达式中所有复杂的部分重复这个过程。