單例和靜態類
目前來看靜態建構函式就是比較好的辦法了,單例和基類的操作目前有點用不太到,畢竟也沒什麼共享的變動資料,基類的話,只有一個服務,強行去寫反而有點過度設計。綜合來看,下週的最佳化方向就是靜態建構函式的方式。不過寫基類以後有機會可以試試看,往裡面放那些會複用的方法或者屬性,讓多次使用的時候子類直接繼承就可以免去重寫。但前提是真的有複用,不然就是過度設計了。
單例和靜態類最大的區別就是,前者仍然是一個類,封裝、繼承、多型的特性都在;但後者就真是純粹的方法了,只是上面套了個class的皮。靜態本身就意味著從定義開始就不可變動,其內容必須是固定的,那就別說什麼繼承和更改這種。
關於封裝這裡,看上去包在類裡像是有封裝,但本質上裡面的靜態變數是整個程式的全局變數。而類就不一樣了,類的例項單獨處理自身作用域內的變數,而每次new出來的都是初始化內容。當然單例就比較特殊,這算是恰巧差不多了,但拿來處理當下的情況正合適。
靜態最大的問題就是有靜態依賴:如果一個地方用了靜態,那就相當於構建了一個隱藏的全局依賴——只要一改,牽一髮動全身。這就是為啥靜態的最佳使用場景是字面意義上的「靜態」時刻,比如單個使用的工具方法,或者是真的需要全局維持一致的靜態變數。一旦動態物件依賴了靜態物件,那這就會成為一個瓶頸,也會成為耦合的來源。比如十個動態物件都依賴於這個靜態時,靜態一動就全完——如果有個變數是可變的狀態,那就不要用靜態。除
非是隻讀的,或者說是希望不例項化就直接呼叫的工具方法(而且也得無狀態,否則如果這個函式也以來一個可變靜態,那就還是帶上了靜態依賴)。濫用靜態的問題會很嚴重,使用之前一定要考慮副作用。比如DI,在沒必要用靜態的地方就可以不用,否則把靜態變數當DI的做法完全是壞味道。DI本來就是為了去耦合,結果又上個注入的靜態物件給耦合上了,這是搞毛線。