日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
從6行到92行:If-Else是貧瘠的多態(tài)性

本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。

10年的鹿邑網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整鹿邑建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“鹿邑網(wǎng)站設(shè)計”,“鹿邑網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

筆者常??吹皆S多分支發(fā)生在枚舉或其他離散值上,當某些開發(fā)人員被要求不要使用if-then-else時,甚至?xí)械綈阑?。if-else和switch當然可以生成簡潔的代碼,你的軟件不應(yīng)該由最少的行組成,也不必犧牲可讀性、可維護性或靈活性。

在if-then-else語句中使用枚舉的后果是什么呢?基于離散值的分支會使軟件難以更改。每個新功能都要求跟蹤分支發(fā)生的位置,并相應(yīng)地修改現(xiàn)有代碼。

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

我必須要說,使用if-else和switch進行分支的傳統(tǒng)方法已過時。它不可靠、不靈活。傳統(tǒng)方法中沒有面向?qū)ο蟮膬?nèi)容。但是它仍在蓬勃發(fā)展,因為學(xué)生們被迫認為它是正確的,甚至是最佳實踐。代碼是有效的,但你可以做得更好。

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

最初的一組要求

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

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

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

此代碼唯一好處是可以嘗試實現(xiàn)一種半CQS式的設(shè)計模式。如果你傾向于說“那就應(yīng)該是一個switch”,那你應(yīng)該花點時間思考一下軟件開發(fā)中到底什么是重要的。Switch對if-else來說完全無關(guān)緊要。

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

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

復(fù)雜的、令人頭痛的分支

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

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

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

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

我們可以做得更好,可以編寫可讀的、可維護的、靈活的代碼。通過用多態(tài)執(zhí)行代替?zhèn)鹘y(tǒng)的分支,類與它管理的需求之間有了明確的聯(lián)系。具有明確職責(zé)的簡單、高度凝聚力的類易于維護。檢測和糾正缺陷變得輕而易舉。最重要的是,軟件可以輕松容納新功能,而無需修改現(xiàn)有類。

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

簡化的UpdateAsync方法實現(xiàn)

請注意,你現(xiàn)在使用的是接口參數(shù)而不是枚舉。現(xiàn)在,該方法委托了知道如何對特定對象執(zhí)行更新的職責(zé)。IUpdateReason的具體實現(xiàn)如下所示,構(gòu)造函數(shù)參數(shù)和方法實現(xiàn)的細節(jié)不多做贅述。

UpdateReason接口及其具體實現(xiàn)

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

我們可以輕松地停在這里,結(jié)束一天的工作。你重構(gòu)了繁瑣的分支,并將其替換為多態(tài)。你的代碼現(xiàn)在是面向?qū)ο蟮?,并且易于維護。但也可以選擇進行最后一步。UpdateAsync(Reason,User)現(xiàn)在有些多余。為了解決這個問題,我們不再進行重構(gòu)——我們正在重新設(shè)計系統(tǒng)的各個部分。

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

圖源:unsplash

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


本文題目:從6行到92行:If-Else是貧瘠的多態(tài)性
當前URL:http://www.5511xx.com/article/cohjphh.html