結合unity項目開發淺談設計模式的六大原則(二) 原 薦

接着上一篇我們接着往下講:

 

三、依賴倒置原則

定義:針對抽象編程,不要針對實現編程;高層模塊不應該依賴於底層模塊,兩個模塊都應該依賴於抽象(抽象類/接口)。高層和底層不應該直接溝通,高層底層之間,應該有一箇中間層,負責兩方溝通。

比如說一箇中國人和一個外國人(日本人,德國人,俄羅斯人...)溝通:

中國人和外國人不直接溝通,中間需要一個翻譯,中國人和外國人都依賴於翻譯。

Unity 引擎是把“依賴倒置原則”玩的很溜的一款產品。

高層依賴於底層:開發遊戲需要依賴於該平臺的底層API。

因爲編寫這些遊戲時,使用C#開發一個版本,稍作調整就能發佈到N 個平臺。

在我們發佈成不同平臺的遊戲的時候,Unity 本身就做了一個“對接”的任務,把我們的代碼裏面的API,對接到該平臺上相應的API。

高層和底層都依賴於抽象:我們的遊戲是依賴Unity 的,各個平臺的API 也是Unity 完成對接任務的。

 

四、里氏轉換原則

定義:①一個軟件實體如果使用的是一個父類的話,那麼一定適用於其子類。而且它察覺不出父類對象和子類對象的區別。

②在軟件裏面,把父類都替換成它的子類,軟件的行爲沒有變化;通俗點說,子類型必須能夠替換掉它們的父類型。

從生活層面中理解里氏轉換原則,一個公司的品牌就好比是一個父類,小米這個牌子就是一個父類。

小米這個品牌的產品有很多,比如:手機,電視,筆記本電腦,空氣淨化器......

這些產品就好比是繼承了父類以後,實現的子類。

[以下三句僞代碼,就是里氏轉換原則在代碼中最常見的體現]

小米品牌mi = new 小米手機(); ① ②

小米手機m5 = new 小米手機(); ②

小米手機m4 = (小米手機)mi; ③

切入點:

①子類對象可以直接賦值給父類變量;

理解:使用小米手機的用戶就是小米公司的用戶。

②子類對象可以調用父類中的成員,但是父類對象永遠只能調用自己的成員;

理解:小米手機可以打電話,還能能使用小米公司的售後服務;但是小米公司不能打電話,它只能折騰自己的用戶體驗,設計理念,品牌定位,營銷策略......

③如果父類對象中裝的是子類對象,可以將這個父類對象強轉爲子類對象;

理解:小米公司開新產品發佈會-->小米6 手機發佈會。

 

從unity引擎作爲切入點理解:Unity 引擎是一個父類;

Unity4.x,Unity5.x,Unity2017.x 都是這個父類下的子類。本身具備父類的功能,同時又都有自己的新功能。

 

五、迪米特原則(又叫最少知識/知道原則)

定義:①如果兩個類不必彼此直接通信,那麼這兩個類就不應當發生直接的相互作用。

如果其中一個類需要調用另外一個類的某一個方法的話,可以通過第三者轉發這個調用。

②一個對象應當對其他對象有儘可能少的瞭解。

 

例如:普通人,銀行,銀行工作人

在現實生活中,我們普通人不需要了解銀行的各種體系規章制度,當我們普通人和銀行發生業務關係的時候,我們面對的是銀行的工作人員。工作人員完成了普通人與銀行的溝通。

而在編程中,普通人,銀行,銀行工作人員,會表現成三個類。

普通人與銀行這兩個類是完全獨立的,由銀行工作人員這個類,完成二者的溝通。

當普通人或者銀行發生了代碼邏輯改變,只會影響到中間的工作人員。

但是如果普通人和銀行直接溝通,這樣耦合度就提高了,降低了普通人以及銀行這兩個類的複用性[普通人可能還需要和其他幾十個類似於銀行的機構溝通]。

 

1.編程中的切入點

①在類的結構設計上,每一個類都應當儘量降低成員的訪問權限。

Unity 項目開發,不要使用public 公開字段,然後面板拖拽資源賦值這種方式。應該把字段全部private 修飾,然後public 屬性公開調用。

②迪米特原則主要是強調了類與類之間的鬆耦合。

類與類之間的耦合度越低,越有利於代碼的複用,一個處於低耦合的類被修改了,不會對有關係的類造成影響。

2.Unity 迪米特原則

 

在Untiy4.x 時代:

我們創建一個腳本,掛載到遊戲物體身上,該腳本內就有一堆屬性可以使用。

transform,rigidoby,light,audio,collider.......

通過這些屬性,就可以直接調用當前遊戲物體身上的對應的其他組件。

但是“它知道的太多了”,不管我們這個遊戲物體身上有沒有這些組件,這些屬性都是存在的,不符合“最少知道原則”。

在Untiy5.x 時代:

這些屬性98%都廢棄掉了,只留了一個transform 屬性,用於訪問當前遊戲物體身上的Transform 組件。訪問其他的組件,必須先獲取,再訪問。

 

六、接口隔離原則(這裏默認了解面向對象的繼承,以及接口等相關語法格式)

定義:①客戶端不應該依賴它不需要的接口;

②一個類對另一個類的依賴應該建立在最小的接口上。

 

公司內有很多部門,比如:開發部,業務部,財務部等等,每個部門內都有N個員工在工作。現在我把員工要做的事情,定義成一個接口,所有員工都實現這個接口去做事情。

這個接口中定義的事情有:

工資計算,賬務管理,客戶擴展,客戶維護,產品推銷,程序開發,軟件維護。

所有的員工都實現這個接口,去做事情。現在問題就出現了,不管是哪個部門的員工,在實現了這個接口後,都有很多事情是不需要自己去做的。

當前這個接口就比較臃腫,我們需要對接口進行“功能隔離”:

財務部員工接口:

工資計算,賬務管理;

業務部員工接口:

客戶擴展,客戶維護,產品推銷;

開發部員工接口:

程序開發,軟件維護;

這樣對接口功能隔離,細分成不同部門的職責功能接口,不管是現有的員工,還是以後新加入的員工,只需要實現自己部門對應的接口即可。

 

1.切入點

接口要儘量小。

在定義接口的時候,接口內的方法要儘量的少,避免接口過於臃腫。

一個類由於功能上的需求,需要實現一個接口,要保證該接口內所有的方法,都是該類所需要的。

 

2.Unity 接口隔離原則

比如UGUI 中,就有很多接口可以用於對UI 遊戲物體進行功能擴展。

UGUI 中的UI 事件,我們在編寫UI 控制腳本時,在繼承了Mono 行爲類之後,還可以實現N 個UI 事件接口[Interface]。這裏涉及到的事件接口,它們的定義就是準守了接口隔離原則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章