關於物體 '固有類別' 與 '實際使用類別' 分離的狀況,結構體定義方法

在面向接口、面向對象編程的過程當中,會遇到實際物體類別與定義類別相分離的狀況。編程

例如,咱們有三種物體,他們的固有類別分別爲: 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 的操做。

相關文章
相關標籤/搜索