關於重構的一點練習

初見純白已成灰發表於2020-10-04

我們總是在重複的造輪子。
2019年下半年就想要寫一個鬥地主記牌器的Java程式,結果到了現在也是僅僅完成了截圖的功能。

分享這篇部落格主要目的是分享一下關於重構的一點實踐成果,順便貼上程式碼。

早期時為了找螢幕截圖並獲取畫素點的Java原始碼,很難找,最後發現了一位博主寫的程式碼,結果結構比較混亂,非常難讀(也許是我技術不到位)。月前看了本關於重構的書,前幾天又想要寫鬥地主記牌器的程式,找呀找終於又找到了它,然後又是無從下手,於是練習了一下重構。專案是使用eclipse編寫的程式碼,用Git建立了一個本地倉庫(就在專案資料夾下的.git資料夾裡)儲存了每一次修改,由於英語水平有限,commit message中夾雜了中文,可能有些語句不太通順,歡迎大家評論區吐槽。

程式碼的專案資料夾我已上傳到資原始檔中,在文末會附上下載連結,當然是免費的。

下面就是附上的部分原始碼了,原始碼中註釋基本沒有,都是寫在了commit message中,歡迎在eclipse中使用Git與我一起開啟重構之旅!

下面這個類是實現螢幕截圖的類,是重構後的結果。

package qdu.lf.get;

import java.awt.AWTException;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ScreenShot {
	private final static String defaultImageFormater = "png";
	private BufferedImage bufferedImage;
	private static String path = "d:";
	private static String name = "temp.png";

	public static void setPath(String path) {
		ScreenShot.path = path;
	}
	
	public static void setName(String name) {
		ScreenShot.name = name;
	}
		
	public ScreenShot() {
		File tempFile = new File(path, name);
		setBufferedImage();
		saveToFile(tempFile);
	}
	
	public ScreenShot(int x, int y, int w, int h) {
		File tempFile = new File(path, name);
		setBufferedImage();
		bufferedImage = bufferedImage.getSubimage(x, y, w, h);
		saveToFile(tempFile);
	}
	
	private void setBufferedImage() {
		try {
			bufferedImage = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
		} catch (HeadlessException | AWTException e) {
			e.printStackTrace();
		}
	}
	
	private void saveToFile(File tempFile) {
		try {
			ImageIO.write(bufferedImage, defaultImageFormater , tempFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

重構是自動化測試驅動的,當然要有一個測試類來保證每一次修改都不會破壞原始碼的功能了,不過測試還不太會,只是簡單加了幾個測試類,見諒見諒。

package qdu.lf.get;

import org.junit.Test;

public class ScreenShotTest {

	@Test
	public void test_nonparametric_construction_method_ScreenShot() {
		new ScreenShot();
	}
	
	@Test
	public void test_construction_method_ScreenShot_by_method_setPath_and_setName() {
		ScreenShot.setName("temp1.png");
		ScreenShot.setPath("d:");
		new ScreenShot();
	}
	
	@Test
	public void test_construction_method_ScreenShot_with_parameters_x_y_w_h_about_subimage() {
		ScreenShot.setName("temp2.png");
		new ScreenShot(700, 600, 300, 100);
	}
}

最後還有一個類,主要是建了一個執行緒類持續截圖的,很簡單。

package qdu.lf.get;

public class ContinuedRunningScreenShot {
	public static void main(String[] args) throws InterruptedException {
		Thread thread = new Thread();
		thread.start();
		for (int i=0; i<20; i++) {
			Thread.sleep(100);
//			ScreenShot.setName("temp-"+i+".png");
			new ScreenShot();
		}
	}
}

補充一句,截圖後的圖片在d盤,是png圖片檔案。

最後,資源稽核還沒通過,通過後會附上下載連結。或者可以直接在本賬號分享的資源中查詢。

相關文章