在面向接口、面向對象編程的過程當中,會遇到實際物體類別與定義類別相分離的狀況。編程
例如,咱們有三種物體,他們的固有類別分別爲: TYPEA,TYPEB,TYPEC。在咱們實際使用過程當中,咱們會根據不一樣的狀況將他們分紅 2 組: Group1,Group2。ui
那麼,咱們在定義結構體和物理類別時,須要注意對 Group 進行定義。定義物體具體屬性和結構體以下:code
#define TYPEA (0x01UL << 0) #define TYPEB (0x01UL << 1) #define TYPEC (0x01UL << 2) typedef struct foo_t { ... uint64_t group1; uint64_t group2; ... } foo_t
在定義具體類型時,咱們能夠進行具體物體分類的實現:對象
foo_t fooA = { .group1 = TYPEA | TYPEB; .group2 = TYPEC; }; foo_t fooB = { .group1 = TYPEA; .group2 = TYPEB | TYPEC; }; uint64_t thingA = TYPEA; uint64_t thignB = TYPEB;
經過定義,咱們實現了兩種具體的分類方式,fooA 和 fooB,而且實現了具體分組和物品類型的關聯。而且,咱們定義了兩個具體的事物,thingA 和 thingB。blog
在實際編程過程當中,咱們對 thing 的判斷方式以下:接口
uint64_t thingX = ...; if (thingX & fooA.group1) { printf("ThingX insert into A.group1\n"); } else if (thingX & fooA.group2) { printf("ThingX insert into A.group2\n"); }
在具體代碼使用過程當中,咱們沒必要再關心物品的固有類型,以及分組的類型。當須要修改分組類型時,咱們只須要修改 group 定義時的類型,就可以實現類型的變動。開發
經過分組的抽象,與對抽象結果的使用,能夠減小後期代碼維護時的工做量。面向對象編程
當咱們須要檢測分析信息時,咱們能夠經過使用實際的類型,進行檢測:class
if (fooA.group1 & TYPEA) { printf("A.group1 contains TYPEA"); } if (fooA.group1 & TYPEB) { printf("A.group1 contains TYPEB"); } if (fooA.group1 & TYPEC) { printf("A.group1 contains TYPEC"); } if (thingX & TYPEA) { printf("thingX belong to TYPEA"); } else if (thingX & TYPEB) { printf("thingX belong to TYPEB"); } else if (thingX & TYPEC) { printf("thingX belong to TYPEC"); }
在開發後期,可能會出現新的分類方式,對原有類型進行了分離。例如:TYPEA 分離成 TYPED 和 TYPEF,修改信息以下:di
#define TYPED (0x01UL << 4) #define TYPEF (0x01UL << 5) #define TYPEA (TYPED | TYPEF)
經過對 TYPEA 的分離,原有 TYPEA 的邏輯並不須要進行更新,TYPED 和 TYPEF 相關的新邏輯添加就能夠了。
這種狀況下,原有類型 fooA 相關代碼不須要進行更新,而新類型 fooX 能夠添加 TYPED 和 TYPEF 的操做。