0

我在这里寻求一点清晰。对于我的一个项目,我编写了一个容器,其中包含一堆不同的几何形状。我的界面是这样的:

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

等等等等。我喜欢这个界面,因为它会进行编译时检查以确保您拥有所需的数据。但是,在与我的团队讨论时,有人提出了这个接口:

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

它的论点是它通过只有一个函数而不是多个函数来提供更简洁的代码。虽然我当然更喜欢第一种方法,但我没有反对第二种方法的任何论据。有没有人遇到过这种选择?一种选择是否比另一种更好(或至少在传统上是首选)?

注意:在有人提议之前:

Container::Add( Shape )

我想让您知道,这不是解决我的具体问题的好方法。我保证。

4

3 回答 3

1

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

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

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

于 2013-06-12T20:28:39.707 回答
1

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

一个函数对简化代码没有任何作用,因为向量会引起混淆:当您可以通过向量的大小确定形状时,为什么还要使用枚举?如果你想要一个有 4 个点的三角形,那么软件会做什么呢?显然这并不干净。此外,在调用函数时实例化向量会比简单地单独实例化点要复杂得多。

于 2013-06-12T20:30:27.837 回答
0

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

于 2013-06-12T20:48:23.817 回答