天天看點

[畢業生的商業軟體開發之路]盡早暴露錯誤原則

近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟體開發行業帶來一些幫助,使得畢業生能更順利的進入軟體開發公司開始職場生涯,人生來一個完美的轉彎。

-----------------------------------------------------------------------

     開發者應當遵守“盡早暴露錯誤”的開發原則,這是因為程式錯誤是客觀存在的事實,應當正視它并有效的處理它,而不是簡單粗暴的和諧掉。而且在開發中應當盡早暴露出程式的錯誤,這有助于發現錯誤的本質,幫助改善程式品質;若一味的和諧掩蓋錯誤,則錯誤越拖影響越大,最後不可收拾,程式崩潰。[袁永福版權所有]

下面舉個這條原則的例子,現資料庫中有一個名為Customers的資料表,其内容如下:

CustomerID

CompanyName

ContactName

ContactTitle

Address

City

1

少室山公司

方證

采購員

東園西甲 30 号

長平

2

擎天航空

雷震子

銷售代表

常保閣東 80 号

莫斯科

3

華夏工程

李大禹

市場經理

廣發北路 10 号

幽州

4

武當投資

宋青書

物主

臨翠大街 80 号

巴伐利亞

5

擎天南京公司

大星星

花園東街 90 号

許安

對此筆者可以寫出以下的兩種代碼來讀取并輸出其中的資料:

第一種:

using (IDbConnection conn = new OleDbConnection())  

{  

    // 連接配接資料庫  

    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 

        + System.IO.Path.Combine(Application.StartupPath, "Customers.mdb");  

    conn.Open();  

    using (IDbCommand cmd = conn.CreateCommand())  

    {  

        // 設定SQL語句  

        cmd.CommandText = @"  

            Select   

                CustomerID ,  

                CompanyName ,  

                ContactName ,  

                ContactTitle ,  

                Address ,  

                City  

            From Customers";  

        // 讀取并輸出資料  

        IDataReader reader = cmd.ExecuteReader();  

        if (reader.Read())  

        {  

            Console.WriteLine("CustomerID  =" + reader["CustomerID"]);  

            Console.WriteLine("CompanyName =" + reader["CompanyName"]);  

            Console.WriteLine("ContactName =" + reader["ContactName"]);  

            Console.WriteLine("ContactTitle=" + reader["ContactTitle"]);  

            Console.WriteLine("Address     =" + reader["Address"]);  

            Console.WriteLine("City        =" + reader["City"]);  

        }//if  

        reader.Close();  

    }//using  

}//using 

 第二種:

        cmd.CommandText = @"Select *  From Customers";  

 這兩種代碼的唯一的差別就在于其中使用了不同的SQL語句,第一種代碼使用的SQL語句是

Select

    CustomerID ,

    CompanyName ,

    ContactName ,

    ContactTitle ,

    Address ,

    City

From Customers

而第二種代碼使用的SQL語句是

Select * From Customers

第一種SQL語句字元比較多,開發者比較懶的話很容易寫出第二種SQL語句。不過筆者推薦使用第一種SQL語句,因為第一種SQL語句符合盡早暴露程式錯誤的原則。[袁永福版權所有]

如果當資料庫沒有問題,則兩種SQL語句都能執行,程式都能正确的讀取資料,此時第二種寫法反而貌似不錯。

不過實際中應用程式開發和運作環境很複雜,比如發生了代碼中字段名拼寫錯誤、資料庫字段結構發生改變,這些都是需要考慮到的問題。

例如資料表[袁永福版權所有]Customers中的字段Address由于某種原因删掉了,于是這兩種代碼都會發生錯誤。

對于第一種代碼,程式會在執行代碼“IDataReader reader = cmd.ExecuteReader();”時就會爆出異常“至少一個參數沒有指定值 OleDbException”。此時開發者借助VS.NET可以很快的确定出發生錯誤的代碼,并根據錯誤提示很容易猜測SQL語句寫錯了。于是開發者進行SQL語句與資料庫結構的對比,很快就能發現錯誤的本質,那就是字段Address突然沒了。

而對于第二種代碼,程式順利的執行了代碼“IDataReader reader = cmd.ExecuteReader();”,但在執行代碼“Console.WriteLine("Address     =" + reader["Address"]);”時爆出異常“Address IndexOutOfRangeException”。對于這個錯誤,開發者首先會有些迷惑,不知為什麼發生錯誤,因為錯誤提示資訊和資料庫聯系不大,而後懷疑代碼中的“reader["Address"]”出現字段名拼寫錯誤,花上一段時間仔細校對确定無誤後才會往前繼續尋找錯誤的來源,會發現SQL語句沒有拼寫錯誤,最後才會想到去查資料庫結構,繞了半天才發現資料庫字段Address沒了,這才是錯誤的本質。

在這個例子中,資料庫字段Address删掉的那一刻起,系統就存在隐患,而第一種代碼能在第一時間由于這個隐患而爆出錯誤,而開發者就能立即定位到離隐患最近的代碼,得到跟隐患密切相關的錯誤提示資訊,也就能非常快的發現問題的本質,進而解決問題。這是一種将錯誤扼殺在搖籃當中的做法,對開發者對程式都有好處。[袁永福版權所有]

而第二種代碼很和諧,沒能在第一時間讓隐患爆出錯誤,讓隐患養着更肥,一直默默的影響着程式的運作,最終隐患爆出更大的更讓人摸不着頭腦的錯誤,使得開發者需要花費更多的時間精力來處理這個錯誤,這是姑息隐患,将錯誤養大了出欄再殺的做法,對開發者對程式都有害處。

在VB中有一個寫作“On Error Resume Next”的語句,号稱能和諧掉程式中所有的錯誤,讓程式不爆出任何異常,丫就徹徹底底的破壇子破摔、掩耳盜鈴的做法,是以這種寫法應用得比較少。

是以開發者要寫出一個真正和諧的程式,其過程必然不能簡單粗暴的和諧,要盡可能早的讓各種隐患爆出程式錯誤;隐患要上訪變成錯誤,程式不能打擊壓制,而且程式要疏通各種隐患上訪的通道,讓開發者更快的發現錯誤的本質,更快的解決錯誤。尊重科學規律,正視隐患和錯誤,正确處理錯誤而不是打壓隐患,程式才能和諧健壯。

嘿嘿,人類社會又何嘗不是這樣啊。[袁永福版權所有]

     本文轉自xdesigner 51CTO部落格,原文連結:http://blog.51cto.com/xdesigner/652695,如需轉載請自行聯系原作者