近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟體開發行業帶來一些幫助,使得畢業生能更順利的進入軟體開發公司開始職場生涯,人生來一個完美的轉彎。
-----------------------------------------------------------------------
開發者應當遵守“盡早暴露錯誤”的開發原則,這是因為程式錯誤是客觀存在的事實,應當正視它并有效的處理它,而不是簡單粗暴的和諧掉。而且在開發中應當盡早暴露出程式的錯誤,這有助于發現錯誤的本質,幫助改善程式品質;若一味的和諧掩蓋錯誤,則錯誤越拖影響越大,最後不可收拾,程式崩潰。[袁永福版權所有]
下面舉個這條原則的例子,現資料庫中有一個名為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,如需轉載請自行聯系原作者