遊戲系統開發繼承帶來的問題
需求例子
原本適用於A模式的觀戰系統,現在需要支援B模式。經過討論之後,主要有以下a、b、c三處不同。
程式碼中如何組織觀戰系統在不同模式的多型行為
繼承
# 建立一個新的子類,繼承原先的observe_player系統
# observe_player.py
class System(timer.TimerObject):
"""組隊模式的觀戰系統與原先的觀戰系統在這三個函式上有區別
"""
def _RequestJoinObserve(self, player_obj, observed_obj=None, is_tips=False, is_dead=False):
......
def _SwitchObserve(self, observe_guid, origin_observed_guid, new_target=None, is_change=False):
......
def OnRequestSwitchObserve(self, player_obj):
......
# observe_player_team_mode.py
from game.systems import observe_player
class System(observe_player.System):
"""組隊模式的觀戰系統與原先的觀戰系統在這三個函式上有區別
"""
def _RequestJoinObserve(self, player_obj, observed_obj=None, is_tips=False, is_dead=False):
......
def _SwitchObserve(self, observe_guid, origin_observed_guid, new_target=None, is_change=False):
......
def OnRequestSwitchObserve(self, player_obj):
......
動機
- 多個子類互不影響,避免想要修改某種模式的觀戰行為時,不小心影響到其他模式。
引起的問題
- 觀戰系統交由多名程式開發,其他程式並不知道有子類的存在,常常引起報錯。
- 可以抽離出base類,以提醒其他開發者,但這種提醒並不能完全解決上述問題,其他程式在迭代的時候,仍然容易忽視基類的修改對子類的影響,而且哪怕意識到了,也要小心地考慮對多個子類造成的影響。
- 這就需要base類的內容儘可能的少,其概念儘可能的通用。
在變化處用變數控制
在a、b、c三處行為處用變數開關控制,符合條件的模式將使用新的行為。
若不同模式的觀戰行為有更多的組合,則需要抽離出觀戰方案配置選項:在a、b、c三處行為處用變數開關控制,並抽象出觀戰方案對其進行填表控制。
選擇這種看上去更簡單的方式,有以下幾個理由:
- 不同模式不同行為都放在一處,不容易遺漏。
- 本質上來說,僅僅是三處不同,用變數開關簡單地控制已經滿足需求。
- 變數開關方便開放給產品配置,而繼承需要使用工廠函式去建立不同子類,僅僅由程式控制。
- 繼承從來不是一開始就要做的工作,而是在發現有必要的時候,才開始。
相關文章
- 繼承問題繼承
- delegate 繼承問題繼承
- 模板類的繼承問題繼承
- JAVA繼承的初始化問題Java繼承
- Java建構函式的繼承問題Java函式繼承
- 學習Java中遇到的繼承問題Java繼承
- 建構函式的繼承問題 (轉)函式繼承
- [提問交流]前臺模板繼承問題繼承
- 18、繼承以及繼承中成員變數和成員方法的重名問題繼承變數
- 【c++基礎】菱形繼承問題C++繼承
- dubbo繼承springboot出現的問題繼承Spring Boot
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 面試官問:JS的繼承面試JS繼承
- Python-單繼承中值傳遞的問題Python繼承
- 大腦無特權:警惕免疫系統帶來的精神健康問題
- 請教一個已有系統資料移置帶來的中文問題
- Request繼承體系繼承
- 直播系統開發遇到的三大問題
- 卷組中的VGDA屬性帶來的系統可靠性問題
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- 一文打盡Java繼承的相關問題Java繼承
- 關於物件繼承的問題——利用空物件做中介物件繼承
- 面試必問之繼承面試繼承
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- JS專題之繼承JS繼承
- odoo 開發入門教程系列-繼承(Inheritance)Odoo繼承
- 基於OT開發系統的專利問題
- C++繼承體系C++繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- 使用ElementUI開發系統(介紹與開發中遇到的問題)UI
- clone 淺克隆帶來的問題
- 類的繼承_子類繼承父類繼承
- 多繼承 與 多重繼承繼承
- 關於C#中建構函式的繼承的問題C#函式繼承
- this&原型鏈&繼承 · 問答原型繼承