代码中的地雷
以前聽說過軟件系統(tǒng)中有定時(shí)炸彈,今天我領(lǐng)教了代碼中的地雷。
所謂地雷,它的特性是安裝容易拆除難,下面段代碼完全符合地雷的特性。
public static void GetAvail(SegmentType segment, out int avail) {if(segment.StartDate < DateTime.Now)segment.ClientTypes.ForEach(n=>n.MaxAvail = 0);//.... }這是一個(gè)底層方法,依賴于它的代碼較多,即它的扇出較大。
這個(gè)函數(shù)的本意是獲取avail,但在獲取avail的同時(shí)染指了segment實(shí)例,而這個(gè)行為并未通過函數(shù)的名稱表現(xiàn)出來。這就意味著,只想通過該函數(shù)來獲取avail的程序員得到了一個(gè)意外的結(jié)果,傳入的segment實(shí)例被意外地修改了,而這個(gè)修改肯定不會(huì)在它的設(shè)計(jì)之中,所以接下來就可能會(huì)出現(xiàn)莫名其妙的邏輯錯(cuò)誤--他踩上這顆地雷。
現(xiàn)在,我們發(fā)現(xiàn)了這個(gè)“地雷”要將其排除掉,是否可以直接將其刪除呢?我只能說你可以試試,如果你膽子夠大且不怕系統(tǒng)出現(xiàn)其他問題。
現(xiàn)在,我們不能保證不存在這樣的上下文,即依賴于GetAvail中的那段所謂的“地雷”代碼才能夠正確執(zhí)行。如果這樣的上下文存在,那么貿(mào)然地刪除這段代碼的同時(shí)也將引爆這顆“地雷”。
而要排除這顆“地雷”,其驚險(xiǎn)程度不亞于排除一顆真正的地雷,因?yàn)槟悴恢赖降子卸嗌偕舷挛闹苯踊蜷g接地依賴于這個(gè)函數(shù)。你必須將這些依賴一個(gè)一個(gè)地列出來,然后逐一分析,然后做出正確的決定。這其中的險(xiǎn)在于沒有一個(gè)參照物可以幫你證明你已經(jīng)將所有的依賴都分析完了。所以當(dāng)產(chǎn)品發(fā)布時(shí),你還得提心吊膽。
如何解決,地雷問題。我認(rèn)為有兩點(diǎn)可以有所幫助。
也希望聽聽大家對(duì)代碼中的地雷的看法。
轉(zhuǎn)載于:https://www.cnblogs.com/czy/archive/2010/06/19/1761055.html
總結(jié)
- 上一篇: 使用ASP.NET 2.0进行记录错误
- 下一篇: linux基于usb启动配置