物件導向觀點一
- 最高觀點:
- –以客戶的需求為出發點, 從需求衍生系統介面.
- 中階觀點:
- –以高階物件產生需求並衍生介面.
- 低階觀點:
- –以程式碼來看, 提高關注點.
物件導向觀點二
- 從程式碼來看:
- –寫好類別方法內的事情.
- 從架構來看:
- –以會影響類別的型與關聯.
- 從需求來看:
- –會影響整個系統架構與功能模組間的關聯.
抽象
- 抽象並非單純簡化, 而是外界對事物的認知:
- –對事物的認知會反映出類別的特色與職責.
- 抽象省略了細節, 專注再需求的描述上:
- –學習用抽象的角度來看待事物之間的互動.
- 過度抽象會導致外界無法理解甚至錯誤:
- –不要將事物的特徵完全抽離, 特色應被保留.
- 重需求出發, 先關注需求要什麼, 再談如何達成:
- 思考由需求衍生出的物件如何互動, 決定架構.
- 從用戶端(呼叫端, 需求, …, client/server )的角度去設計.
- 讓底層的元件去組合出符合需求的程式碼.
架構分層
- 一般而言系統程式架構分為:
- –介面層
- –控制層
- –業務邏輯層
- –資料存取層
- 衍生出服務層(創造接口, 實作類):
- –業務邏輯服務層
- –應用程式服務層
- –第三方工具服務層
創造這些接口的目的是為了降低與實作的相依外, 替換實做時也較為容易.
封裝是什麼?
- 簡單的說就是將很多DATA與函數裝在一起.
- 以程式的角度簡單看一下就是 Class 裝載著屬性、欄位、方法這些成員都是資料與函數的一部分.
- 將無需讓外部知悉的細節隱藏,只露出操作介面(欲公開的資訊與操作方法)。
繼承是什麼?
繼承(一般思維):
- 簡單說就是父子關係,一般情況下若父親許可,兒子就可以不費吹灰之力取得父親所擁有的.
- 繼承通常是為了擴充與修改配置為出發點. (這觀點較為正確)
繼承(較佳思維):
自身對抽象(需求)的特例化,也就是對『行為的特例化』:
EX : 車(抽象),賽車(繼承抽象),卡車(繼承抽象)
賽車與卡車都是車但是並不會把兩者劃上等號,繼承的重點是在於『行為』的『一致性』與相對應的『職責(特色、實作)』。
多型
總的來說多型是針對特定行為的表現, 以人來說都會走路, 但會因為不同人而有不同的走路姿勢,速度….也就是說同一種行為會因不同人而有不同的表現.
以程式來看, 多型來自於繼承, 是繼承的進階用法. 以商品主檔與供應商主檔(繼承抽象)來看, 都有新刪修查的相同行為, 但實際的行為不同(如資料表, 資料結構, 細節…等都不同.)
介面&抽象類別
屬於抽象的觀念, 是針對需求來設計方法成員與欄位成員的結構(簽章), 是比較抽象的概念, 其目的為了滿足需求與規範子類別抑或職責規範, 最終目的就是讓外界知悉這個介面是什麼(特色)?如何溝通與使用.
–大多使用抽象時出發點多為 多型, 組合, 創造接口 為考量.
–另一個角度看, OO主要有兩種技術:繼承(Inheritance)和組合(Composition), abstract class 用在使用繼承技術時, interface 則用在使用組合技術時.
DIP&IOC/DI
DIP: 高階模組與低階模組並不直接依賴, 而是依賴於介面或抽象. 主要目的為降低類別間的耦合.
IOC/DI: 高階模組需要低階模組時, 不自己產生實例, 而是透過呼叫端或者IoC容器給予. 主要目的為更靈活的操作高階模組.
–簡而概之就是當一個類別(高階)需要其他類別(低階)來達成目的時, 應由高階類別因需求來制定介面, 低階類別則實作介面.
自己較常用的設計
針對特定情境可使用下列的設計, 可達成以下:
- 1. DIP
- 2. 高內聚低耦合
- 3. IOC
- 4. 職責區分
- 5. 統一控制流程與類別
- 6. 修改封閉
- 7. 擴充開放
概念
初期: 有一個老闆將12件事情交由一個人做.
※描述: 那個人看起來好累, 而且很容易出包.
中期: 老闆決定請三個不同專業的人共同完成12件事情. (達到上述第 2, 4 點)
※描述: 變老闆很累, 要管理三個人還要監督.
後期: 老闆受不了, 請了一個主管來管理這些人跟事情. (達到上述第 2, 3, 4, 5 點)
※描述: 老闆突然又變輕鬆了(有錢就是任性), 只需要命令主管, 主管就會下去做並且回報.
最後: 天顧傻人, 公司工作量暴增, 老闆跟主管說要依照職責發出面試需求.(達到上述的全部)
※描述: 最後努力不懈的老闆終於過著幸福美滿的生活了.(主管哭哭)
將最後結果以類別圖來看
NOTE:
要實作一個大功能, 大功能共有12個需求, 再試著從這12個需求依職責來分類, 最後分成三個職責, 由需求出發創造三個介面.
那這由同一個大功能所分下去的職責, 那每個職責可能會有流程控制(相依), 若將流程控制寫在使用端必然會衍生程式碼不易維護的問題.
所以要將流程控制封裝起來, 使用一個介面去繼承原本職責區分的三個介面, 再由一個抽象類(控制流程的類)去繼承該第四個介面, 這個類的功能單單只專注於流程控制!!
多多指教!! 歡迎交流!!
你不知道自己不知道,那你會以為你知道