2010-01-18 61 views
6

说我想要一些函数来处理一些文件,并且我正在考虑2个选项。我应该使用一类函数还是函数的名称空间?

1)创建像SavedDataHandler一类,用户可以使用这样的....

// Note that SavedDataHandler has no members. It just has functions that operate on a 
// resource (the file) 
SavedDataHandler gameSave; 
gameSave.SaveData(arg1, arg2); // to save data 
gameSave.DeleteSave(); // Delete the save 
... 

2)创建的功能

namespace SavedDataHandler { 
    SaveData(...) { ... } 
    DeleteSave(...) { ... } 
    ... 
} 

,用户会打电话像

命名空间
SavedDataHandler::SaveData(arg1, arg 2); 
SavedDataHandler::DeleteSave(); 

什么是首选?

P.S.当我考虑斯科特迈尔的建议时,我想到了这个问题,即将非会员非朋友功能选为会员功能。我已经遇到了一些决定,我有一个函数(通常是一些私人成员函数来帮助这个类做东西),因为它不能在类私有化中操作,所以很容易就可以变成非成员。

但是,该功能仅用于该类。当然,这个程序可能会演变到另一个类可能需要它的地步,但是我发现很难为这些非成员函数找到一个地方。当你有很多具有通用目的的功能时,很容易,但是我发现单个非成员功能很难组织到一个特定的地方,并且发现将它作为一个成员保持干净。有关这个问题的任何提示?

回答

4

我倾向于下面的简化模式:

  • 如果只用一个等级,并有可能保持这种方式,把它的实现文件在一个匿名的命名空间。
  • 如果它适用于多于一个类,并且不需要访问类的内部状态,请将其放入命名空间中。
  • 如果需要访问类内部状态,当然要使它成为一个成员函数。

但意见不同,最终可能是您的雇主的指导方针是最终的指导方针。

编辑:

...当然它不是简单,但正如你所说斯科特迈尔斯already covered细节。

关于组织问题:
如果你把辅助函数在匿名的命名空间,他们已经大多是从类分离 - 如果你后来决定重新使用它们,它不应该太硬,拉他们一把在一个通用的命名空间中。
在这一点上,您还应该对适合的组织有更好的看法,有时这可能很难提前。

+0

或多或少采用相同的启发式方法:) – 2010-01-18 03:33:53

+0

感谢您对ddj上的Scott Meyers文章的链接! – Pete 2010-08-20 19:45:37

0

直接使用包含游戏数据的类的保存方法,传递表示数据保存到的媒体的辅助对象,并让删除方法位于媒体类本身上是有意义的。

+0

这就是Scott Meyer所反对的。请参阅http://www.ddj.com/cpp/184401197 – 2010-01-18 03:46:17

1

我的主观答案是:在包含静态方法的类上使用命名空间。

我的理由是,只需查看声明,就可以知道此代码块的用途。

如果它是一个类,那么没有什么能够阻止它拥有实例方法。如果它是一个命名空间,那么你知道所有的功能都是独立的。

在学习C#时,这些概念与我一起。在C#中,你不能拥有独立的功能。但是,你可以有静态类

internal static class SavedDataHandler 
{ 
    // Because this is a static class, the compiler will not let you create an instance method 

    internal static void ThisIsAStaticFunction() // This is fine 
    { 
    } 

    internal void ThisIsAnInstanceFunction() // Compiler error! 
    { 
    } 
} 

由于C++没有静态类的概念,命名空间将是要走的路。

0

如果我必须自己回答这个问题,那么它会是:没关系。人们可以说,在这种情况下,函数的名称空间和具有静态函数的类之间的区别仅仅是句法。

但是,它看起来像你试图建模一个“SavedGame”对象。这些函数应该具有不同状态的处理程序吗?

0

看起来这个问题来自程序其他部分的一些不健康的设计。我会看看你传递给处理程序的这些arg1和arg2的设计,它们可能是缺少抽象的地方。

相关问题