代碼之丑(七)——你的語言

作者: dreamhead  發布時間: 2011-01-03 21:35  閱讀: 836 次  推薦: 1   原文鏈接   [收藏]  

  這是一段用C++編寫的數據庫訪問代碼:

 
int Comm::setIDBySevNum(const XString& servnumber) {
DB db;
db.setSQL(
"select id from users where servnumber=:servnumber");
db.bind(
":servnumber", servnumber.c_str());
db.open();


if (!db.next()) {
return -1;
}
setID(db.getString(”id
"));
return 0;
}

  它告訴我們,如果找不到需要的值,那么操作失敗,返回-1,否則,返回0,成功了。

  顯然,寫下這段代碼的人有著C語言的背景,因為在C語言里面,我們常常會用整數表示成功失敗。我說過,這是一段C++代碼,而C++里面有一種類型叫做bool。

  整數之所以能夠占有本該屬于布爾類型的舞臺,很大程度上是受到C語言本身的限制。當然,C99之后,C程序員們終于有了屬于自己的體面的布爾類型。

  只是還有為數不少的C程序員依然生活在那個蠻荒年代。于是,很多人通過各種不盡如人意的方式模擬著布爾類型。不過,我們也看到了,偏偏就有這些生在福中不知福的程序員努力的重現著舊日時光。在我的職業生涯中,我見過許多用不同語法編寫的C程序。

  就個人學習語言經驗而言,了解了基本的語法之后,如果有可能,我希望找到一本 Effective,尋求這門語言的編程之道。很多語言都有著自己的Effective,比如《Effective C++》、《Effective Java》、《Effective C#》,等等。

  不了解語言,也會給丑陋代碼可乘之機。比如,下面這段C++代碼;

 
void CommCode::notifyCRM(XString* retparam) {
if (NULL == retparam) {
throw IllegalArgumentsException(GetErrorMsg(" CommCode ::notifyCRM"));
}
...
}

  如果把指針換成引用,就可以省去參數為空的判斷,因為在C++里,引用不為空。這里選擇了一個簡單的例子,而在真實的代碼里,這種檢查漫天遍野,其丑陋可想而知。某些函數里面,檢查甚至超過了真正的執行部分。

  工欲善其事,必先利其器。有了鏟子,就別再用手挖地了。

  作者簡介:

  鄭曄,ThoughtWorks公司咨詢師,擁有多年企業級軟件開發經驗,熱衷于探索各種程序設計語言在真實軟件開發中所能發揮的威力,致力于探尋合理的軟件開發方式,加入ThoughtWorks公司后,投入到敏捷開發方法的實踐之中,為其他公司提供敏捷開發方法方面的咨詢服務。他的blog是夢想風暴

  查看原文:代碼之丑(七)

1
0
 
標簽:重構
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()