用于检查属性值的合适的C API

用于检查属性值的合适的C API,c,api,C,Api,在C中,有两种明显的方式可以提供对内部属性值的外部访问A提供一个通用接口,该接口接受随着时间的推移而变化的属性列表(一些添加/一些死亡),B为每个属性提供一个特定的接口 示例A: int x_get_attribute_value(ATT att) { if (a) return a_val; if (b) return b_val; } 例B: A_Enum x_get_a_type_attribute() {} B_Enum x_get_b_type_attribute()

在C中,有两种明显的方式可以提供对内部属性值的外部访问A提供一个通用接口,该接口接受随着时间的推移而变化的属性列表(一些添加/一些死亡),B为每个属性提供一个特定的接口

示例A:

int x_get_attribute_value(ATT att)
{
    if (a) return a_val;
    if (b) return b_val;
}
例B:

A_Enum x_get_a_type_attribute() {}
B_Enum x_get_b_type_attribute() {}
我记得Eclipse的API非常像一个我可能错了的API。我不能做的是提出一个令人信服的论点来反对这两种观点

A是干净的-任何用户都无法找到属性值。它可以干净地发展,而不会留下死气沉沉的接口

B有一定程度的类型检查-这是C枚举


是否存在一个大的打击者论点,将平衡推离观点?

B引入新属性的开销要大得多。在软件的稳定分支中引入一个新属性将承担许多风险,因为必须从本质上改变接口

根据我个人的经验,一般来说,我可以担保A

很大程度上还取决于软件集成的紧密程度。借用Booch的术语,选项A促进软件组件之间的弱耦合,而选项B促进软件组件之间的强耦合

如果您希望能够冻结接口,使其在很长一段时间内保持稳定,禁止任何更改,那么B将允许您这样做:添加新属性是高度可见的。如果您希望能够在任何时候添加新属性,并且希望拥有大量属性,那么选项a显然是您的最爱

你也可以考虑两者的健康组合。为重要属性提供专用的获取/设置功能。对于其他不太重要的选项,请使用通用的get/set函数。如果某个属性变得重要,则可以为其引入专用的get/set


注:显然,人们不应该忘记性能:选项B将在任何微基准中赢得A。

A是您的最佳选择,因为您可以更轻松地改变其背后的机制。你可以有一个ifs的阶梯,一个可接受属性的数组来循环,或者一个哈希表,没有人会更聪明。

如果你想支持各种类型的选项——整数、字符串等,那么a是非启动程序,因为C函数只能返回一种类型的值。 当然,您可以让函数返回一个void*并对结果进行类型转换,但这只是自找麻烦

简言之,如果您想要/需要支持多种类型的选项,解决方案B是一个不错的选择