日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重构手法——提炼函数、搬移函数、以多态取代条件表达式

發(fā)布時間:2025/3/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重构手法——提炼函数、搬移函数、以多态取代条件表达式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

    • 我的心路歷程
    • 我的學(xué)習(xí)概括
      • Extract Method(提煉函數(shù))
        • 動機*--做法
        • 動機--做法*
      • Move Method(搬移函數(shù))
        • 動機*--做法
        • 動機--做法*
      • Replace Conditional with Polymorphism(以多態(tài)取代條件表達式)
        • 動機*--做法
        • 動機--做法*

我的心路歷程

今天開始學(xué)習(xí)《重構(gòu)改善既有代碼的設(shè)計》這本書。我首先翻閱了前言部分,書中寫了什么是重構(gòu)。什么是重構(gòu)?

我的思考心路:
對于重構(gòu)的認(rèn)識,我認(rèn)為程序開發(fā)并不是一個設(shè)計后即動作的行為,它需要在開發(fā)過程中持續(xù)整理程序,最大限度減少引入錯誤的概率的過程。

繼續(xù)翻閱前言,書中寫了本書有什么。告訴了書本的章節(jié)對應(yīng)內(nèi)容。第1章是一個重構(gòu)的Demo,第2章是重構(gòu)的原則定義,第3章是“壞代碼”的味道,第5-12章是核心部分——重構(gòu)的一些手法,等等。從哪開始快速入手看呢?

我的思考心路:
翻開第1章,我了解到這個Demo主要是個影片出租店程序,程序的功能是計算顧客消費金額并打印詳單。翻看了第1章目錄:起點–重構(gòu)第一步–分解并重組statement()–運用多態(tài)取代與價格相關(guān)的邏輯條件–結(jié)語。我看看結(jié)語講了什么?

翻閱結(jié)語,結(jié)語中表示第一章的Demo示范了數(shù)個重構(gòu)手法。重構(gòu)后的程序使責(zé)任分配更合理,這種風(fēng)格,將迥異于過程化風(fēng)格,也使碼農(nóng)難以再滿足于結(jié)構(gòu)化風(fēng)格。看看Demo示范了那幾個重構(gòu)手法?

Demo中重構(gòu)手法有:
P110 提煉函數(shù)
P142 搬移函數(shù)
P255 以多態(tài)取代條件表達式
P171 自封裝字段
P227 以state/strategy取代類型碼

我的學(xué)習(xí)概括

Extract Method(提煉函數(shù))

動機*–做法

我自己的理解如下:
概念:
這個手法做法是,把可以被組織到一起的代碼提煉到一個獨立函數(shù)中,并用名稱來表示用途。

應(yīng)用場景:

  • 過長的函數(shù)。
  • 需要注釋才能理解用途的代碼。
  • 達到目的:
    得到簡短而命名良好的函數(shù)。

    優(yōu)勢:

  • 函數(shù)粒度小,復(fù)用機會大,且覆寫更容易。
  • 使高層函數(shù)讀起來像一系列注釋。
  • 動機–做法*

    我自己的理解如下:
    做法簡圖:

    結(jié)合上圖,我的關(guān)注點如下:

    copy過程中注意安全:

  • 源函數(shù)層面:注意考慮變量、參數(shù)的作用域
  • 提煉出的代碼層面:臨時變量問題
  • 意外1:
    源函數(shù)中變量、參數(shù)的作用域與新函數(shù)不一致。
    措施:若是局部變量,新函數(shù)里傳入這部分參數(shù)。

    意外2:
    copy過程中臨時變量被修改了。
    措施:將被提煉代碼段處理為一個查詢,將結(jié)果賦值給相關(guān)變量。

    Move Method(搬移函數(shù))

    動機*–做法

    我自己的理解如下:

    概念簡圖:

    概念:
    類A中函數(shù)Fun a與類B有調(diào)用關(guān)系的情況下,Fun a最常引用的類B中建立類似形為Fun a`的新函數(shù),則Fun a變成單純的委托函數(shù),或可完全移除Fun a。

    應(yīng)用場景:

  • 一個類有太多行為。
  • 或類與類之間有太多合作而形成高度耦合。
  • 達到目的:
    使系統(tǒng)中的類更簡單,系統(tǒng)任務(wù)交付更干脆。

    動機–做法*

    我自己的理解如下:
    做法簡圖:

    結(jié)合上圖,我的關(guān)注點如下:
    移動路徑方向:函數(shù)Fun a與對象B交流比自己對象A交流多,所以搬移方向往B合適。

    搬移過程中注意安全:

  • 源類A的子類超類層面:若源類A的子類和超類,有函數(shù)Fun a的聲明不能進行搬移。除非類B表現(xiàn)出多態(tài)性。
  • 意外1:
    新目標(biāo)類B中缺少對A的引用機制。
    措施:把源對象類A的引用當(dāng)作參數(shù),傳給新目標(biāo)類B的Fun a`。

    意外2:
    Fun a包含異常處理,搬移后出現(xiàn)異常處理異常。
    措施:根據(jù)邏輯判斷某個異常該由哪個類處理,若類A負責(zé),則異常處理留在類A。

    Replace Conditional with Polymorphism(以多態(tài)取代條件表達式)

    動機*–做法

    我自己的理解如下:

    概念簡圖:

    概念:
    將條件表達式的每個分支放進一個子類的覆寫函數(shù)中,然后將原始函數(shù)聲明為抽象函數(shù)。

    應(yīng)用場景:
    同一組表達式在程序多個地方出現(xiàn)。

    優(yōu)勢:

  • 減少編寫明顯的條件表達式。
  • 使“類型碼switch語句”、“基于類型名稱的if-then-else語句”出現(xiàn)減少。
  • 避免條件表達式情況下,添加新類型時要更新所有表達式的缺點。
  • 降低系統(tǒng)各部分間的依賴。
  • 動機–做法*

    我自己的理解如下:

    結(jié)合上面的概念簡圖,我的關(guān)注點如下:
    替換過程中注意安全:

  • 多態(tài)性層面:必須有一個繼承結(jié)構(gòu)。它可以有2種選擇來做到這個結(jié)構(gòu)。一般情況下采取以子類取代類型碼的方法。若出現(xiàn)對象已經(jīng)創(chuàng)建后,要修改類型碼;或者,要重構(gòu)的類已經(jīng)有子類,則采取以state/strategy取代類型碼的方法。
  • 超類層面:超類中某些private可能需要聲明為protected。另外,超類中容納條件表達式的函數(shù)要聲明為抽象函數(shù)。
  • 總結(jié)

    以上是生活随笔為你收集整理的重构手法——提炼函数、搬移函数、以多态取代条件表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。