# Java範例程式重構(使用到Extract method & Move declaration & rename variable & rename method)
* 這是初始的程式碼,主要目的是想要從array裡找最大和最小的溫度
```
public class FindMinMax {
public static void main(String[] args) {
int[] temp = {18, 21, 35, 30, 22, 19, 17, 20}; //溫度
int min = temp[0];
int max = temp[0];
for(int i : temp) {
if(i < min) {
min = i;
}
if(i > max) {
max = i;
}
}
System.out.println("最低的溫度是 : " + min + "度");
System.out.println("最高的溫度是 : " + max + "度");
}
}
```
output :
最低的溫度是 : 17度
最高的溫度是 : 35度
* 雖然說這是一個簡單的小程式,不過最後那兩行程式
```
System.out.println("最低的溫度是 : " + min + "度");
System.out.println("最高的溫度是 : " + max + "度");
```
還可以再分別提煉出兩個方法,PrintMinTemp和PrintMaxTemp,於是程式還可以改寫成下面的結果
```
public class FindMinMax {
public static void main(String[] args) {
int[] temp = {18, 21, 35, 30, 22, 19, 17, 20}; //溫度
int min = temp[0];
int max = temp[0];
for(int i : temp) {
if(i < min) {
min = i;
}
if(i > max) {
max = i;
}
}
PrintMinTemp(min);
PrintMaxTemp(max);
}
public static void PrintMinTemp(int min) {
System.out.println("最低的溫度是 : " + min + "度");
}
public static void PrintMaxTemp(int max) {
System.out.println("最高的溫度是 : " + max + "度");
}
}
```
* 雖然看起來比初始的程式碼較易讀多了,但for-loop裡做了兩件事情,分別去找最大和最小的溫度,所以這兩件事情可以再提煉出兩個方法,getMinTemp 和 getMaxTemp,因此程式可以改寫成下面的結果
```
public class FindMinMax {
public static void main(String[] args) {
int[] temp = {18, 21, 35, 30, 22, 19, 17, 20}; //溫度
int min = temp[0];
int max = temp[0];
min = getMinTemp(temp, min);
max = getMaxTemp(temp, max);
printMinTemp(min);
printMaxTemp(max);
}
public static int getMinTemp(int[] temp, int min) {
for(int i : temp) {
if(i < min)
min = i;
}
return min;
}
public static int getMaxTemp(int[] temp, int max) {
for(int i : temp) {
if(i > max)
max = i;
}
return max;
}
public static void printMinTemp(int min) {
System.out.println("最低的溫度是 : " + min + "度");
}
public static void printMaxTemp(int max) {
System.out.println("最高的溫度是 : " + max + "度");
}
}
```
* 可能會有人認為說,改寫的結果會有兩個for-loop,這樣time complexity不是會變多嗎?這樣寫會沒有意義,但重構的精神價值在於讓程式看起來一目了然。雖然改寫的結果看似很完美,但是
```
int min = temp[0];
int max = temp[0];
min = getMinTemp(temp, min);
max = getMaxTemp(temp, max);
```
這4行雖然不影響執行結果,但這兩個宣告可以分別寫入getMinTemp和getMaxTemp這兩個方法裡面,目的在於為了讓訊息更清楚的表達,且讓訊息做隱藏,且比較不會把事情搞砸,因此改寫成下面結果
```
public class FindMinMax {
public static void main(String[] args) {
int[] temp = {18, 21, 35, 30, 22, 19, 17, 20}; //溫度
int min = getMinTemp(temp);
int max = getMaxTemp(temp);
printMinTemp(min);
printMaxTemp(max);
}
public static int getMinTemp(int[] temp) {
int min = temp[0];
for(int i : temp) {
if(i < min)
min = i;
}
return min;
}
public static int getMaxTemp(int[] temp) {
int max = temp[0];
for(int i : temp) {
if(i > max)
max = i;
}
return max;
}
public static void printMinTemp(int min) {
System.out.println("最低的溫度是 : " + min + "度");
}
public static void printMaxTemp(int max) {
System.out.println("最高的溫度是 : " + max + "度");
}
}
```
* 程式的變得比較有結構性,但如果還要進一步要求的話,這幾行程式碼
```
int[] temp = {18, 21, 35, 30, 22, 19, 17, 20}; //溫度
public static int getMinTemp(int[] temp)...
public static int getMaxTemp(int[] temp)...
public static void printMinTemp(int min)...
public static void printMaxTemp(int max)...
```
的變數名稱temp和函數名稱可以再重新命名,因為過度縮寫可能會不了解這個函式的意義或者可能誤導成別的意思,所以可以將temp重新命名為listTemperature,其他的函數名稱分別改為getMinTemperature、getMaxTemperature、printMinTemperature、printMaxTemperature,所以程式碼的改寫如下 :
```
public class FindMinMax {
public static void main(String[] args) {
int[] listTemperature = {18, 21, 35, 30, 22, 19, 17, 20}; //溫度
int min = getMinTemperature(listTemperature);
int max = getMaxTemperature(listTemperature);
printMinTemperature(min);
printMaxTemperature(max);
}
public static int getMinTemperature(int[] listTemperature) {
int min = listTemperature[0];
for(int i : listTemperature) {
if(i < min)
min = i;
}
return min;
}
public static int getMaxTemperature(int[] listTemperature) {
int max = listTemperature[0];
for(int i : listTemperature) {
if(i > max)
max = i;
}
return max;
}
public static void printMinTemperature(int min) {
System.out.println("最低的溫度是 : " + min + "度");
}
public static void printMaxTemperature(int max) {
System.out.println("最高的溫度是 : " + max + "度");
}
}
```
## 參考的程式範例來源
* 最新 Java 8 程式語言(第四版) 作者: 施威銘研究室,頁數:7-39
* https://learn.microsoft.com/en-us/visualstudio/ide/reference/move-declaration-near-reference?view=vs-2022