• 2010-12-06

    代码之丑(七)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/87216525.html

    这是一段用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++里,引用不为空。这里选择了一个简单的例子,而在真实的代码里,这种检查漫天遍野,其丑陋可想而知。某些函数里面,检查甚至超过了真正的执行部分。

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


    本文已经首发于InfoQ中文站 ,版权所有,原文为《专栏:代码之丑(七) 》,如需转载,请务必附带本声明,谢谢。

    InfoQ中文站 是一个面向中高端技术人员的在线独立社区,为Java、.NET、Ruby、SOA、敏捷、架构等领域提供及时而有深度的资讯、高端技术大会如QCon 、免费迷你书下载如《架构师 》等。

    分享到:

    历史上的今天:

    差异程序员 2005-12-06
    引用地址:

    评论

  • 说的太好了,要宽容。既然博主能写出优雅的代码,也该能够宽容别人相对“丑陋”的代码才行。况且我相信绝大多数的代码并非博主看到的那么的丑陋,毕竟他们大多都得到了美丽的结果。

    程序不是艺术,只是工具,它需要的是正确而绝非优雅。实际上,过于优雅的代码有的时候会变得难以调试,就可能影响正确性了。

    或许博主可以把标题改成“代码之乱”会更好些。。。


  • 看完了兄弟这个序列,继续,代码中稍有STL的使用,建议多用用
  • 支持博主,人总得有信仰,而且要宽容。代码必须写的优雅,这就是信仰
  • 人生是短暂的,何必把时间浪费在这种几近偏执的纠缠之中呢?程序是写给机器看的,你写得再优雅,也不见得能得到一个更优雅的结果。不如把时间省下来多想想你为什么活着,你为什么会对代码如此的偏执,这样不是更有意思吗?
  • 我不赞同你的看法,用int返回的好处是可以返回各种错误码,而不仅仅是true或false
  • 请问博主,您是如何找到一个自己一直坚持走下去的程序设计语言的?
  • C++里的new也不用检查返回值是否为NULL,如果new错误的话会直接抛出异常。对吗?