今天学习librdkafka的conf配置相关的代码,学到了一个C语言代码编写的技巧。作者真的是把C语言用得出神入化。
我们平时编写C语言代码,经常会用struct类型来模拟面向对象中的class。比如我实现了下面的Student结构体
可以看到零零碎碎有十多个字段。如果我们想再把这个struct模拟class模拟得像一点,那么get和set方法是没有办法避免的。要么对每个字段都实现一个get和一个set,要么写个函数,在函数内部写一大堆if..else。
如果字段比较少,就像我上面的这个Struct一样,这种方式还可以接受。但是想想kafka数十上百个配置,这么干无疑会使得代码量膨胀,而且日后增加字段也不方便,一定会有很多相关函数要去跟着更改,增加维护成本。所以librdkakfa的作者使用了另外一种思路。看完下面的代码就会明白到底是怎么做的,没有一个get和set方法或者大量的if else,仅仅是提供了2个宏就把这个问题解决掉了。
运行结果:
假如Student_t中的每个字段是kafka中的一个配置项。kafka_conf的每个配置项都是一个property结构体,然后这些property结构体构成conf结构体。每个property结构体中保存了该property在conf结构体中的offset。这样就可以很方便地进行struct的get和set,而不用写大量的代码。而且如果日后增加property,也没有大量的函数要跟着改,降低了维护难度。