上周初参加了一次代码评审,评审时发现一位同事在自己负责的子模块代码里定义了一个私用宏,"重复"这个Bad Smell立马在我头脑中闪现。当时我给出了一个建议:检查一下这个宏定义的必要性,依次检查一下C运行库头文件中是否已经有了同功用宏定义,基础库头文件中是否已经有了同功用宏定义,业务层代码的共用头文件中是否已经有了同功用宏定义。

周末这位同事给出了答复:C运行库、基础库和业务层代码中都没有定义此功用的宏。考虑一下这位同事如此编码的动机:显然一方面他为了避免magic number才去定义一些宏,提高可读性。另一方面确实无此功用的宏可用才考虑定义在自己的子模块中。但是这个宏的定义到底该放在哪里才是正确的呢?

这个宏是作为一个buffer的size而定义的,这个buffer会作为基础库中某个函数的输出参数,而这个函数原型声明所在的头文件中却没有提供相关宏为上层开发者所使用,这才导致了调用者自己猜测并设置buffer size。不讲究的开发者很可能就直接使用一个magic number,而像我这位同事采用的这种方法又会导致一些"重复"的Bad Smell的出现。这样来看,也许正是这个库函数的设计者为Bad Smell提供了滋生的土壤。

库设计者应该多为上层调用者考虑,这方面可参考一些优秀库的设计,如C标准库等。因为你的接口设计而给调用者带去Bad Smell,这是我们不希望看到的。

© 2010, bigwhite. 版权所有.

Related posts:

  1. 走马观花ANSI C标准-类型表示
  2. 由bool类型引发的一个问题
  3. 一次函数设计讨论
  4. 一个制作朴素幻灯片的TeX模板
  5. 一个基于XeTeX和xeCJK的TeX模板