[畢業(yè)生的商業(yè)軟件開發(fā)之路]盡早暴露錯誤原則
近期開始接觸到在校學(xué)生、高校實習(xí)生和畢業(yè)生,在此說一下筆者對這些徘徊在職場門口的學(xué)生一些建議,希望能給這些初學(xué)者進入軟件開發(fā)行業(yè)帶來一些幫助,使得畢業(yè)生能更順利的進入軟件開發(fā)公司開始職場生涯,人生來一個完美的轉(zhuǎn)彎。
-----------------------------------------------------------------------
開發(fā)者應(yīng)當(dāng)遵守“盡早暴露錯誤”的開發(fā)原則,這是因為程序錯誤是客觀存在的事實,應(yīng)當(dāng)正視它并有效的處理它,而不是簡單粗暴的和諧掉。而且在開發(fā)中應(yīng)當(dāng)盡早暴露出程序的錯誤,這有助于發(fā)現(xiàn)錯誤的本質(zhì),幫助改善程序質(zhì)量;若一味的和諧掩蓋錯誤,則錯誤越拖影響越大,最后不可收拾,程序崩潰。[袁永福版權(quán)所有]
下面舉個這條原則的例子,現(xiàn)數(shù)據(jù)庫中有一個名為Customers的數(shù)據(jù)表,其內(nèi)容如下:
|
CustomerID |
CompanyName |
ContactName |
ContactTitle |
Address |
City |
|
1 |
少室山公司 |
方證 |
采購員 |
東園西甲 30 號 |
長平 |
|
2 |
擎天航空 |
雷震子 |
銷售代表 |
常保閣東 80 號 |
莫斯科 |
|
3 |
華夏工程 |
李大禹 |
市場經(jīng)理 |
廣發(fā)北路 10 號 |
幽州 |
|
4 |
武當(dāng)投資 |
宋青書 |
物主 |
臨翠大街 80 號 |
巴伐利亞 |
|
5 |
擎天南京公司 |
大星星 |
物主 |
花園東街 90 號 |
許安 |
對此筆者可以寫出以下的兩種代碼來讀取并輸出其中的數(shù)據(jù):
第一種:
{
// 連接數(shù)據(jù)庫
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())
{
// 設(shè)置SQL語句
cmd.CommandText = @"
Select
CustomerID ,
CompanyName ,
ContactName ,
ContactTitle ,
Address ,
City
From Customers";
// 讀取并輸出數(shù)據(jù)
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
第二種:
{
// 連接數(shù)據(jù)庫
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())
{
// 設(shè)置SQL語句
cmd.CommandText = @"Select * From Customers";
// 讀取并輸出數(shù)據(jù)
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
這兩種代碼的唯一的區(qū)別就在于其中使用了不同的SQL語句,第一種代碼使用的SQL語句是
|
Select CustomerID , CompanyName , ContactName , ContactTitle , Address , City From Customers |
而第二種代碼使用的SQL語句是
|
Select * From Customers |
第一種SQL語句字符比較多,開發(fā)者比較懶的話很容易寫出第二種SQL語句。不過筆者推薦使用第一種SQL語句,因為第一種SQL語句符合盡早暴露程序錯誤的原則。[袁永福版權(quán)所有]
如果當(dāng)數(shù)據(jù)庫沒有問題,則兩種SQL語句都能執(zhí)行,程序都能正確的讀取數(shù)據(jù),此時第二種寫法反而貌似不錯。
不過實際中應(yīng)用程序開發(fā)和運行環(huán)境很復(fù)雜,比如發(fā)生了代碼中字段名拼寫錯誤、數(shù)據(jù)庫字段結(jié)構(gòu)發(fā)生改變,這些都是需要考慮到的問題。
例如數(shù)據(jù)表[袁永福版權(quán)所有]Customers中的字段Address由于某種原因刪掉了,于是這兩種代碼都會發(fā)生錯誤。
對于第一種代碼,程序會在執(zhí)行代碼“IDataReader reader = cmd.ExecuteReader();”時就會爆出異常“至少一個參數(shù)沒有指定值 OleDbException”。此時開發(fā)者借助VS.NET可以很快的確定出發(fā)生錯誤的代碼,并根據(jù)錯誤提示很容易猜測SQL語句寫錯了。于是開發(fā)者進行SQL語句與數(shù)據(jù)庫結(jié)構(gòu)的對比,很快就能發(fā)現(xiàn)錯誤的本質(zhì),那就是字段Address突然沒了。
而對于第二種代碼,程序順利的執(zhí)行了代碼“IDataReader reader = cmd.ExecuteReader();”,但在執(zhí)行代碼“Console.WriteLine("Address =" + reader["Address"]);”時爆出異常“Address IndexOutOfRangeException”。對于這個錯誤,開發(fā)者首先會有些迷惑,不知為什么發(fā)生錯誤,因為錯誤提示信息和數(shù)據(jù)庫聯(lián)系不大,而后懷疑代碼中的“reader["Address"]”出現(xiàn)字段名拼寫錯誤,花上一段時間仔細(xì)校對確定無誤后才會往前繼續(xù)尋找錯誤的來源,會發(fā)現(xiàn)SQL語句沒有拼寫錯誤,最后才會想到去查數(shù)據(jù)庫結(jié)構(gòu),繞了半天才發(fā)現(xiàn)數(shù)據(jù)庫字段Address沒了,這才是錯誤的本質(zhì)。
在這個例子中,數(shù)據(jù)庫字段Address刪掉的那一刻起,系統(tǒng)就存在隱患,而第一種代碼能在第一時間由于這個隱患而爆出錯誤,而開發(fā)者就能立即定位到離隱患最近的代碼,得到跟隱患密切相關(guān)的錯誤提示信息,也就能非常快的發(fā)現(xiàn)問題的本質(zhì),從而解決問題。這是一種將錯誤扼殺在搖籃當(dāng)中的做法,對開發(fā)者對程序都有好處。[袁永福版權(quán)所有]
而第二種代碼很和諧,沒能在第一時間讓隱患爆出錯誤,讓隱患養(yǎng)著更肥,一直默默的影響著程序的運行,最終隱患爆出更大的更讓人摸不著頭腦的錯誤,使得開發(fā)者需要花費更多的時間精力來處理這個錯誤,這是姑息隱患,將錯誤養(yǎng)大了出欄再殺的做法,對開發(fā)者對程序都有害處。
在VB中有一個寫作“On Error Resume Next”的語句,號稱能和諧掉程序中所有的錯誤,讓程序不爆出任何異常,丫就徹徹底底的破壇子破摔、掩耳盜鈴的做法,因此這種寫法應(yīng)用得比較少。
因此開發(fā)者要寫出一個真正和諧的程序,其過程必然不能簡單粗暴的和諧,要盡可能早的讓各種隱患爆出程序錯誤;隱患要上訪變成錯誤,程序不能打擊壓制,而且程序要疏通各種隱患上訪的通道,讓開發(fā)者更快的發(fā)現(xiàn)錯誤的本質(zhì),更快的解決錯誤。尊重科學(xué)規(guī)律,正視隱患和錯誤,正確處理錯誤而不是打壓隱患,程序才能和諧健壯。
嘿嘿,人類社會又何嘗不是這樣啊。[袁永福版權(quán)所有]
posted on 2011-08-30 11:16 袁永福 電子病歷,醫(yī)療信息化 閱讀(3162) 評論(13) 收藏 舉報
浙公網(wǎng)安備 33010602011771號