<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### Pull Up Method(函數上移) 有些函數,在各個subclass 中產生完全相同的結果。 將該函數移至superclass。 ![](https://box.kancloud.cn/2016-08-15_57b1b5aa64f65.gif) **動機(Motivation)** 避免「行為重復」是很重要的。盡管「重復的兩個函數」也可以各自工作得很好, 但「重復」自身會成為錯誤的滋生地,此外別無價值。無論何時,只要系統之內出現重復,你就會面臨「修改其中一個卻未能修改另一個」的風險。通常,找出重復也有一定困難。 如果某個函數在各subclass 中的函數體都相同(它們很可能是通過「拷貝-粘貼」得到的),這就是最顯而易見的Pull Up Method 適用場合。當然,情況并不總是如此明顯。你也可以只管放心地重構,再看看測試程序會不會發牢騷,但這就需要對你的測試有充分的信心。我發現,觀察這些可疑(可能重復的〕函數之間的差異往往大有收獲:它們經常會向我展示那些我忘記測試的行為。 Pull Up Method 常常緊隨其他重構而被使用。也許你能找出若干個「身處不 同subclasses 內的函數」而它們又可以「通過某種形式的參數調整」而后成為相同函數。這時候,最簡單的辦法就是首先分別調整這些函數的參數,然后再將它們概括(generalize)到superclass中。當然,如果你自信足夠,也可以一次同時完成這兩個步驟。 有一種特殊情況也需要使用Pull Up Method : subclass 的函數覆寫(overrides) 了superclass 的函數,但卻仍然做相同的工作。 Pull Up Method 過程中最麻煩的一點就是:被提升的函數可能會引用「只出現于subclass 而不出現于superclass」的特性。如果被引用的是個函數,你可以將該函數也一同提升到superclass,或者在superclass 中建立一個抽象函數。在此過程中,你可能需要修改某個函數的簽名式(signature),或建立一個委托函數(delegating method)。 如果兩個函數相似但不相同,你或許可以先以Form Template Method 構造出相同的函數,然后再提升它們。 **作法(Mechanics)** - 檢查「待提升函數」,確定它們是完全一致的(identical)。 - 如果這些函數看上去做了相同的事,但并不完全一致,可使用Substitute Algorithm 讓它們變得完全一致。 - 如果「待提升函數」的簽名式(signature)不同,將那些簽名式都修改為你想要在superclass 中使用的簽名式。 - 在superclass 中新建一個函數,將某一個「待提升函數」的代碼拷貝到其中,做適當調整,然后編譯。 - 如果你使用的是一種強型(strongly typed)語言,而「待提升函數」 又調用了一個「只出現于subclass 未出現于superclass」的函數,你可以在superclass 中為被調用函數聲明一個抽象函數。 - 如果「待提升函數」使用了 subclass 的一個值域,你可以使用Pull Up Field 將該值域也提升到superclass;或者也可以先使用 Self Encapsulate Field,然后在superclass 中把取值函數(getter)聲明為抽象函數。 - 移除一個「待提升的subclass 函數」。 - 編譯,測試。 - 逐一移除「待提升的如函數」,直到只剩下superclass 中的函數為止。每次移除之后都需要測試。 - 觀察該函數的調用者,看看是否可以將它所索求的對象型別改為superclass。 **范例:(Example)** 我以Customer「表示「顧客」,它有兩個subclass :表示「普通顧客」的RegularCustomer 和表示「貴賓」PreferredCustomer。 ![](https://box.kancloud.cn/2016-08-15_57b1b5e674fa9.gif) 兩個subclass 都有一個createBill() 函數,并且代碼完全一樣: ~~~ void createBill (date Date) { double chargeAmount = charge (lastBillDate, date); addBill (date, charge); } ~~~ 但我不能直接把這個函數上移到superclass,因為各個subclass 的chargeFor() 函數并不相同。我必須先在superclass 中聲明chargeFor() 抽象函數: ~~~ class Customer... abstract double chargeFor(date start, date end) ~~~ 然后,我就可以將createBill() 函數從其中一個subclass 拷貝到superclass。拷貝完之后應該編譯,然后移除那個subclass 的createBill() 函數,然后編譯并測試。 隨后再移除另一個subclass 的createBill() 函數,再次編譯并測試: ![](https://box.kancloud.cn/2016-08-15_57b1b5e699f6b.gif)
                  <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>

                              哎呀哎呀视频在线观看