重构方法
提炼函数
将代码放在独立函数里中,并让函数名解释该函数的用途。
函数的粒度越小,被复用的可能性就越大;并且粒度越小,函数的覆写也会更容易。
版本一:无局部变量
修改前:
// 做饭
public void cook(){
// 买菜
System.out.println("买菜开始");
System.out.println("买菜逻辑");
System.out.println("买菜结束");
// 洗菜
System.out.println("洗菜开始");
System.out.println("洗菜逻辑");
System.out.println("洗菜结束");
// 做菜
System.out.println("做菜开始");
System.out.println("做菜逻辑");
System.out.println("做菜结束");
}
修改后:
// 做饭
public void cook(){
buyVegetables();
washVegetables();
doVegetables();
}
void buyVegetables() {
// 买菜
System.out.println("买菜开始");
System.out.println("买菜逻辑");
System.out.println("买菜结束");
}
void washVegetables() {
// 洗菜
System.out.println("洗菜开始");
System.out.println("洗菜逻辑");
System.out.println("洗菜结束");
}
void doVegetables() {
// 做菜
System.out.println("做菜开始");
System.out.println("做菜逻辑");
System.out.println("做菜结束");
}
版本二: 对局部变量做更改
对局部变量做更改,可以直接把局部变量做为参数传入函数(基础类型不OK的哦,例如String、Integer)
修改前:
public static void main(String[] args){
Vegetables vegetables = new Vegetables();
System.out.println("洗菜开始");
System.out.println("洗菜逻辑");
System.out.println("洗菜结束");
vegetables.setVegetablesState("菜已清洗结束");
System.out.println("菜的状态:" + vegetables.getVegetablesState());
}
修改后:
public static void main(String[] args){
Vegetables vegetables = new Vegetables();
washVegetables(vegetables);
System.out.println("菜的状态:" + vegetables.getVegetablesState());
}
public static void washVegetables(Vegetables vegetables) {
// 洗菜
System.out.println("洗菜开始");
System.out.println("洗菜逻辑");
System.out.println("洗菜结束");
vegetables.setVegetablesState("菜已清洗结束");
}
版本二: 分解函数内创建局部变量
如果局部变量在分解函数内创建或者在分解函数内被重新赋值,后面还要继续使用,则需要做为返回值传递出来。
修改前:
public static void main(String[] args) {
System.out.println("买菜开始");
List<Vegetables> vegetables = new ArrayList<Vegetables>();
Vegetables tomatoes = new Vegetables();
tomatoes.setVegetablesName("tomato");
tomatoes.setVegetablesPrice(2.00);
vegetables.add(tomatoes);
Vegetables eggs = new Vegetables();
eggs.setVegetablesName("egg");
eggs.setVegetablesPrice(5.00);
vegetables.add(eggs);
System.out.println("买菜结束");
for (Vegetables tmp : vegetables) {
System.out.println("买到的菜都有:" + tmp.toString());
}
washVegetables(vegetables);
}
public static void washVegetables(List<Vegetables> vegetables) {
// 洗菜
System.out.println("洗菜开始");
System.out.println("洗菜逻辑");
System.out.println("洗菜结束");
for (Vegetables tmp : vegetables) {
tmp.setVegetablesState("菜已清洗结束");
}
}
修改后:
public static void main(String[] args) {
List<Vegetables> vegetables = buyVegetables();
for (Vegetables tmp : vegetables) {
System.out.println("买到的菜都有:" + tmp.toString());
}
washVegetables(vegetables);
}
public static List<Vegetables> buyVegetables() {
// 买菜
System.out.println("买菜开始");
List<Vegetables> vegetables = new ArrayList<Vegetables>();
Vegetables tomatoes = new Vegetables();
tomatoes.setVegetablesName("tomato");
tomatoes.setVegetablesPrice(2.00);
vegetables.add(tomatoes);
Vegetables eggs = new Vegetables();
eggs.setVegetablesName("egg");
eggs.setVegetablesPrice(5.00);
vegetables.add(eggs);
System.out.println("买菜结束");
return vegetables;
}
public static void washVegetables(List<Vegetables> vegetables) {
// 洗菜
System.out.println("洗菜开始");
System.out.println("洗菜逻辑");
System.out.println("洗菜结束");
for (Vegetables tmp : vegetables) {
tmp.setVegetablesState("菜已清洗结束");
}
}