我们的知识领域涉及人们赤脚行走在压力记录板上。如果在传感器数据中识别出人脚,我们会进行图像识别,从而产生“脚”类对象。
必须对脚的数据执行一些计算。
现在,哪种API更好:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
要么:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
现在,我可以提出很多优点和缺点,但是我不能真正决定哪个最重要。请注意,这是最终用户应用程序,而不是我们出售的软件库。
有什么建议吗?
第一种方法的一些专家可能是:
- 吻-一切都非常具体。API,但实施也是如此。
- 强类型返回值。
- 从此类继承是万无一失的。什么都不能覆盖,只能添加。
- API是非常封闭的,什么都不会进入,什么都不能被覆盖,所以更少的地方会出错。
一些缺点:
- 随着我们发明的每一项新计算都被添加到列表中,吸气剂的数量将会增加
- API更可能会更改,如果引入了重大更改,我们需要一个新的API版本,即Foot2。
- 如果在其他项目中重复使用该类,我们可能不需要进行所有计算
第二种方法有些专业人士:
- 更灵活
- api更改的可能性较小,(假设我们正确提取了抽象,如果不正确,更改将花费更多)
一些缺点:
- 松散类型。每次通话都需要转换。
- 字符串参数-我对此有不好的感觉(分支字符串值...)
- 当前没有用例/需求要求额外的灵活性,但将来可能会存在。
- API施加了限制:每次计算都需要从基类派生。除非通过一种更动态,更灵活的方式来传递参数,否则将无法通过这种1方法来进行计算,而且传递额外的参数将是不可能的,这将进一步增加复杂性。
如果使用字符串参数来触发特定计算,则很难找到它的所有用法。很难成为100%,您找到了所有这些。
—
Konrad Morawski 2014年
充分利用两个世界的优势,编写带有许多吸气剂的外观
—
2014年
getCalculation()
。
枚举绝对比字符串好!我没有想到这一点。它们限制了API并防止了字符串参数的滥用(例如令牌和其他废话的连接),所以我猜比较是使用枚举而不是字符串的选项1和选项2之间的比较。
—
Bgie 2014年
enum
并打开其值。不过,我认为第二种选择是邪恶的,因为它偏离了KISS。