<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### Self Encapsulate Field(自封裝值域) 你直接訪問一個值域(field),但與值域之間的耦合關系逐漸變得笨拙。 為這個值域建立取值/設值函數(getting and setting methods ),并且只以這些函數來訪問值域。 ~~~ private int _low, _high; boolean includes (int arg) { return arg >= _low && arg <= _high; } ~~~ => ~~~ private int _low, _high; boolean includes (int arg) { return arg >= getLow() && arg <= getHigh(); } int getLow() {return _low;} int getHigh() {return _high;} ~~~ **動機(Motivation)** 在「值域訪問方式」這個問題上,存在兩種截然不同的觀點:其中一派認為,在該 變量定義所在的中,你應該自由(直接)訪問它;另一派認為,即使在這個class中你也應該只使用訪問函數間接訪問之。兩派之間的爭論可以說是如火如荼。(參見Auer在[Auer]p.413和Beck在[Beck]上的討論。) 本質而言,「間接訪問變量」的好處是,subclass得以通過「覆寫一個函數」而改變獲取數據的途徑;它還支持更靈活的數據管理方式,例如lazy initialization (意思是: 只有在需要用到某值時,才對它初始化)。 「直接訪問變量」的好處則是:代碼比較容易閱讀。閱讀代碼的時候,你不需要停下來說:『啊,這只是個取值函數。』 面臨選擇時,我總是做兩手準備。通常情況下我會很樂意按照團隊中其他人的意愿來做。就我自己而言,我比較喜歡先使用「直接訪問」方式,直到這種方式給我帶來麻煩為止。如果「直接訪問」給我帶來麻煩,我就會轉而使用「間接訪問」方式。 重構給了我改變主意的自由。 如果你想訪問superclass中的一個值域,卻又想在subclass中將「對這個變量的訪問」改為一個計算后的值,這就是最該使用Self Encapsulate Field的時候。「值域自我封裝」只是第一步。完成自我封裝之后,你可以在subclass中根據自己的需要隨意覆寫取值/設值函數(getting and setting methods )。 **作法(Mechanics)** - 為「待封裝值域」建立取值/設值函數(getting and setting methods)。 - 找出該值域的所有引用點,將它們全部替換為「對于取值/設值函數的調用」。 - 如果引用點是「讀取」值域值,就將它替換為「調用取值函數」;如果引用點是「設定」值域值,就將它替換為「調用設值函數」。 - 你可以暫時為該值域改名,讓編譯器幫助你查找引用點。 - 將該值域聲明為private。 - 復查,確保找出所有引用點。 - 編譯,測試。 **范例(Example)** 下面這個例子看上去有點過分簡單。不過,嘿,起碼它寫起來很快: ~~~ class IntRange { private int _low, _high; boolean includes (int arg) { return arg >= _low && arg <= _high; } void grow(int factor) { _high = _high * factor; } IntRange (int low, int high) { _low = low; _high = high; } ~~~ 為了封裝_low和_high這兩個值域,我先定義「取值/設值函數」(如果此前沒有定義的話),并使用它們: ~~~ class IntRange { boolean includes (int arg) { return arg >= getLow() && arg <= getHigh(); } void grow(int factor) { setHigh (getHigh() * factor); } private int _low, _high; int getLow() { return _low; } int getHigh() { return _high; } void setLow(int arg) { _low = arg; } void setHigh(int arg) { _high = arg; } ~~~ 使用本項重構時,你必須小心對待「在構造函數中使用設值函數」的情況。一般說來,設值函數被認為應該在「對象創建后」才使用,所以初始化過程中的行為有可能與設值函數的行為不同。在這種情況下,我也許在構造函數中直接訪問值域,要不就是建立另一個獨立的初始化函數: ~~~ IntRange (int low, int high) { initialize (low, high); } private void initialize (int low, int high) { _low = low; _high = high; } ~~~ 一旦你擁有一個subclass,上述所有動作的價值就體現出來了。如下所示: ~~~ class CappedRange extends IntRange { CappedRange (int low, int high, int cap) { super (low, high); _cap = cap; } private int _cap; int getCap() { return _cap; } int getHigh() { return Math.min(super.getHigh(), getCap()); } } ~~~ 現在,我可以在CappedRange class中覆寫getHigh(),從而加入對cap的考慮,而不必修改IntRange class的任何行為。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看