1. 程式人生 > >記一次業務程式碼的重構

記一次業務程式碼的重構

業務需求

收聽任務側面的提示語根據使用者收聽時長和任務的完成情況進行動態提示。

流程圖如下

客戶端的虛擬碼

重構前程式碼點評:

  1. 當服務端配置的收聽任務動態變化時,可以正確處理,程式碼比較靈活。
  2. 存在重複程式碼,且if else過多,可讀性差。

重構後的程式碼

客戶端獲取收聽任務資訊的列表後,根據各任務的收聽時長門檻、收聽獎勵積分、收聽任務狀態組裝處理器鏈條:

組裝完畢後,傳入“已收聽時長”,即可動態獲得提示語。

詳細程式碼如下:

public class ListenTaskProcessor {

	//累計的積分獎勵
	private static Integer totalPoint = 0;

	// 門檻
	protected Integer threshold;

	// 積分獎勵
	protected Integer point;

	// 是否已領取積分
	protected Boolean hasGetPoint;

	// 後繼處理器
	protected ListenTaskProcessor nextProcessor;

	public ListenTaskProcessor(Integer threshold, Integer point, Boolean hasGetPoint) {
		super();
		this.threshold = threshold;
		this.point = point;
		this.hasGetPoint = hasGetPoint;
	}

	/**
	 * @param hasListenTime 已收聽時長
	 * @param ungetPoint 未領取積分
	 * @param totalPoint 累計的積分獎勵
	 * @return 收聽任務的提示語
	 */
	public String process(Integer hasListenTime, Integer ungetPoint) {

		totalPoint = totalPoint + this.point;

		//已收聽時長小於當前處理器的時長門檻,不需要累加積分
		if (hasListenTime < threshold) {
			return ungetPoint > 0 ? strOfGetPoint(ungetPoint) : strOfGoonListen(hasListenTime);
		}
		//存在後繼處理器,則累加積分後直接交給後繼處理器處理
		else if (null != this.nextProcessor) {
			ungetPoint = addUngetPoints(ungetPoint);
			return this.nextProcessor.process(hasListenTime, ungetPoint);
		}
		//已收聽時長大於當前處理器的時長門檻,則當前處理器無後繼
		else {
			ungetPoint = addUngetPoints(ungetPoint);
			return ungetPoint > 0 ? strOfGetPoint(ungetPoint) : strOfNextday();
		}
	}




	/**
	 * 累加待領取積分
	 * @param ungetPoint 之前的待領取積分
	 * @return 現在的待領取積分
	 */
	private Integer addUngetPoints(Integer ungetPoint) {
		return hasGetPoint ? ungetPoint : ungetPoint + point;
	}


	/**
	 * 告知使用者繼續收聽的提示語
	 * @param hasListenTime 已收聽分鐘數
	 * @return 使用者繼續收聽的提示語
	 */
	private String strOfGoonListen(Integer hasListenTime) {
		return "再聽" + (threshold - hasListenTime) + "分鐘領取" + this.point + "積分";
	}


	/**
	 * 告知使用者領取積分的提示語
	 * @param ungetPoint 待領取額積分
	 * @return 使用者領取積分的提示語
	 */
	private String strOfGetPoint(Integer ungetPoint) {
		return "領取" + ungetPoint + "積分";
	}

	/**
	 * 告知明天領取積分的提示語
	 * @return 明天領取積分的提示語
	 */
	private String strOfNextday() {
		return "明日可領取"+totalPoint+"積分";
	}

	public static void main(String[] args) {

		ListenTaskProcessor processor1 = new ListenTaskProcessor(10, 10, false);
		ListenTaskProcessor processor2 = new ListenTaskProcessor(20, 20, false);
		ListenTaskProcessor processor3 = new ListenTaskProcessor(60, 60, false);
		processor2.nextProcessor = processor3;
		processor1.nextProcessor = processor2;

		System.out.println(processor1.process(1, 0