我一直在研究一個使用C++的小型項目(儘管這個問題可能被認爲是與語言無關的),我正在努力編寫我的程序,使其儘可能高效和封裝。我是一個自學成才,缺乏經驗的程序員,但我試圖在使用界面和麪向對象操作時教會自己良好的習慣。當涉及訪問充當另一個類的子系統的對象的方法時,我主要關注典型的「最佳」實踐。面向對象和設計實踐:訪問成員對象的功能?
首先,讓我解釋一下我的意思是:
的ClassGame
實例希望使用的ClassEngine
私人ClassRenderer
子系統呈現出一個2D精靈形象。 ClassGame
只能訪問ClassEngine
的接口,並且ClassRenderer
應該是ClassEngine的子系統(位於抽象層之後)。
我的問題是基於ClassGame對象可以間接使用ClassRenderer的功能,同時仍然保持快速並在抽象層後面的方式。從我的經驗和別人的代碼示例所看到的,似乎有這樣的兩種基本方式:
,我通過了一系列關於面向對象設計的在線講座,學到的第一種方法是讓一個類在內部將任務委託給它的私有成員對象。 [在這個例子中,ClassGame會調用一個屬於ClassEngine的方法,並且ClassEngine會'祕密'通過調用其中一個方法將該請求傳遞給它的ClassRenderer子系統。 ]函數調用的「菊花鏈」。這對我來說很有意義,但似乎可能比其他選項慢。
我在其他人的代碼中看到的另一種方法是使用訪問器方法,該方法返回指向特定子系統位置的引用或指針。 [所以,ClassGame會在ClassEngine中調用一個簡單的方法,該方法將返回一個引用/指針指向構成其ClassRenderer子系統的對象]。這條路線對我來說似乎很方便,但它似乎也消除了讓私人成員充當更大班級的子組件的觀點。當然,這也意味着編寫更少的「無意識」的功能,只是通過一個特定的任務,因爲您可以爲每個獨立的子系統編寫一個getter函數。
考慮OO設計(抽象,封裝,模塊化,可用性,可擴展性,等)的各個重要方面,同時還考慮到的速度和性能,是它更好地使用所述第一或第二類型的方法將任務委託給子組件?
你真的命名你的類'ClassGame'等等嗎?然後,一個簡單的(雖然不相關的)代碼改進就是放棄這些前綴 – carlpett
不,我通常會將我的類命名爲Game,Engine,RenderSystem等。我認爲它在非牆代碼文本。雖然,我的命名約定可能遠沒有好...哈哈。 – MrKatSwordfish
他們從投票櫃檯中拿出了大膽,所以你可以在你的問題中使用它? –