2

可能重复:
命名空间 + 函数与类上的静态方法

哪里是最明智的编写方式,例如,一个看起来像的函数

Point intersection(const Line &L1, const Line &L2);

(假设我已经写了课程PointLine)?

也许我可以让这个问题更准确一点:我正在考虑以下选项:

  1. 写一个全局函数(在line.h中声明,在line.cpp中写)
  2. 编写类的静态方法Line
  3. 使用命名空间。
  4. 改写一个函数Point Line::intersection(const Line & otherLine);

我不喜欢最后一个选项,因为我不希望我的函数是“不对称的”(我的代码中还有其他几个类似的函数示例)。目前它们是全局函数(如选项 1 所示),但我知道这不是“好习惯”。至于静态方法和命名空间,我还不熟悉这些,所以我不确定。

你认为“最好”的设计是什么?

感谢您的见解!

编辑:让您了解我的项目的规模:50 到 100 个班级。

4

2 回答 2

3

如果您的项目足够小,可以使用类似的名称Point并且Line没有将它们包含在命名空间中,那么可以对intersection()函数执行相同的操作。请注意,重载决议意味着您可能不会在函数名称上出现任何名称冲突(但可能在类名上)。

如果您的项目大小不一,那么将类intersection()函数都放在一个相同的命名空间中是值得的。Argument Dependent Lookup 意味着您的类的客户在使用类型对象Line作为参数时将获得交集函数:

void f( MyGeoLib::Line l1, MyGeoLib::Line l2)
{
    MyGeoLib::Point p = intersection( l1, l2); //just works
}
于 2013-07-08T21:30:35.510 回答
3

这真的取决于你想做什么。如果您只是编写一个非常小的程序,那么将其编写为全局函数我真的看不出有什么问题。但是,如果您的程序至少大小适中,我建议您使用静态方法,因为您会将其功能与它处理的类进行分组。

当然,您也可以使用命名空间来做到这一点。但是,我想无论如何你都会有一个 Line 类,因为它似乎很适合面向对象的编程风格。考虑到这一点,我真的没有理由让它成为命名空间而不是 Line 类的静态方法。如果我正在寻找交叉方法,那肯定是我首先要看的地方!

我也看不出最后一个选项有什么问题,但我更喜欢#2。

于 2013-07-08T21:07:55.950 回答