首页 > Chao Huang, 程序设计 > 代码规范

代码规范

2009年3月10日 chaohuang

没有规矩,不成方圆。有时候发现,读好的开源产品的代码,如Linux、JDK等,其感受如饮美酒,喜不自胜。然而最近读到一些国内客户和大学毕业生的代码,其感觉就像一个头有十个大,对比很强烈。

千里之行,始于足下。越是历久弥香的产品,越是要求严格,也就意味着每一行代码都很讲究。要做出世界一流的软件来,除了要遵循软件项目管理的种种规范(需求、设计、风险、测试等等),对于开发者的编码要求和规范也不少。

我想,在此谈谈我的一点浅见。对于一个合格的开发者而言,其编写每一行代码的时候,大致首先要考虑的地方有:
- 我遵循相关的代码规范了没有?
- 注释写了没有?注释写的简洁明了吗?
- 针对各种异常情况加以判断和处理了吗?
- 安全退出了吗?释放内存没?有没有内存泄漏?

下面分别简单说明一下。
- 我遵循相关的代码规范了没有?
1. 比如,Sun的Java代码规范要求缩进,貌似很多人注意到了。但是按80个字符折行,你注意到了吗?在咱们Berkeley DB Java版做开发甚至还要求每个函数体不超过一屏幕高。有人不理解,为什么?应为,只有这样,在各种屏幕/环境下看到的你的代码样式都是一致的。从而,方便别人审阅你的代码,也方便了自己。
2. 对变量,函数,类等命名时要遵循代码规范。举个反面例子,假设一个项目组成员10人,有人喜欢用getObject()来命名,有人喜欢readObject(),有人倾向retrieveObj(),有人用getInstance()… 其结局不言而喻。

- 注释写了没有?注释写的简洁明了吗?
举个例子,你要在程序中做排序。你决定实现最简单的冒泡排序。学过计算机的都知道,冒泡排序代价很昂贵,但是若排序的个体数目不大的时候(比如n<10)却用起来不错。所以当你写代码的时候,就应该大致这样写注释:
/**
* We need to sort the elements, since that will allow us to easily index
* into the array. Since the number of elements is expected to be small, it
* is okay to use bubble sort. If the number of elements to be sorted is
* significant, then it would be appropriate to use a more efficient
* sorting algorithm.
*/

- 针对各种异常情况加以判断和处理了吗?
假设有个功能模块,接受从输入流传过来的数据。在理想情况下,预期输入的可能是用户姓名,格式化的:(First, Middle, Last)。那么,我想程序开发者在实现这个功能的时候,应该考虑到,传过来的可能是西文字符集,中文字符集。同样,也有可能是不规则的姓名(First, Last, Middle),空,数字,超出越界(假设每个名字不超过128个字符)。当然,也有可能是内存地址(引用),二进制照片,不可见字符等等。该功能要robust,种种情况都应该要考虑到。

当然,这只是一个输入检查的情况。在程序运行时刻,还有可能遇到内存不够,并发读写等等情况。

- 安全退出了吗?释放内存没?有没有内存泄漏?
安全退出了吗?是的,返回正确退出的信号量了。释放变量了吗?貌似也做了。是吗?接受Ctrl+c吗,结果是什么?

有时候,程序运行几天甚至更久,显示内存不够了,程序自动停止下来。是内存泄漏吗,怎么办?

Java 开发者发现,即便有Java提供的内存回收机制,有很多程序也有内存泄漏,最后导致生产环境应用down掉。

我个人认为:遵循一些编码规范,多测试,多积累经验,不断优化你的code是个不错的建议。

先写到这里, 欢迎有体会或者有兴趣的朋友和我交流哦…

分类: Chao Huang, 程序设计 标签:
  1. shenjianzi
    2009年7月16日18:11 | #1

    我刚从事利用BDB的开发不久。我设计了一个物理文件,里面包含多个Berkeley database。现在想利用一个transaction向多个database中添加记录。但是,我看到的BDB的文档中transaction示例针对的几乎都是针对一个数据库的操作。我做了一些尝试,但是没有完全成功。请问有没有好的解决方法。

  2. Emily Fu
    2009年7月20日16:49 | #2

    @shenjianzi
    你好,欢迎使用BDB产品。
    BDB中的事务是针对同一个环境句柄进行操作,即只要在同一个环境句柄中,事务可以对多个同一个环境中的多个数据库进行操作。
    关于事务的使用,可以参考http://www.oracle.com/technology/documentation/berkeley-db/db/ref/transapp/atomicity.html和DB_ENC->txn_begin的API:http://www.oracle.com/technology/documentation/berkeley-db/db/api_c/txn_begin.html。

  3. sas
    2009年8月20日14:13 | #3

    BDB不支持sql语法,那能不能通过api设置排序,比如升序降序的,能对不同的关键字用不同的排序规则,比如A用升序,B用降序. 类似sql语句的order by浯法的功能.

  4. chaohuang
    2009年8月20日14:35 | #4

    @sas
    所有的这些都可以通过Btree index来实现(缺省是升序) 或者选择Queue/recno的访问方法(Access method)。你所要做的就是在程序里面加些小小的控制,比如: 把return result保存进array/stack,然后正序/逆序输出就行。注意:在BDB里面的index,如果是建在key上的,叫主键索引;建在data的某个字段上的,叫 secondary database。

    另外,你还可以通过cursor来做。比如,你要对某个字段进行倒序输出,首先把cursor定位到last记录,接着调用cursor.hasPrevious() 来判断和输出记录。

    总之,BDB的API提供了最大的灵活性给程序员。

    在即将发布的BDB 4.8版本中,对于C++的开发者,可以使用BDB提供的集合类了 – 类似于STL。简言之,就是把BDB包装成了Map, Set, Vector给开发者使用。有兴趣的朋友可以关注一下David Zhao的博客(他是该功能的作者)。

  5. camel
    2009年12月4日10:20 | #5

    @chaohuang
    这样做很低效的,千万级以上的数据量都存进内存系统会很难承受,并且join方式查询不支持cursor定位到最后一行,也不支持count方法。
    一个应用没有排序几乎是不可能的,bdb的排序支持的不好,所以我们使用bdb也限于key-value方式。

    对于排序,您是否能给我们一些其他建议?
    luoweiming@126.com

  6. chaohuang
    2009年12月8日12:36 | #6

    @camel
    我觉得你对BDB STL的了解还不够。你可能需要再仔细读一下我们的文档,然后有问题发到Berkeley DB的官方论坛:http://forums.oracle.com/forums/category.jspa?categoryID=246。谢谢你的理解和配合。

本文的评论功能被关闭了.
Դ