簡體   English   中英

清潔代碼 - 以下划線開頭的受保護方法的目的是什么?

[英]Clean Code - what's the purpose of protected method starting with an underscore?

我正在閱讀鮑勃叔叔的清潔代碼 在第16章中,該書展示了如何重構一個例子。 有一部分我無法達到以這種方式寫作的目的。

  • 這里使用protected關鍵字的目的是什么?
  • 為什么像_getMinimumYear()這樣的方法以下划線開頭?
  • 為什么使用一對具有相同名稱的方法而不是像抽象方法那樣
    public abstract int getMinimumYear();

public abstract class DayDateFactory {

    private static DayDateFactory factory = new SpreadsheetDateFactory();
    public static void setInstance(DayDateFactory factory) {
        DayDateFactory.factory = factory;
    }

    protected abstract DayDate _makeDate(int ordinal);
    protected abstract DayDate _makeDate(int day, Month month, int year);
    protected abstract DayDate _makeDate(int day, int month, int year);
    protected abstract DayDate _makeDate(java.util.Date date);
    protected abstract int _getMinimumYear();
    protected abstract int _getMaximumYear();

    public static DayDate makeDate(int ordinal) {
      return factory._makeDate(ordinal);
    }

    public static DayDate makeDate(int day, Month month, int year) {
      return factory._makeDate(day, month, year);
    }

    public static DayDate makeDate(int day, int month, int year) {
      return factory._makeDate(day, month, year);
    }

    public static DayDate makeDate(java.util.Date date) {
      return factory._makeDate(date);
    }

    public static int getMinimumYear() {
      return factory._getMinimumYear();
    }

    public static int getMaximumYear() {
      return factory._getMaximumYear();
    }
}

    public class SpreadsheetDateFactory extends DayDateFactory {
    public DayDate _makeDate(int ordinal) {
    return new SpreadsheetDate(ordinal);
    }

    public DayDate _makeDate(int day, Month month, int year) {
    return new SpreadsheetDate(day, month, year);
    }

    public DayDate _makeDate(int day, int month, int year) {
    return new SpreadsheetDate(day, month, year);
    }

    public DayDate _makeDate(Date date) {
    final GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    return new SpreadsheetDate(
    calendar.get(Calendar.DATE),
    Month.fromInt(calendar.get(Calendar.MONTH) + 1),
    calendar.get(Calendar.YEAR));
    }

    protected int _getMinimumYear() {
    return SpreadsheetDate.MINIMUM_YEAR_SUPPORTED;
    }

    protected int _getMaximumYear() {
    return SpreadsheetDate.MAXIMUM_YEAR_SUPPORTED;
    }
}

Python使用一個前導下划線來表示該方法是內部的,而不是與外部世界簽訂任何合同的一部分。 好像鮑勃叔叔正在做類似的事情,除了這里當然沒有工具支持。 隨着時間的推移,他將注意力從為熟悉C ++的觀眾的寫作轉移到為熟悉腳本語言的人寫作; 他可能期望他的讀者對Python或Ruby有足夠的熟悉來識別這種事情。 所以他正在使用一個約定,而不是Java。

在這里,鮑勃叔叔正在對他介紹的工廠實例方法進行強調。 看起來他並不打算公開這些方法(它們只對子類和同一個包中的類可見),他工廠的子類必須實現它們,但是包外的代碼不會看到它們。 他還希望對工廠方法使用與公共靜態方法相同的名稱,但他需要一個約定來保持它們的正確性。 我認為他正試圖盡量減少將內部工廠的實例方法與暴露的靜態方法混淆的可能性,而不為工廠引入單獨的接口。

暫無
暫無

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

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