公司一程序員有一段代碼寫得太亂了,總結(jié)下這段代碼的邏輯那就是業(yè)務(wù)邏輯結(jié)束了,需要往很多地方寫入業(yè)務(wù)結(jié)束的處理邏輯,而這個(gè)程序員對(duì)于業(yè)務(wù)結(jié)束的處理邏輯,我大概看了下,總共寫了大概有3000行左右的代碼,直接給我整崩潰了,原因是他把所有邏輯都寫在了一起,但凡有一個(gè)邏輯寫的有問題,代碼都走不下去。
事情的起因是這個(gè)程序員寫的軟件總是在業(yè)務(wù)結(jié)束的時(shí)候出各種問題,改來改去,最后他自己都給改懵了,最后,項(xiàng)目經(jīng)理看他腦子已經(jīng)亂了,于是就讓我?guī)兔纯此拇a,看看能不能幫他找出問題來。
他這段代碼是寫在一個(gè)工具類里面的,還好,他還知道封裝一個(gè)工具類來整合業(yè)務(wù)結(jié)束的處理邏輯,但是一看代碼行,著實(shí)給我嚇了一跳,代碼總共有3000多行!
據(jù)這個(gè)程序員所說,在業(yè)務(wù)邏輯結(jié)束以后,首先得往數(shù)據(jù)庫里面寫入日志,還得在本地寫入文本日志,最后根據(jù)業(yè)務(wù)的結(jié)束狀態(tài),需要往外部發(fā)送業(yè)務(wù)邏輯的結(jié)束信號(hào),還得在PLC里面寫入數(shù)據(jù)和業(yè)務(wù)狀態(tài),最后我數(shù)了一下,前前后后,在這段業(yè)務(wù)結(jié)束的代碼里面總共需要往本地或者外部發(fā)送十幾種數(shù)據(jù)或者狀態(tài)。
但是呢,其實(shí)業(yè)務(wù)結(jié)束的邏輯本身就幾十行,后面近3000多行代碼都是用來處理數(shù)據(jù)信號(hào)和數(shù)據(jù)存儲(chǔ)以及狀態(tài)的。
最后,雖然我們通過分析,解決了這段代碼中的BUG,但是,面對(duì)這3000多行的代碼,我實(shí)在忍不了,因?yàn)榇a也得太臃腫、太耦合了!
于是我問他:“如果當(dāng)中有一段邏輯不用了你會(huì)怎么辦?”
他想了一會(huì)兒,但是也沒想多久,告訴我:“只能把這段代碼給注釋了!”
然后我又問他:“如果這里面又要新增一部分邏輯,你又會(huì)怎么辦?”
結(jié)果他說:“那就在現(xiàn)在的代碼基礎(chǔ)之上再插入新的邏輯代碼!”
我就知道他會(huì)這么說,而且,他也只能這么干!
接著,我又問他:“現(xiàn)在你把所有的業(yè)務(wù)結(jié)束邏輯都寫在了一塊,萬一系統(tǒng)里面有其他的界面需要知道業(yè)務(wù)結(jié)束的狀態(tài),你怎么辦?”
他告訴我:“我在代碼里面加了一個(gè)狀態(tài),其他頁面只要監(jiān)聽這個(gè)狀態(tài),就可以了!”
于是我反問:“你會(huì)怎么做?”
他回答:“在頁面上加一個(gè)定時(shí)器,然后一直讀取存儲(chǔ)狀態(tài)的變量,發(fā)現(xiàn)值變了,就知道業(yè)務(wù)結(jié)束了!”
我無奈地拍了拍腦袋:“萬一,我說萬一,有十幾二十甚至是上百個(gè)頁面都需要知道這個(gè)狀態(tài),你難道要寫十幾二十甚至上百個(gè)計(jì)時(shí)器嗎?”
這時(shí)候,他不說話了,于是我說:“事情不需要那么復(fù)雜,只需要一個(gè)委托就夠了!”
委托(Delegate),在C#這門編程語言里面又稱事件,簡(jiǎn)單得說,委托就是一種對(duì)事件的訂閱!通過聲明調(diào)用,可以將事件觸發(fā)信號(hào)分發(fā)給訂閱了委托的其他方法中!
比如說,現(xiàn)在代碼中的業(yè)務(wù)邏輯結(jié)束了,我們可以聲明一個(gè)委托,然后在業(yè)務(wù)邏輯結(jié)束時(shí)調(diào)用這個(gè)委托,這時(shí)候,只要外部代碼訂閱了這個(gè)委托,那么它們就會(huì)收到委托被執(zhí)行的消息,具體來說,訂閱委托實(shí)際上就是給委托一個(gè)執(zhí)行方法,在委托被執(zhí)行后,這個(gè)執(zhí)行方法會(huì)一起被執(zhí)行!
現(xiàn)在,在上述程序員寫的業(yè)務(wù)結(jié)束的代碼中集合了十幾種需要處理的邏輯,這時(shí)候,我們可以在業(yè)務(wù)結(jié)束的代碼里面聲明一個(gè)委托,然后將這十幾種需要處理的邏輯單獨(dú)封裝起來,然后訂閱業(yè)務(wù)結(jié)束的委托,當(dāng)委托被觸發(fā)后,這十幾種已經(jīng)封裝的邏輯塊都將收到事件信號(hào),逐一處理即可。
使用委托的好處在于它可以將繁復(fù)的業(yè)務(wù)邏輯模塊化,從而提升代碼的可讀性和可維護(hù)性,而委托本身就是一種狀態(tài)機(jī)制,因此,上述程序員寫的狀態(tài)字段的監(jiān)聽程序也就沒必要寫了,直接將委托本身當(dāng)作狀態(tài)或者使用委托參數(shù)的方式,把狀態(tài)傳遞給訂閱者即可。
結(jié)語
委托的概念其實(shí)很簡(jiǎn)單,其實(shí)就是“當(dāng)發(fā)生某件事情的時(shí)候由事情的發(fā)生者告訴訂閱者”,這跟我們手機(jī)上的消息推送機(jī)制很像,比如說當(dāng)你關(guān)注了某個(gè)明星的賬號(hào),當(dāng)這個(gè)明星的賬號(hào)下面有了新的動(dòng)態(tài),你的手機(jī)就會(huì)在第一時(shí)間收到這個(gè)明星發(fā)送的最新動(dòng)態(tài)。
有一些剛開始使用委托的程序員會(huì)覺得委托會(huì)增加代碼的復(fù)雜性,但是,實(shí)際上用對(duì)了委托會(huì)感覺真香!
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.