軟體架構,C語言,維持Header file彼此獨立
緣起
我提供某個服務service.h給大家用,今天要講裡面SERVICE_SZ_A參數的故事
// service.h
#define SERVICE_SZ_A (10)
struct {
u32 user_a_data[SERVICE_SZ_A]
}
來自USER_A的抱怨
SERVICE_SZ_A其實是USER_A維護的,在另外一個地方也定義了
// user_a_intf.h
#define USERA_SZ (10)
兩個參數放在兩個檔案,不一致會出錯,現在我們有維護問題了
- service.h
- user_a_intf.h
來自USER_A的建議
簡單粗暴,希望這個參數,統一由USER_A提供,不要再自己定義了
// service.h
#include "user_a_intf.h" // avoid the interface duplication
struct {
u32 user_a_data[SERVICE_SZ_A]
}
我不打算接受這個建議
- service.h想維持獨立(不依賴別人)
- 其他吃service.h的人,未必需要user_a_intf.h(介面的污染)
- 如果user_a_intf.h如果也吃service.h,會產生circular inclusion,有潛在的問題
最後的解法
最後我們找到完美的解法,既可以維持介面獨立,又可以解決維護問題,兩個人都滿意
- 服務端service.h維持獨立,最終的長相就是那樣
- 在USER_A多放user_a_err_chk.c做檢查,工作量不多
// user_a_err_chk.c
#include "service.h"
#include "user_a_intf.h"
#if SERVICE_SZ_A != USER_A_SZ
#error
#endif
在需要保持介面獨立的地方,做個副本(duplication),然後再找地方檢查,大家就開心了
這題我遇過很多次,腦袋得稍微轉彎,我預期以後還要再用。寫下來,下次可以直接用
問AI的意見
這題應該有前人解過(Internet找得到),問問AI的看法,看起來是沒問題的
留言