簡體   English   中英

編碼二傳手的更優雅方式

[英]More Elegant Way of Coding a Setter

我想知道他們是不是一種更聰明,更優雅的方式來編寫設置器,或者就此而言,是否有任何代碼必須檢查用戶輸入是否正確

這似乎很奇怪。 我是新手,所以也許這只是解決此問題的標准方法,但如果不是,我將不勝感激。

public void setMonth(){
    boolean run = true;
    while(run){
        int input = scan.nextInt();
        if(input > 0 && input < 13){
            this.month = input;
            run = false;
        }
    }
}

首先,您可以像這樣簡化代碼:

 public void setMonth() {
    int input = 0;
    do {
       input = scan.nextInt();
    } while(input <= 0 || input >= 13)

    this.month = input;
 }

除此之外,我將其分為兩個功能。 設置員只能設置一個值。

 public void setMonth(int month) {
    if(month > 0 && month <= 12) {
       this.month = month;
   } else {
        throw new IllegalArgumentException("Month has to be a value between 1 and 12 inclusively. Actual value was :" + month);
    }
 }

 public void readMonth() {
    int input = 0;
    do {
       input = scan.nextInt();
     } while(input <= 0 || input >= 13)

   setMonth(input);
 }

根據ChiefTwoPencils的建議,您還可以將設置器提取到其他類中。 從而進一步分離用戶輸入和數據。

 class MonthDataHolder {
     private int month;

      public MonthDataHolder(int month) {
           setMonth(month);
     }

     public void setMonth(int month) {
        if(isValidMonthValue(month)) {
            this.month = month;
        } else {
             throw new IllegalArgumentException("Month has to be a value between 1 and 12 inclusively. Actual value was :" + month);
         }
     }

      private boolean isValidMonthValue(month) {
           return month >= 1 || month <= 12;
      }
 }

 class InputReader {

       public MonthDataHolder readMonth() {
         int input = 0;
         do {
           input = scan.nextInt();
          } while(input <= 0 || input >= 13)

          return new MonthDataHolder(input);
      }
 }

setter和getter也稱為mutators和accessor。

我的理解是,這些方法僅用於檢索或修改對象的“狀態”。 它不應具有業務邏輯,或者應盡可能少地包含業務邏輯。

基本上有便宜的計算/業務邏輯。

讓您的設置員僅“設置”值。

public void setMonth(int month){
    this.month = month
}

雖然基於輸入來檢索值的方法可以在其他任何地方重用,但我建議您可以創建一個實用工具類,並將其作為靜態方法使用。

class DateUtil {
    public static int retrieveMonthBasedOnInput(){
    }
}

此類應具有業務邏輯以從用戶輸入中檢索詳細信息,並因此應在嘗試設置該bean實例的值時使用它。

該功能應該很簡單,並且只能完成一項工作。 也許您可以像這樣編寫代碼:

public void setMonth(int month) throws IllegalArgumentException {
    if(month<0 || month>11) throw new IllegalArgumentException("Month can only be set 0~11");
    this.month = month;
}

如您所見,該功能僅執行設置月份的一項操作。 如果參數不正確,則引發異常。

編寫“好” stter的規則:

1)不要在設置器中進行任何輸入輸出操作,例如訪問數據庫,文件,網絡,電子郵件發送,從命令行讀取等。如果必須這樣做,請在調用setXXX之前或之后進行,最好編寫一些服務方法為了那個原因。

2)設置器中的邏輯應盡可能小。 可以進行參數驗證,例如范圍檢查等...

3)Setter只能做它設計的一件事情(設置一個值),它不應該有任何副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM