重要核心思想
?
包含:OOA分析? OOD設計? OOP 編程
?
?
1.面向對象的架構分析,要分析對象是誰,職責是什么?
?
2.分成不同的類與方法。
?
3.要確定分配的類中包含變化因素,只有變化才分類
?
4.必要時可能一個方法一個類。
?
?
概述
?
面向過程的程序 = 算法 + 數據結構;關心解決問題的步驟。
面向對象的程序 = 對象 + 交互;? ???關心誰在解決問題。
類:一個抽象的概念,即為生活中的”類別”。
對象:類的具體實例,即歸屬于某個類別的”個體”。
同類型的多個對象,行為相同,數據不同。
主要思想
分而治之 --- 將一個大的需求分解為許多類,每個類處理一個獨立的模塊。
???????????拆分好處:獨立模塊便于分工,每個模塊便于復用,可擴展性強。
?
封裝變化 --- 變化的地方獨立封裝,避免影響其他模塊。
?
高 內 聚--- 類中各個方法都在完成一項任務(單一職責的類)。
???????????復雜的實現封裝在內部,對外提供簡單的調用。
?
低 耦 合--- 類與類的關聯性依賴度要低(每個類獨立)。
???????????讓一個模塊的改變,盡少影響其他模塊。
?
[例如:硬件高度集成化,又要可插拔]
最高的內聚莫過于類中僅包含1個方法,將會導致高內聚高耦合。
最低的耦合莫過于類中包含所有方法,將會導致低耦合低內聚。
優勢
復用,靈活,簡單。
面向對象的三大特性
封裝:
數據角度講,將一些基本數據類型復合成一個自定義類型。
方法角度講,向類外提供功能,隱藏實現的細節。
設計角度講,分而治之,高內聚低耦合,封裝變化。
繼承:
???????? 統一概念。
重用現有類的功能,在此基礎上進行擴展。
多態:
???????? 父類的同一種動作或者行為,在不同的子類上有不同的實現。
0
??????? (父類調用同一方法,在不同的子類上有不同的執行效果)
???????? 實現手段:虛方法、抽象方法、接口方法。
類的四大關系
泛化:子類與父類的關系,概念的復用,耦合度最高;
B類泛化A類,意味B類是A類的一種;
做法:B類繼承A類
?
實現:抽象行為的具體實現,兩者體現功能的關系,變化只影響行為;
?????A類實現B類,意味A類必須具體實現B類中所有抽象成員。
做法:實現抽象類、接口中的抽象成員。
?
關聯(聚合/組合):部分與整體的關系,功能的復用,變化影響一個類;
?????A與B關聯,意味著B是A的一部分;
做法:在A類中包含B類型成員。
?
依賴:合作關系,一種相對松散的協作,變化影響一個方法;
?????A類依賴B類,意味A類的某些功能靠B類實現;
?????做法:B類型作為A類中方法的參數,并不是A的成員。
設計的八大原則
開-閉原則(目標、總的指導思想)
Open Closed Principle
對擴展開放,對修改關閉。
增加新功能,不改變原有代碼。
類的單一職責(一個類的定義)
Single Responsibility Principle??
一個類有且只有一個改變它的原因。
適用于基礎類,不適用基于基礎類構建復雜的聚合類。
依賴倒置(依賴抽象)
Dependency Inversion Principle
客戶端代碼(調用的類)盡量依賴(使用)抽象的組件。
抽象的是穩定的。實現是多變的。
組合復用原則(復用的最佳實踐)
CompositeReuse Principle
如果僅僅為了代碼復用優先選擇組合復用,而非繼承復用。
組合的耦合性相對繼承低。
里氏替換(繼承后的重寫,指導繼承的設計)
盡量選擇擴展重寫
Liskov Substitution Principle
父類出現的地方可以被子類替換,在替換后依然保持原功能。
子類要擁有父類的所有功能。
子類在重寫父類方法時,盡量選擇擴展重寫,防止改變了功能。
接口隔離(功能拆分)????
Interface Segregation Principle
盡量定義小而精的接口interface,少定義大而全的接口。本質與單一職責相同。
小接口之間功能隔離,實現類需要多個功能時可以選擇多實現.或接口之間做繼承。
面向接口編程而非面向實現(切換、并行開發)
客戶端通過一系列抽象操作實例,而無需關注具體類型。
便于靈活切換一系列功能。
實現軟件的并行開發。
迪米特法則(類與類交互的原則)
Law of Demeter
不要和陌生人說話。
類與類交互時,在滿足功能要求的基礎上,傳遞的數據量越少越好。因為這樣可能降低耦合度。
?
?
?
?
?
?
技巧
?
?
移動的三個實現
?
?
Character Controller
?
//主要用于主角運動相關
?
?
?
Rigibody
?
?
?
Transform
?
//世界坐標右方移動
transform.Translate(Vector3.right * Time.deltaTime, Space.World);
?
//攝像機右方移動
transform.Translate(Vector3.right * Time.deltaTime, Camera.main.transform);
?
?
?
把string或“”的類似的東西放在一個類中
?
為了方便管理角色動畫名稱
Serializable為了讓當前類在其他類使用時在unity面板中顯示
?
?
腳本生命周期實用
目的
為了在角色死亡時禁用當前腳本來實現用戶無法操作,
并在角色重生之后重新開啟腳本來繼續正常用戶操作。
?
操作
獲取組件卸載Awake中
要把腳本的事件注冊在Onenable中
要把腳本的事件注銷在Ondisable中
?
實例
?
?
加載命名空間namespace
?
寫入命名空間的目的:為了不與他人寫的變量重名,則把某個模塊寫入自定義命名空間中。
?
namespace ARPGDemo.Character
{
?
}
?
?
?
?
?
?
?
?
總結
- 上一篇: Unity3D图形性能优化
- 下一篇: Iterator迭代器原理