这是一段用 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 是梦想风暴。
查看原文:代码之丑(七)
评论