关于物体 '固有类别' 与 '实际使用类别' 分离的情况,结构体定义方法

在面向接口、面向对象编程的过程中,会遇到实际物体类别与定义类别相分离的情况。

例如,我们有三种物体,他们的固有类别分别为: TYPEA,TYPEB,TYPEC。在我们实际使用过程中,我们会根据不同的情况将他们分成 2 组: Group1,Group2。

那么,我们在定义结构体和物理类别时,需要注意对 Group 进行定义。定义物体具体属性和结构体如下:

#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。

在实际编程过程中,我们对 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 定义时的类型,就能够实现类型的变更。

通过分组的抽象,与对抽象结果的使用,可以减少后期代码维护时的工作量。

当我们需要检测分析信息时,我们可以通过使用实际的类型,进行检测:

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,修改信息如下:

#define TYPED (0x01UL << 4)
#define TYPEF (0x01UL << 5)
#define TYPEA (TYPED | TYPEF)

通过对 TYPEA 的分离,原有 TYPEA 的逻辑并不需要进行更新,TYPED 和 TYPEF 相关的新逻辑添加就可以了。

这种情况下,原有类型 fooA 相关代码不需要进行更新,而新类型 fooX 可以添加 TYPED 和 TYPEF 的操作。

 

关于物体 '固有类别' 与 '实际使用类别' 分离的情况,结构体定义方法

时间: 2024-08-22 03:17:12

关于物体 '固有类别' 与 '实际使用类别' 分离的情况,结构体定义方法的相关文章

校园商铺-7商品类别模块-5商品类别删除后端开发

1.Dao层 1.1Dao接口 package com.csj2018.o2o.dao; import java.util.List; import org.apache.ibatis.annotations.Param; import com.csj2018.o2o.entity.ProductCategory; public interface ProductCategoryDao { /** * 查询某个店铺下的商品分类 * @param shopId * @return */ List<

一个类有两个类别中,在类别里实现了相同的方法结果?

如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略 •  方法调用的优先级(从高到低) ? 分类(最后参与编译的分类优先),只要有分类就优先调用分类,不考虑与主类的编译顺序. 对于类别的相同方法,谁先编译就先调用哪个分类的方法. ********************编译顺序从下到上************************** bv

iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行

一.Runtime的理解 OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用! 二.类别(category)添加属性_使用前记得导入头文件#import <objc/runtime.h> 通过这三个方法动态的绑定属性 OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy poli

R_Studio(癌症)以等宽类别值、自定义类别值、等频类别值(分为5类)

对"癌症.csv"中的肾细胞癌组织内微血管数进行连续属性的离散化处理 增加"微血管数分类1"属性,取值为等宽类别值(分为5类),增加"微血管数分类2"属性,取值为自定义类别值(0~40,41~60,61~120,121~150,151~200,201~250),增加"微血管数分类3"属性,取值为等频类别值(分为5类) setwd('D:\\data') list.files() #读取数据 dat=read.csv(file=

校园商铺-7商品类别模块-2商品类别列表从后到前

商品类别模块为什么使用shopId,而不是Shop实体类? 因为我们获取productCategory时,并不需要获取除了shopId之外的信息,因此不用Shop实体类. public class ProductCategory { private Long productCategoryId; private Long shopId; private String productCategoryName; private Integer priority; private Date creat

【IOS 开发】Object - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

一. Object-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, int, long, float, char, id, 指针 等数据; -- NSNumber 包装类 : 用于包装 C 语言数据类型; NSNumber 方法 : -- "+ numberWithXxx :" : 将特定类型的值包装成 NSNumber; -- "- initWithX

(转载)虚幻引擎3--9掌握虚幻技术UnrealScript 预处理器

第九章 – UNREALSCRIPT预处理器 9.1概述 9.2 MACRO(宏)的基础知识 指南 9.1 –您的第一个宏 9.3具有参数的宏 指南 9.2 –       MACRO参数 9.4内置宏 DEFINE IF/ELSE/ENDIF 实例:         IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用         IF/ELSE/ENDIF 和 ISDEFINED/NOTDEFINED UNDEFINE LOG/WA

(转载)虚幻引擎3--第九章 – UNREALSCRIPT预处理器

第九章 – UNREALSCRIPT预处理器 9.1概述 9.2 MACRO(宏)的基础知识 指南 9.1 –您的第一个宏 9.3具有参数的宏 指南 9.2 – MACRO参数 9.4内置宏 DEFINE IF/ELSE/ENDIF 实例: IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用 IF/ELSE/ENDIF 和 ISDEFINED/NOTDEFINED UNDEFINE LOG/WARN LOGD ASSERT 示例:验证条件

疯狂iOS上1

一:iOS应用与开发环境 1.1 OC与iOS简介 1.2 搭建iOS开发环境 1.3 第一个OC程序 1.4 熟悉Xcode 左边导航面板从左到右依次是:项目导航.符号导航.搜索导航.问题导航.测试导航.调试导航.断点导航.日志导航,快捷键是command+1/2 右边检查器面板包括:文件检查器.快速帮助检查器.身份检查器.属性检查器.大小检查器.连接检查器,快捷键是command+option+1/2 右下端库面板包括:文件模板库.代码片段库.对象库.媒体库,快捷键是control+opti