2011-05-17 95 views
6

我有一個類有一些自己有用的函數,它們是靜態的。現在,這些函數依賴於其他自己無用的函數(但不會與類成員變量交互),但也是靜態的,因此它們是私有的。現在我有一個包含許多非靜態函數的類,以及一些靜態公共函數和一些靜態私有函數。靜態函數導致更多的靜態函數

這是一個很好的做法嗎? (我應該使這個社區維基?)

+0

目前尚不清楚「有用/無用」是什麼意思 - 你能否詳細說明一下? – davka 2011-05-17 14:19:31

+0

靜態函數正在執行一些重載格式化,所以我已經打破了它。用戶/客戶端將調用重型函數,而函數依賴於對客戶端根本無用的較小函數,因此這些函數是私有的(我假設聲明一個函數是私有的是爲了給客戶強烈的暗示,這個函數不打算被除了類/對象本身以外的任何人使用)。 – Samaursa 2011-05-17 14:24:01

+0

我知道爲什麼功能是私人或公共:),這是「自己」,讓我困惑。實際上,我試圖弄清楚這些函數是屬於這個類還是可以像@mkaes所說的那樣是免費函數。如果他們不使用靜態成員,他們屬於這個類的唯一原因就是範圍界定 - 這意味着他們在概念上是類的服務的一部分。好,如是工廠方法,例如'文件:: createDoc(文檔::的DocType)' – davka 2011-05-17 15:00:04

回答

10

我認爲你應該聲明這些功能爲自由功能。如果他們不需要成員,那應該不是什麼大問題。
也許你應該讀這個article。我發現改進我的課程設計非常有用。

+0

呀,我唯一一次真正覺得有用在類中使用靜態函數是獲取有關類本身,單創建,或某種工廠類的可訪問信息私人成員/它創建的另一個班級的職能。即使如此,工廠應該是一個實例,因此它可以保存指針或關於其創建對象的信息。 – 2011-05-17 14:19:56

+0

感謝您的鏈接。我會盡快閱讀那篇文章。我確實有一個問題。考慮到我有一些功能對用戶來說根本沒有用(因此也是私有的),我如何向用戶提供免費功能? – Samaursa 2011-05-17 14:20:37

+0

@Samaursa:把它們在'detail'命名空間,如果你需要他們在多個'.cpp'或只是把它們在'.cpp'在使用它們的(未命名的命名空間) 。 – Xeo 2011-05-17 14:25:30

4

聽起來不錯,而且會很好用。有些事情需要考慮。

可能使私有靜態函數更加私密。如果你只是將它們作爲自由函數放在.cpp文件中(不是在類中,但最好在'未命名的命名空間'中),那麼它們不會在.h文件中出現。這將是有利的,因爲使用你的類的另一個.cpp文件不會看到這些私有靜態變量。這會使編譯時間更快。另外,它可以讓你自由地修改.cpp文件中的函數,如果你做了任何修改,使用.h文件的其他文件不需要在每次修改時重新編譯,因爲你不必更改.h文件來改變這些功能。其次,有時靜態函數會導致單元測試的編寫變得更加棘手。如果你有一個使用這些靜態函數的類X,如果你想測試類X,就很難將X從靜態函數中分離出來。相反,如果你使用了非靜態方法並且定義了一個你正在編寫的類的接口類派生自,你可以更容易地使用'控制反轉'和'依賴注入'技術爲你的類編寫單元測試。我不會在這裏解釋這些技術,因爲已經有很多關於互聯網的好的描述。

+0

+1關於在.cpp文件中使用未命名的名稱空間和關於單元測試的好處。 – Joseph 2011-05-17 14:38:14

0

保持簡單。與類無關的功能可以封裝在內部的class或新的namepsace中。例如

struct A 
{ 
    struct Util // can also be put outside in a namespace for others to use 
    { 
    static void Independent() { } 
    }; 
    static void dependent(); 
}; 
+0

「保持簡單」,然後是過於複雜的解決方案。 – 2011-05-17 14:40:35

+0

@Tomalak,LOL ..無論如何,這是爲了更好的代碼組織。 – iammilind 2011-05-17 14:45:15

0

我會看着「許多非靜態函數」,以及可能是你可以在類分成通過繼承或理想地多個獨立和相關的一些較小的實體可以通過提請初步形成組成。一般而言,「許多」這個詞並不是好設計的標誌。