使用if-else進行分支的方法已過時,分析多態性和現代方法更合適

2020-12-14 讀芯術

全文共2111字,預計學習時長6分鐘

筆者常常看到許多分支發生在枚舉或其他離散值上,當某些開發人員被要求不要使用if-then-else時,甚至會感到惱火。if-else和switch當然可以生成簡潔的代碼,你的軟體不應該由最少的行組成,也不必犧牲可讀性、可維護性或靈活性。

在if-then-else語句中使用枚舉的後果是什麼呢?基於離散值的分支會使軟體難以更改。每個新功能都要求跟蹤分支發生的位置,並相應地修改現有代碼。

這絕對不是我們想要的方式。這或許是使代碼正常工作的第一步,但隨著你不斷改進代碼,switch和if-then-else肯定早已不復存在。

我必須要說,使用if-else和switch進行分支的傳統方法已過時。它不可靠、不靈活。傳統方法中沒有面向對象的內容。但是它仍在蓬勃發展,因為學生們被迫認為它是正確的,甚至是最佳實踐。代碼是有效的,但你可以做得更好。

設想一下這個問題。假設出於某種原因,必須用一種方法來更新用戶。為了簡單起見,用戶只出於兩種理由需要在系統中被更新。

最初的一組要求

你可以在以下代碼段中實現這兩種簡單的情況。花一點時間閱讀這段設計欠佳的代碼吧,許多高級開發人員都把此當作噩夢,它甚至被認為是引發「十年怕井繩」的那條蛇。

是的,我看到過這樣瘋狂的野生代碼。這是一個非常幼稚的操作,它假定用戶永遠沒有那麼多理由進行更改了。

無用if-else指令的可怕代碼示例

此代碼唯一好處是可以嘗試實現一種半CQS式的設計模式。如果你傾向於說「那就應該是一個switch」,那你應該花點時間思考一下軟體開發中到底什麼是重要的。Switch對if-else來說完全無關緊要。

你每時每刻都會受到新要求的打擊,誰曾想到呢?你曾以為不會發生任何事情。對你的要求現在是這樣的:

你是否真的要通過添加其他枚舉值並附加兩個else-if語句來實現這兩個新原因下的用戶更新?如果決定走這條錯路,結果就會是下面這樣。

複雜的、令人頭痛的分支

這種實現本質上是貧瘠的多態性。除了不斷地添加額外的分支(這本身是一個值得懷疑的實踐)之外,每當需要調試或執行錯誤修復時,都會被完全無關的代碼包圍。

還有一個問題。這個方法標記正在欺騙我們,因為它不只是更新用戶。它還根據更新原因選擇執行哪種算法,甚至知道每種實現。現在顯而易見,這種方法負有大量責任。

我相信這個例子加深了一切關於if-else和switch的可怕印象。讓我們看看如何避免這種討厭的方法。

重構為多態執行非常容易。把基於分支的凌亂代碼重構為內聚的、簡單的、吻合實際需求的類。在有人說害怕使用類之前,筆者要先澄清一件事。實例化新類的成本通常可以忽略不計,在遇到瓶頸之前,請不要嘗試優化代碼。

我們可以做得更好,可以編寫可讀的、可維護的、靈活的代碼。通過用多態執行代替傳統的分支,類與它管理的需求之間有了明確的聯繫。具有明確職責的簡單、高度凝聚力的類易於維護。檢測和糾正缺陷變得輕而易舉。最重要的是,軟體可以輕鬆容納新功能,而無需修改現有類。

讓我們開始重構。來看看不使用if-then-else或switch能做得多好。UpdateAsync(Reason,User)現在變得如此簡單。

簡化的UpdateAsync方法實現

請注意,你現在使用的是接口參數而不是枚舉。現在,該方法委託了知道如何對特定對象執行更新的職責。IUpdateReason的具體實現如下所示,構造函數參數和方法實現的細節不多做贅述。

UpdateReason接口及其具體實現

每個類都完全符合其管理的要求。與過時方法相比,調試,修復錯誤和測試現在要容易多。在這種情況下,任何新要求都會產生一個專門的類。

我們可以輕鬆地停在這裡,結束一天的工作。你重構了繁瑣的分支,並將其替換為多態。你的代碼現在是面向對象的,並且易於維護。但也可以選擇進行最後一步。UpdateAsync(Reason,User)現在有些多餘。為了解決這個問題,我們不再進行重構——我們正在重新設計系統的各個部分。

在這種情況下,創建命令對象和命令處理程序是有意義的。它將簡化調用代碼,因為它只調度了諸如UpdateUserAddress之類的命令,並且將調用相應的處理程序的操作。

