今天學習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,也沒有大量的函數要跟着改,降低了維護難度。