在面向接口、面向对象编程的过程当中,会遇到实际物体类别与定义类别相分离的状况。编程
例如,咱们有三种物体,他们的固有类别分别为: 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 的操做。