提炼方法 对于一个方法体庞大的方法可以使用Extract Method将其一部分代码提炼到一个小方法中并在原处添加提炼方法的调用如果方法中存在重复的代码段则这个代码段很有必须提炼为一个单独的方法以便复用 要将一块代码提炼为一个单独的方法只需要选中这块代码并通过Ctrl+Shift+R>Extract Method调出提炼方法的重构对话框来进行操作JBuilder会分析选中代码块中所引用的上下文变量目标方法定义相应的参数通过方法入参来传递这些变量如下面的drive()方法在Horsejava中定义其代码如下 代码清单 未提炼方法前的drive()方法 public void printQuotation(int amount) { printBanner(); Systemoutprintln(单价+price); Systemoutprintln(购买只数+amount); Systemoutprintln(总价:+(price * amount)); } 我们希望将第~行代码块抽取到一个称为printDetail()的方法中选中第~行的代码>Ctrl+Shift+R>Extract Method调出提炼方法对话框如下图所示 educitycn/img_///jpg> 在Method name中键入printDetail按OK后JBuilder将选中的代码块提炼到新的方法中并在原方法处插入提炼方法的调用 代码清单 进行方法提炼后的代码 public void printQuotation(int amount) { printBanner(); printDetail(amount);//在源处插入对抽取出方法的引用 } //抽取出来的方法 private void printDetail(int amount) { Systemoutprintln(单价+price); Systemoutprintln(购买只数+amount); Systemoutprintln(总价:+(price * amount)); } printDetail()方法有一个入参用于传递代码块所引用的上下文变量在第行的调用处将变量通过printDetail()的amount入参传入 内联方法 内联方法是提炼方法的反操作即用方法体替换方法调用当方法是private且再没有其他地方调用该方法时JBuilder在内联方法后一并删除这个被内联的方法如我们将光标放置代码清单 的第行printDetail()处Ctrl+Shift+R>Inline MethodJBuilder直接将printDetail()方法体内联到第行处因为在Horsejava中没有其他地方调用printDetail()所以该函数内在联后将从Horsejava中删除内联后代码如代码清单 所示 如果系统中所有函数都似乎只是对另一个函数的简单委托形成过多的间接层过多的委托将使程序的关系变得不易理解此时可以使用内联方法去除这些无用的委托方法 提炼变量 我们曾经说过不同的方法有重复的代码块时须考虑将其抽取为一个独立的方法不同的类有重复的方法时须考虑抽取到一个新的类中相似的如果一个方法中多次重复出现同一个表达式此时你可以考虑将这些相同的表达式提炼为一个局域变量请看下面的代码 代码清单 重复的表达式 public void printAccountPrice(int amount) { if(amount <= ) { Systemoutprintln(总价 + (amount * price)) ; } else if(amount <= ) { Systemoutprintln(总价(打折) + (amount * price) * ) ; } else { Systemoutprintln(总价(打折) + (amount * price) * ) ; } } 在printAccount()方法中表达式amount*price重复出现次我们可以在函数开始处引入一个局域变量用这个变量替换这个表达式Ctrl+Shift+R>Introduce Variable调出引入变量的对话框如下图所示 educitycn/img_///jpg> 引入变量对话框 NametotalPrice 引入的变量名 Type变量类型不可变JBuilder自动断定 Expression你所选中的计算表达式 Include all read expressions如果此选项勾选则JBuilder将在方法范围内查找所有重复的表达式一并替换你没有什么理由不选择这个设置项 按OK后完成重构重构后代码如下所示 代码清单 引入局域变量去除重复表达式 public void printAccountPrice(int amount) { double totalPrice = (amount * price); if(amount <= ) { Systemoutprintln(总价 + totalPrice) ; } else if(amount <= ) { Systemoutprintln(总价(打折) + totalPrice * ) ; } else { Systemoutprintln(总价(打折) + totalPrice * ) ; } } 特别的如果一个表达式过于复杂应当按特定意义划分成多个部分每个部分抽取成一个独立的局域变量以提高程序的可读性如下面是计算n个圆锥的造价 n*MathPI*r*r*h/*price 可以将其重构为以下的形式 double s = MathPI*r*r*h/;//圆锥体积 totalPrice = n * s * price;//n个圆锥造价 内联变量 和内联方法一样内联变量是提炼变量的反操作有两种内联变量的方法如果你将光标放置在变量的定义处进行内联变量重构所有引用该变量的地方都被替换变量定义语句被删除如果你将光标置于引用变量处进行内联变量操作则可以有两种选择只对当前的位置进行变量内联或内联变量的所有引用处 我们使用代码清单 演示第二种内联变量的方法将光标置于第行代码的totalPrice处Ctrl+Shift+R>Inline Variable调出内联变量的重构对话框如下图所示 educitycn/img_///jpg> 内联变量对话框 Variable选择内联的变量 Expression内联的表达式 Replace all occurrences内联所有引用totalPrice变量的地方否则只内联当前引用处 |