圖源:unsplash

在發現更合適的多態方法之前,傳統的分支通常是學生的工具。但毫無疑問,if-then-else和switch會使代碼難以閱讀、維護和調整。下次要使用傳統的多路分支來實現功能時,請花點時間分析如何利用多態性和現代方法,這樣可以讓你事半功倍。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • 編寫if 時不帶 else,你的代碼會更好!
    但是,If-Else已成為事實上的代碼分支解決方案,這確實是有道理的。這是向所有有抱負的開發人員講授的第一件事。不幸的是,許多開發人員從來沒有前進到更合適的分支策略。有些人的口頭禪是:If-Else是一把錘子,一切都是釘子。
  • 求求你們了,別再寫滿屏的 if/ else 了
    為什麼我們寫的代碼都是 if-else?程式設計師想必都經歷過這樣的場景:剛開始自己寫的代碼很簡潔,邏輯清晰,函數精簡,沒有一個 if-else,可隨著代碼邏輯不斷完善和業務的瞬息萬變:比如需要對入參進行類型和值進行判斷;這裡要判斷下對象是否為 null;不同類型執行不同的流程。
  • if-else代碼優化的八種方案
    condition){ return ;}//doSomething優化方案二:使用條件三目運算符使用條件三目運算符可以簡化某些if-else,使代碼更加簡潔,更具有可讀性。80:100;優化方案三:使用枚舉在某些時候,使用枚舉也可以優化if-else邏輯分支,按個人理解,它也可以看做一種表驅動方法。
  • 是時候和else關鍵字說再見了……
    全文共1754字,預計學習時長10分鐘沒有程式設計師不知道else關鍵字,If-else幾乎遍布於所有程式語言,這種簡單的條件邏輯使所有人都很容易理解。但優秀程式設計師的標誌是,不使用這個關鍵字。筆者在開始編程的時候,最大錯誤之一是在編寫條件句時過度使用else關鍵字,早五年前筆者就告別else了。原因何在呢?想一下else是什麼意思,其意為「如果滿足A就執行這個,如果不滿足A就執行那個」。
  • 「長文解讀」Nat Genet︱阿爾茨海默症和帕金森病的單核苷酸多態性...
    作者則對每種細胞類型的峰值進行了基序富集分析,即結構域分析。結果顯示了多個已知的細胞類型識別驅動因素,如少突細胞中SOX9和SOX10的基序,OPCs中的ASCL1的基序;以及轉錄因子SPI1和JUN/FOS分別在小膠質細胞和神經元中的富集(圖3)。這些數據進一步表明了ATAC-seq細胞類型特異性,特別是鑑定了膠質細胞(如星形膠質細胞和OPCs)的腦區域的異質性。
  • 徹底消滅if-else嵌套
    但if-else一般不建議嵌套超過三層,如果一段代碼存在過多的if-else嵌套,代碼的可讀性就會急速下降,後期維護難度也大大提高。2.2 親歷的重構前陣子重構了服務費收費規則,重構前的if-else嵌套如下。
  • 現代漢語語法的五種分析方法
    現代漢語語法的五種分析方法 現代漢語語法的五種分析方法是語法學基礎裡很重要的一個內容.層次分析: 含義: 在分析一個句子或句法結構時,將句法構造的層次性考慮進來,並按其構造層次逐層進行分析,在分析時,指出每一層面的直接組成成分,這種分析就叫層次分析。 朱德熙先生認為,層次分析不能簡單地將其看作是一種分析方法,而是應當看做一種分析原則,是必須遵守的。
  • MSA數據分析方法和應用案例
    即對已判定為合格的零件進行抽樣檢查, 經過科學的統計理論分析, 找出因測量系統因素導致不合格的因素, 並加以整改, 逐漸減少產生不合格產品因素的存在,從而達到控制產品質量的最終目的。1 基本MSA方法測量系統分析,顧名思義針對的是整個測量系統的穩定性和準確性,它的核心是分析測量系統的位置變差、寬度變差。
  • 離散數學是近年來產生的一門新課程,它是現代數學的一個重要分支
    離散數學是近幾十年來產生的一門新課程,它是現代數學的一個重要分支,是計算機科學中專業基礎理論的核心課程,其整個內容體系都是圍繞計算機可以接受和處理的數據對象展開研究,並隨著計算機科學的發展而逐步發展、逐步完善和逐步深入。
  • 邏輯思維&分析方法
    而領域方法,進一步歸納則能夠成為通用了方法論。 關於數據分析,本文將從邏輯思維和分析方法2個角度進行解讀,其中分析方法會介紹數據分析前的準備以及數據如何為我們創造長期價值。 在邏輯樹的使用場景下,公式法不太關注細分場景以及整體漏鬥。在進行細化分析時結合場景、操作流程,對公式進行進一步的細化。 在結合過程法時,須注意的點是完全窮舉。 舉個例子:在活動中分析成交時,會使用訪問人數、點擊購買按鈕人數、成交人數去分析漏鬥。
  • 沃爾沃汽車公司使用Adams進行耐久性道路載荷仿真的新方法
    沃爾沃汽車公司使用Adams進行耐久性道路載荷仿真的新方法耐久性測試是汽車產品開發中關鍵的一個方面。 擁有回答「是否耐久」這個問題的能力不僅會影響零部件的設計,還會影響整個系統。 在設計周期後期發現的耐久性問題需要花費大量時間和金錢來解決。
  • 跳舞毯的好處和使用方法 跳舞毯怎麼跳技巧
    跳舞毯的好處和使用方法 跳舞毯怎麼跳技巧【導讀】:跳舞毯是運動器材,使用跳舞毯跳舞可以起到減肥健身的作用,下面一起來看看跳舞毯的好處和使用方法,跳舞毯怎麼跳技巧?跳舞毯的好處跳舞毯的好處是可以纖體、健身、還能起到很好的減肥效果。
  • 哈佛醫學院Church等團隊開發新的方法,可快速組裝染色體
    Church等人在Nature Biotechnology 在線發表題為「Chromosome-scale, haplotype-resolved assembly of human genomes」的研究論文,該研究提出了一種稱為二倍體組裝(DipAsm)的方法,該方法使用長而準確的讀數和長距離構象數據,以在
  • 6種常見的數據分析方法論及應用
    對於數據分析來說,數據分析方法論是非常重要的,對於想入行數據分析的小白來說,有一些常見的數據分析方法論(模型)可以直接套用,本文將為大家講解6個常見的數據分析方法論及應用,幫助大家快速入門數據分析!PEST分析法主要用於對宏觀環境的分析,雖然不同行業和企業有其自身特點和經營要素,分析的具體內容會有差異,但一般都應對PEST這四個方面進行分析。例如,用PEST分析生鮮行業,如下圖所示。
  • 使用正確的用戶體驗研究方法
    用戶體驗領域具有廣泛的研究方法。為了更好地理解何時使用哪種方法,本文從態度與行為、定性與定量、使用環境這三個維度進行分析,並將其中常見的用戶研究方法匯總成清單以供大家參考。
  • 跟風買束腰帶前,你更應該先了解風險和使用方法!
    我們佩戴時間減少,佩戴鬆緊合適,選透氣性好的不就解決了嗎?然後再結合飲食和運動,發揮一下束腰帶的輔助功能不就可以了嗎。。。3如何正確使用束腰帶及好處首先,適當佩戴合適尺碼的束腰帶對有的人來說可以一定程度上減少食量,提醒自己少吃。第二,女生在中低強度運動時候適當佩戴是合適的,可以起到一定支撐和收緊核心的作用。
  • SPSSAU數據分析思維培養系列2:分析方法
    在完成數據準備和清理工作後,就要進入到正式分析階段,而選擇什麼樣的數據分析方法進行分析是關鍵。想要進行科學和系統化的數據分析,分析方法的思維是必備項。本文為SPSSAU數據分析思維培養的第2篇文章,將分別從數據類型談起,剖析數據應該如何分析,包括數據的基礎描述,數據質量的判斷。
  • 數據分析必讀乾貨:簡單而實用的3大分析方法
    細分分析法,常用於為分析對象找到更深層次的問題根源。難點在於我們要理解從哪個角度進行「細分」與「深挖」才能達到分析目的。就好像高中課程中解幾何題一樣,如果找對了「解題思路」,問題就迎刃而解;如果「解題思路」錯了,勞心費力不說,問題還解決不了。
  • 七種回歸分析方法,個個經典
    什麼是回歸分析? 回歸分析是一種預測性的建模技術,它研究的是因變量(目標)和自變量(預測器)之間的關係。這種技術通常用於預測分析,時間序列模型以及發現變量之間的因果關係。例如,司機的魯莽駕駛與道路交通事故數量之間的關係,最好的研究方法就是回歸。
  • 新納米孔測序方法可實現對千兆鹼基大小的基因組進行分析
    新納米孔測序方法可實現對千兆鹼基大小的基因組進行分析 作者:小柯機器人 發布時間:2020/12/1 13:15:58 英國諾丁漢大學Matthew Loose小組利用工具包「Readfish」,實現了對千兆鹼基大小基因組進行靶向納米孔測序