很容易假設(shè)一個(gè)系統(tǒng)在現(xiàn)場(chǎng)表現(xiàn)得和在工程臺(tái)上一樣完美。在開(kāi)發(fā)過(guò)程中,嵌入式軟件是在最好的條件下編寫的。嵌入式開(kāi)發(fā)人員知道,或者至少有他們自己的系統(tǒng)應(yīng)該如何工作的概念。
事情通常運(yùn)行得相當(dāng)順利,但隨著成千上萬(wàn)的設(shè)備開(kāi)始進(jìn)入用戶手中,意外發(fā)生和錯(cuò)誤發(fā)生的可能性在統(tǒng)計(jì)上變得很可能。在今天的文章中,讓我們探討開(kāi)發(fā)人員編寫可以處理意外錯(cuò)誤的軟件所需的策略。
策略 #1 – 不斷考慮可能出現(xiàn)的問(wèn)題
開(kāi)發(fā)人員需要部署以處理錯(cuò)誤的第一個(gè)策略是在編寫每一行代碼時(shí)積極質(zhì)疑可能出現(xiàn)的問(wèn)題。例如,當(dāng)我為如下函數(shù)編寫實(shí)現(xiàn)時(shí):
void Dio_WriteChannel(DioChannel_t Channel, bool
state)
{
// Additional code goes here
}
我問(wèn)自己幾個(gè)問(wèn)題:
如果 Channel 參數(shù)超出范圍會(huì)發(fā)生什么?
該函數(shù)應(yīng)該返回錯(cuò)誤代碼還是成功標(biāo)志?
如何驗(yàn)證所需的通道狀態(tài)是否已更改?
如果狀態(tài)試圖改變但不能改變,我該怎么辦?
內(nèi)存是否會(huì)損壞,以至于我的bool狀態(tài)變量不是真假? 如果是這樣,我該如何處理?
斷言是否足以在開(kāi)發(fā)時(shí)檢查邊界條件,還是應(yīng)該對(duì)參數(shù)進(jìn)行實(shí)時(shí)檢查?
這是很多問(wèn)題,或者諸如簡(jiǎn)單通用代碼塊之類的問(wèn)題,我們真的還沒(méi)有開(kāi)始填寫細(xì)節(jié)!但是,如果你希望能夠處理錯(cuò)誤,則必須不斷地質(zhì)疑代碼以及可能出現(xiàn)的問(wèn)題。
策略 #2 – 使用 TODO 記錄疑慮和問(wèn)題
隨著軟件的開(kāi)發(fā),有時(shí)問(wèn)題多于目前的答案。在上面的示例中,可能還沒(méi)有關(guān)于如何處理返回錯(cuò)誤的答案。暫時(shí)就這樣真的很容易,但是隨著其他問(wèn)題會(huì)出現(xiàn),這個(gè)問(wèn)題就會(huì)被遺忘在喧囂中。
大多數(shù)現(xiàn)代 IDE 都會(huì)有自定義標(biāo)簽,可以從代碼中提取這些標(biāo)簽來(lái)創(chuàng)建一個(gè)列表,例如使用
TODO。這些將顯示為信息性消息。如果有需要處理的錯(cuò)誤,但我不知道如何處理,我會(huì)使用 TODO。如果有一個(gè)實(shí)現(xiàn),但我想查看它,我可能會(huì)使用
TODO,但也可能使用其他一些我可以輕松搜索代碼的關(guān)鍵字。需要注意不要讓 TODO
信息消息過(guò)載,否則它會(huì)變得太嘈雜,但我們也希望確保我們不會(huì)丟失我們的問(wèn)題或問(wèn)題。
(是的,可以使用外部跟蹤器,但我發(fā)現(xiàn)將其與代碼一起保存要容易得多,因此代碼審查員和其他嵌入式開(kāi)發(fā)人員可以輕松地看到它)。
策略#3 – 總是抱著“以后會(huì)改的態(tài)度”
現(xiàn)在是修復(fù)、記錄或?qū)嵤╁e(cuò)誤檢查的最佳時(shí)機(jī)??偸怯心承﹩?wèn)題正在引起開(kāi)發(fā)人員的注意,雖然我們總是想返回并添加錯(cuò)誤處理,但卻總是在拖延!
一旦某些事情似乎對(duì)管理層有用,就該著手處理下一個(gè)緊迫問(wèn)題了。如果它有效,你為什么要在它上面投入更多的時(shí)間來(lái)減少回報(bào)?管理層沒(méi)有意識(shí)到你沒(méi)有包括錯(cuò)誤檢查或?qū)嵤┲写嬖诰薮蟮穆┒?如果產(chǎn)品需要健壯性,請(qǐng)不要嘗試稍后添加它,或者相信你可以稍后再返回并修復(fù)它。
結(jié)論
嵌入式開(kāi)發(fā)人員編寫軟件的方式?jīng)Q定了他們的系統(tǒng)是否能夠從錯(cuò)誤中優(yōu)雅地恢復(fù),關(guān)鍵是要有正確的開(kāi)發(fā)態(tài)度,在編寫軟件時(shí)考慮可能出現(xiàn)的問(wèn)題并實(shí)施恢復(fù)機(jī)制。為了更好地處理錯(cuò)誤,請(qǐng)?zhí)幚懋?dāng)前可能出現(xiàn)的問(wèn)題,否則將永遠(yuǎn)無(wú)法處理。