2010-01-18 76 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的設計,它們可能是缺少抽象的地方。

相關問題