1. 程式人生 > >重構——第一個案例

重構——第一個案例

/***
 * 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 天
	}