C++ 一個 class 裡面全部是靜態函數,這種設計目的是什麼?
01-27
在我的項目中看到設計有,一個class,裡面全部是靜態函數,這種設計目的是什麼?
class player_utility{public:
static void leave_dup(pplayer pply);//離開當前副本 static void player_offline(s_uint32 uid);//角色下線}
本來應該用namespace的,只是作者不希望這個namespace可以被using,要強迫你寫XXX::YYY,所以才這麼做。
namespace 才是你需要的。
這種設計大概是從 Java 學來的。封裝啊。要是這些static的函數之間需要共用一些數據又不希望暴露出來就只能塞到這個類的靜態私有成員里了。全局變數多醜啊。namespace能做到訪問控制嗎?我好像沒什麼印象。
可能作者不知道namespace。
這東西還是一個設計模式咧!叫mono state
比如,在極偶爾需要 friend 的時候,顯然 class 可以被 friend 而 namespace 不行。
看示例中,pplayer 應當是個 pointer to class/struct player。在 oop 情形下,leave_dup 有較高可能性需要操作 private 數據,需要被 friend 的可能性很高。@vczh 大大提到的強制寫 XXX::YYY 的事情,我也做過。但是這個問題下,看著不像這個思路。因為下邊這個寫法有比較強的語義反覆。player_utility::player_offline(uid);
我真的覺得作者應該是java寫代碼養成的習慣。
java號稱面向對象,沒有全局變數和全局函數這玩意。為了達到類似的效果,就使用static函數和變數。其實,這樣挺好的。
c++中你要在工作中隨意到處寫全局變數,函數,估計你也就該被踢了。。因為命名衝突問題,在一個幾十萬行代碼的項目裡面,絕對會讓你崩潰的。。c++用namespace來解決這一的問題。但是,對於java程序員來說,直接放到類裡面,這才是王道嘛~~這不是設計, 這只是為了避免麻煩, 免了每個函數名都寫上前綴的麻煩.
一般這麼寫是為了避免全局函數污染全局的命名空間從而引起命名衝突
可能來自使用『所有函數都必須定義在class內」的語言的程序員之手 ←出自effective C++
一般這樣寫,作用同namespace,就是保護整個命名空間不被污染,在ide越來越方便的今天,還有個作用就是你輸入player_utility::,就會自動彈出該域下的可訪問函數建議列表。
工具類?我覺得設計工具類是可以的但看樓主給的那個例子,看方法名,貌似不像是工具類
推薦閱讀:
※默認的逐成員初始化和逐位複製有什麼不同?
※請大神看我對虛函數表和虛基類表的理解對不對?
※C++ 有哪些經常用到的設計模式?
※如何用C實現C++類裡面的成員?
※socket拋出Cant assign requested address,問題所在以及解決方法?