可能重复:
Namespace + functions versus static methods on a class
最合理的写作方式在哪里,例如,看起来像
的函数 Point intersection(const Line &L1, const Line &L2);
(假设我写过课程Point
和Line
)?
也许我可以更准确地提出问题:我正在考虑以下选项:
Line
Point Line::intersection(const Line & otherLine);
我不是最后一个选项的粉丝,因为我不希望我的函数是“非对称的”(我的代码中还有其他几个函数的例子)。目前它们是全局函数(如选项1中所示),但我理解这不是“良好实践”。至于静态方法和命名空间,我还不熟悉这些,所以我不确定。
您认为“最佳”设计是什么?
感谢您的见解!
编辑:为了让您了解我的项目规模:50到100个课程。
答案 0 :(得分:3)
这实际上取决于你想做什么。如果您只是编写一个非常小的程序,我认为将其编写为全局函数并没有任何问题。但是,如果您的程序至少是中等大小,我建议使用静态方法,因为您将使用它处理的类对其功能进行分组。
当然,你也可以使用命名空间来做到这一点。但是,我想你无论如何都会有一个Line类,因为它似乎很适合面向对象的编程风格。考虑到这一点,我真的没有理由让它成为命名空间而不是类Line的静态方法。如果我正在寻找交叉方法,这肯定是我首先要看的地方!
我也没有看到最后一个选项有什么问题,但我更喜欢#2。
答案 1 :(得分:3)
如果您的项目足够小,可以使用Point
和Line
之类的名称而不将它们包含在命名空间中,那么可以使用intersection()
函数执行相同操作。请注意,重载解析意味着您可能不会在函数名称上有任何名称冲突(但可能在类名称上)。
如果您的项目具有非平凡的大小,那么将和两个类intersection()
函数放在一个相同的命名空间中是值得的。参数依赖查找意味着只要类型为Line
的对象作为参数,类的客户端就会获得交集函数:
void f( MyGeoLib::Line l1, MyGeoLib::Line l2)
{
MyGeoLib::Point p = intersection( l1, l2); //just works
}