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

2020-12-03 讀芯術

全文共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學習與發展的乾貨

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

相關焦點

  • 基因多態性的檢測方法
    現在多採用PCR-RFLP法進行研究基因的限制性片段長度多態性。2.單鏈構象多態性(SSCP):是一種基於單鏈DNA構象差別的點突變檢測方法。相同長度的單鏈DNA如果順序不同,甚至單個鹼基不同,就會形成不同的構象。在電泳時泳動的速度不同。
  • 同時觀測多個多態性位點新方法
    來自加州大學舊金山分校心血管疾病研究所,人類遺傳學研究所等處的研究人員解決了單體型實驗研究的一個難題:他們發現了一種能直接在單個人類DNA分子上同時觀測多個多態性位點(multiple polymorphic sites)的分子單體型分析方法
  • 使用Matlab對信號進行頻域分析的方法
    本文引用地址:http://www.eepw.com.cn/article/201808/391336.htm  本文討論使用Matlab對信號進行頻域分析的方法。  說到頻域,不可避免的會提到傅立葉變換,傅立葉變換提供了一個將信號從時域轉變到頻域的方法。之所以要有信號的頻域分析,是因為很多信號在時域不明顯的特徵可以在頻域下得到很好的展現,可以更加容易的進行分析和處理。
  • 使用LBA分析方法進行大分子生物標誌物的定量檢測分析
    商業化試劑盒的優勢和局限商業化試劑盒為生物標誌物提供了一種操作簡易、移植性強、高效便捷的快速檢測方案。相比較開發一個全新的方法用於生物標誌物的檢測,直接使用商業化的試劑盒可以大大地縮短生物分析方法建立的時間,減少方法建立所需的資源。
  • 現代數學的統一大勢:分支理論差異弱化,純粹和應用相融合
    數學的多起源性一方面決定了數學形式的多樣性;另一方面說明了數學的統一性,雖然形式不同,其數學內容卻基本一致:如通過不同的數字符號,表達同樣的自然數概念;許多數學事實,如勾股定理,在不同民族的數學中是一致的;求最大公約數所採用的輾轉相除法,在《幾何原本》和《九章算術》中也都有講述。在單一地區、單一民族的數學發展中,統一性表現得更明顯。
  • 現代檢測鋼鐵成分分析的方法有哪些
    打開APP 現代檢測鋼鐵成分分析的方法有哪些 儀表網 發表於 2020-03-21 11:03:09 如何科學合理地應用現代檢測技術判斷其成份,並依據其成份、元素百分率決定其材質特性及其應用範圍,在現代製造業中處關鍵作用。
  • 9條消除if……else的錦囊妙計,助你寫出更優雅的代碼
    其他的不多說,今天主要說說那些又臭又長的if...else要如何重構。在介紹更更優雅的編程之前,讓我們一起回顧一下,不好的if...else代碼一、又臭又長的if...else廢話不多說,先看看下面的代碼。
  • 霧霾的健康效應研究,需要更合適的方法
    近日,美國哈佛大學公共衛生學院的弗朗西斯卡·多米尼西(Francesca Dominici)等人在《科學》上發文指出,目前用評估霧霾與人體健康之間的關係,在方法上存在限制。為了使人們更準確地認識大氣顆粒物對健康的影響,科學家需要考慮使用「準實驗方法」(quasi-experimental,QE)進行分析評估[1]。
  • Java多態性理解
    Java中多態性的實現什麼是多態面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最後一個概念,也是最重要的知識點。多態的定義:指允許不同類的對象對同一消息做出響應。
  • 糖基化N-聚糖的分析方法、挑戰和展望
    糖基化對蛋白質功能的影響意味著糖基化在生物藥物中是產品的關鍵質量屬性(CQA),這使得N-聚糖結構的表徵分析成為生物製藥發展過程中必不可少的部分。N-聚糖結構和糖鏈分支結構的複雜為糖基化分析提出了特殊的挑戰,糖基化分析方法有多種方法,每種方法都有其自身的優點和局限性。
  • 成都生物所發現一種單核苷酸多態性新型檢測方法
    單核苷酸多態性(SNP)是指在基因組水平上,由於單個核苷酸的轉換、顛換、插入或缺失等引起DNA序列的多態性,它與許多疾病直接相關。因此,快速、準確、廉價的SNP檢測技術的開發,對藥物研究、個體化醫療、臨床試驗和分子診斷等至關重要,而目前大多數的SNP檢測方法均需要複雜的探針標記,並依靠高成本的檢測設備。
  • 19世紀的數學革命:新對象、新方法、新領域、新分支、新思想
    近代自然科學在19世紀得到全面的發展和進步,因此在文化史上19世紀被稱為「科學的世紀」。在數學領域同樣表現出前所未有的成就:1801年,德國數學家高斯的《算術研究》為數論建立一個體系;非歐幾何學的誕生和綜合幾何學的復興為幾何的蓬勃發展打下了基礎;分析方法及數學分析基礎的建立推動了函數論的發展,並為20世紀數學的發展開闢了廣闊的前景。
  • 詳細介紹Java多態性(二)
    多態性是通過:1 接口和實現接口並覆蓋接口中同一方法的幾不同的類體現的2 父類和繼承父類並覆蓋父類中同一方法的幾個不同子類實現的.一、基本概念多態性:發送消息給某個對象,讓該對象自行決定響應何種行為。
  • 詳細介紹Java多態性(一)
    通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用。下面介紹java的多態性。面向對象編程有三個特徵,即封裝、繼承和多態。封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了數據。繼承是為了重用父類代碼,同時為實現多態性作準備。那麼什麼是多態呢?
  • 溫溼度計的測量原理及使用方法
    在工農業生產、氣象、環保、國防、科研、航天等部門,經常需要對環境溼度進行測量及控制。對環境溫、溼度的控制以及對工業材料水份值的監測與分析都已成為比較普遍的技術條件之一,但在常規的環境參數中,溼度是最難準確測量的一個參數。這是因為測量溼度要比測量溫度複雜得多,溫度是個獨立的被測量,而溼度卻受其他因素(大氣壓強、溫度)的影響。
  • 現代漢語語法的五種分析方法
    現代漢語語法的五種分析方法 現代漢語語法的五種分析方法是語法學基礎裡很重要的一個內容.層次分析: 含義: 在分析一個句子或句法結構時,將句法構造的層次性考慮進來,並按其構造層次逐層進行分析,在分析時,指出每一層面的直接組成成分,這種分析就叫層次分析。 朱德熙先生認為,層次分析不能簡單地將其看作是一種分析方法,而是應當看做一種分析原則,是必須遵守的。
  • 「長文解讀」Nat Genet︱阿爾茨海默症和帕金森病的單核苷酸多態性...
    作者則對每種細胞類型的峰值進行了基序富集分析,即結構域分析。結果顯示了多個已知的細胞類型識別驅動因素,如少突細胞中SOX9和SOX10的基序,OPCs中的ASCL1的基序;以及轉錄因子SPI1和JUN/FOS分別在小膠質細胞和神經元中的富集(圖3)。這些數據進一步表明了ATAC-seq細胞類型特異性,特別是鑑定了膠質細胞(如星形膠質細胞和OPCs)的腦區域的異質性。
  • 使用 matlab 進行傅立葉分析和濾波
    公式法下例 是將振幅為1的5Hz正弦波和振幅為0.5的10Hz正弦波相加之後進行傅立葉分析。x,y定義如上,N是正整數,表示進行N點快速傅立葉變換。如果x長度小於N,則對x補零,使之與N相等;反則,則對x進行截取。對應的逆變換有兩種,分別為x=ifft(y)和x=ifft(y.N)。一般而言,N點fft的結果y,在處對應的頻率為最高採樣率的一半,y的後一半與前一半對稱。下例 是將振幅為1的5Hz正弦波和振幅為0.5的10Hz正弦波相加之後進行傅立葉分析。
  • 有沒有想過 你的數據分析方法可能已經過時?
    【IT168 編譯】資訊時代,能吃到蟲子的已不再是早起的鳥兒,而是那些數據驅動的、早起的鳥兒。像百度、阿里巴巴和騰訊這樣的大公司,都在不斷囤積數據,因為他們都知道數據是金燦燦的寶貝。  但僅僅囤積數據是不夠的。你需要熟練地篩選、全盤了解數據湖中溢出的所有數據。
  • 基於β衰變能譜測量探索確定¹³⁷Cs衰變分支比的方法
    利用高能區的低統計計數,通過庫裡厄圖和採用更精確的反演數據處理方法能否得到兩β衰變分支的分支比,能否擴展β衰變和內轉換電子譜測量實驗的應用範圍,是本研究的主要目的。進而驗證該技術和方法能否用於原子核結構和衰變性質的研究,也使得學生能夠更加深入地了解原子核有關β衰變和庫裡厄圖的有關知識。