當發生錯誤時設置一個全局變量。此時可以在返回值中傳遞計算結果了。這種方法比第一種方法使用起來更加方便,因為調用者可以直接把返回值賦值給其他變量或者作為參數傳遞給其他函數。Windows的很多API運行出錯之后,也會設置一個全局變量。函數調用者可以通過調用函數 GetLastError分析這個表示錯誤的全局變量從而得知出錯的原因。但這個方法有個問題:調用者很容易就會忘記去檢查全局變量,因此在調用出錯時忘記做相應的錯誤處理,從而留下安全隱患。
異常。當函數運行出錯時,程序就拋出一個異常。程序員可以根據不同的出錯原因定義不同的異常類型。因此函數的調用者可以根據異常的類型就能知道出錯的原因,從而可以做相應的處理。另外,由于顯式劃分了程序正常運行的代碼塊(try模塊)和處理異常的代碼塊(catch模塊),代碼的邏輯比較清晰。異常在高級語言如C#中是強烈推薦的錯誤處理方式,但有些早期的語言比如C語言還不支持異常。另外,當拋出異常時,程序的執行會打亂正常的順序,對程序的性能有很大的影響。
上述三種錯誤處理的方式各有優缺點。那么面試時應聘者該采用哪種方式呢?這要看面試官的需求。在聽到面試官的題目之后,應聘者要盡快分析出可能存在哪些非法輸入,并和面試官討論該如何處理這些非法輸入。和面試官進行這樣的討論對應聘者是有益的,因為面試官會覺得他對錯誤處理有著全面的了解,并且還會覺得他有很好的溝通能力。
代碼的魯棒性
魯棒性是指程序能夠判斷輸入是否合乎規范要求,并對不合要求的輸入予以合理的處理。容錯性是魯棒性的一個重要體現。不魯棒的軟件在發生異常事件時,比如用戶輸入錯誤的用戶名、試圖打開的文件不存在或者網絡不能連接,就會出現不可預見的詭異行為,或者干脆整個軟件崩潰。這樣的軟件對于用戶而言,不亞于一場災難。
由于魯棒性對軟件開發非常重要,面試官在招聘時對應聘者寫出的代碼是否魯棒也非常關注。提高代碼的魯棒性的有效途徑是進行防御性編程。防御性編程是一種編程習慣,是指預見在什么地方可能會出現問題,并為這些可能出現的問題制定處理方式。
在面試時,最簡單也最實用的防御性編程就是在函數入口添加代碼以驗證用戶輸入是否符合要求。通常面試要求的是寫一兩個函數,應聘者需要格外關注這些函數的輸入參數。如果輸入的是一個指針,那指針是空指針怎么辦?如果輸入的是一個字符串,那么字符串的內容為空怎么辦?如果應聘者能把這些問題都提前考慮到,并作相應的處理,那么面試官就會覺得他有防御性編程的習慣,能夠寫出魯棒的軟件。
當然并不是所有與魯棒性相關的問題都只是檢查輸入的參數這么簡單。應聘者看到問題時,要多問幾個“如果不……那么……”這樣的問題。比如面試題“鏈表中倒數第k個結點”,這里隱含著一個條件就是鏈表中結點的個數大于k。應聘者就要問自己如果鏈表中的結點不是大于k個,那么代碼會出什么問題?這樣的思考方式,能夠幫助發現潛在的問題并提前解決問題。這比事后讓面試官發現問題之后應聘者再去慌忙分析代碼查找問題的根源要好很多。
小結
本文從規范性、完整性和魯棒性三方面介紹了應聘者如何在面試時寫出高質量代碼(如下圖所示)。第一,應聘者在白紙或者白板上手寫代碼時要注意規范性,盡量清晰地書寫每個字母,通過縮進和對齊括號讓代碼布局合理,同時還要合理命名代碼中的變量和函數。第二,應聘者最好在編碼之前全面考慮所有可能的輸入,確保寫出的代碼在完成了基本功能之外,還考慮了邊界條件,并做好了錯誤處理。只有全面考慮到這三方面的代碼才是完整的代碼。第三,應聘者要重視代碼的魯棒性,確保自己寫出的程序不會輕易崩潰。平時在寫代碼時,應聘者最好養成防御式編程的習慣,在函數入口判斷輸入是否有效并對各種無效輸入做好相應的處理。應聘者如果能夠做到這三點,自然就能寫出高質量的代碼,最終通過面試拿到Offer也將是水到渠成的事情。
作者何海濤,思科高級軟件工程師,之前先后任職于Autodesk和微軟。主要關注C++/C#的開發技術,并對設計模式和項目管理也很感興趣。
原文轉自:http://www.kuqin.com/job/20120210/318003.html