重構——第一個案例
阿新 • • 發佈:2018-12-19
/*** * 1.程式碼被閱讀和被修改的次數遠遠多於它被編寫的次數 2.保持程式碼易讀,易修改的關鍵,就是重構 3.重構具有風險 4.什麼是重構:在不改變程式碼外在行為的前提下,對程式碼做出修改,以改程序序的內部結構。重構是一種經千錘百煉形成的有條不紊的程式 整理方法。可以最大限度地減少整理過程中引起錯誤的機率。本質上說,重構就是在程式碼寫好之後改進它的設計。 5.如果你發現自己需要為程式新增一個特性,而程式碼結構使你 無法很方便地達成目的,那就先重構那個程式,使特性的新增比較容易進行,然後 再新增特性 6.重構之前,首先檢查自己是否有一套可靠的測試機制,這些測試必須有自我檢查能力。 7.程式碼塊越小,程式碼得功能就越容易管理。 8.重構技術就是微小的步伐修改程式,如果你犯下錯誤,很容易便可發現它。 9.任何一個傻瓜都能寫出計算機可以理解的程式碼,唯有寫出人類容易理解的程式碼,才是優秀的程式設計師。 重構,第一個案例 需求:這是一個影片出租店用的程式,計算每一位顧客的消費金額並列印詳單。操作者告訴程式:顧客租了哪些影片,租期多長,程式便根據 租賃時間和影片型別算出費用。影片分為三類:普通片,兒童片和新片。積分會根據租片種類是否為新 片而有不同。新片 會在 3天后變為普通片 根據需求:這其實是一個 狀態模式得應用: * * */ public class Fist { public static void main(String[] args) { MovieMy movieMy = new MovieMy(); NewPrice newPrice = new NewPrice(); // new Pr movieMy.setBorrday(5); movieMy.setNewday(5); newPrice.getPriceCode(movieMy); // movieMy.getAmount(this); } }
public class MovieMy { private Price price; private int borrday; private int newday; public Price getPrice() { return price; } public void setPrice(Price price) { this.price = price; } public int getBorrday() { return borrday; } public void setBorrday(int borrday) { this.borrday = borrday; } public int getNewday() { return newday; } public void setNewday(int newday) { this.newday = newday; } public void getAmount() { price.getPriceCode(this); } }
public class Price {
int getPriceCode(MovieMy movieMy) {
return 0;
}
}
public class NewPrice extends Price{ @Override int getPriceCode(MovieMy movieMy) { int amount=0; if (movieMy.getNewday()<Movie.NEWFLAG && movieMy.getBorrday()>Movie.NEWFLAG) { amount=(movieMy.getBorrday()-Movie.NEWFLAG)*4+(Movie.NEWFLAG-movieMy.getNewday())*5; System.out.println(amount); return amount; }else if (movieMy.getNewday()<Movie.NEWFLAG && movieMy.getBorrday()<Movie.NEWFLAG) { amount=(Movie.NEWFLAG-movieMy.getNewday())*5; System.out.println(amount); return amount; }else if (movieMy.getNewday()>Movie.NEWFLAG) { new ComPrice().getPriceCode(movieMy); } return amount; }
public class ComPrice extends Price{
@Override
int getPriceCode(MovieMy movieMy) {
int amount=0;
if (movieMy.getBorrday()<Movie.OLDFLAG) {
amount=(movieMy.getBorrday())*4;
System.out.println(amount);
return amount;
}else if (movieMy.getBorrday()>Movie.OLDFLAG) {
amount=(movieMy.getBorrday()-Movie.OLDFLAG)*3+Movie.OLDFLAG*4;
System.out.println(amount);
return amount;
}
return amount;
}
}
/**
*
* */
public class Movie {
public static final int NEWFLAG=3;// 新片標誌 為3 天
public static final int OLDFLAG=3;// 老片借出標誌 為3 天
}