【发布时间】:2020-02-20 19:49:34
【问题描述】:
所以我们假设有一个与图像处理相关的项目。我们有一个算法可以计算两个图像之间的“分数”(不管它是什么),所以:
double score(Image i1, Image i2)
如果我们有多个帧(图像),我们要为所有帧(图像匹配)计算它:
std::vector<std::pair<std::pair<int, int>, double>> score(std::vector<Image> images); // [1]
(int 对表示图像向量中的图像索引,因为我们将所有匹配到所有)
不幸的是,我们从许多设备中获取图像,其中每个设备都可以有多个流(然后每个流中有多个连续的帧),这使得这个级别变得复杂:
std::vector<std::vector<std::vector<std::pair<std::pair<int, int>, double>>>>
^devices ^streams ^frames ^score ^image indices
您将如何处理必须返回如此复杂类型的函数?
只是将它包装在 typedef 中并正确命名?或者,也许您只会让用户使用更简单的 API 版本,即使用一个向量 [1] 并进一步自行包装?或者这种情况有什么花哨的模式吗?
【问题讨论】:
-
你错过了
[1]中的第二个std::pair吗? -
Typedefs(即
using X = Y;)应该是保持其可读性的第一步。但这只是在设计本身合理的情况下,这很难判断(您不想将每个级别的集合包装在某种类中以提供其他有用的东西吗?)... -
如果是API,我真的看不出
device/stream/frames参数的原因...score()不应该关心它们。而对于score(std::vector<Image> images),我个人会返回一个二维数组(自定义类或vector<vector<double>>) -
是的,谢谢@Evg
标签: c++ types architecture api-design naming