多个成员函数或带枚举的一个函数

时间:2013-06-12 20:21:20

标签: function interface enums

我在这里寻找一点清晰度。对于我的一个项目,我写了一个包含许多不同几何形状的容器。我的界面是这样的:

Container::AddTriangle(Point, Point, Point);
Container::AddSquare(Point, Point, Point, Point);

依此类推。我喜欢这个界面,因为它进行了编译时检查,以确保您拥有所需的数据。但是,在与我的团队讨论时,有人建议使用此界面:

enum SHAPE { Triangle, Square };
Container::AddShape( std::vector<Point>, SHAPE );

它的论点是它只提供一个函数而不是多个函数来提供更清晰的代码。虽然我当然更喜欢第一种方法,但我对第二种方法没有任何争论。以前有人遇到过这个选择吗?另一种选择是否更好(或至少是传统上更受欢迎)?

注意:在有人建议之前:

Container::Add( Shape )

我想告诉您,这不是解决我具体问题的好办法。我保证。

3 个答案:

答案 0 :(得分:1)

我会选择第一个版本。拥有单个函数Add(std::vector<Point>, SHAPE)只会增加许多未定义的情况,例如如果你想在向量中添加一个包含10个元素的三角形,你会怎么做?

像AddTriangle,AddSquare等功能更清晰,更容易看到代码中添加了什么。具有函数AddPolygon(std::vector<Point>)可用于添加通用形状。

即使您将形状存储为std::vector<Point>类中的Container,我仍然会更喜欢第一个版本。您可以在AddTriangle / AddSquare函数中创建向量。

答案 1 :(得分:1)

反对第二个论点的主要论点是它忽略了具有两个不同函数的基本效用:Triangle和Square是两个不同的实体。当有两个单独的函数和两个单独的参数列表时,代码清晰明确。

一个函数对简化代码没有任何作用,因为一个向量会导致混淆:为什么在你可以通过向量的大小确定形状时有一个枚举?如果你想要一个有4个点的三角形怎么办?那么软件会做什么呢?显然这不是更清洁。另外,在调用函数时实例化向量将比单独实例化点更加复杂。

答案 2 :(得分:0)

为什么不两者兼而有之?这里似乎有两个不同的问题:接口和实现。第一个是更好的接口,因为参数是显式的,但如果每个函数几乎相同,它们都应该使用相同的实现。换句话说,AddTriangle除了呼叫AddShape(vector, Triangle)之外什么都不做,而容器的外部用户应该使用AddTriangle但不能直接使用AddShape