物件導向 - 個人心得

  • 1744
  • 0
  • 2021-11-23

此篇紀錄對物件導向與其它要點.

2021更新: 物件導向心得2


 

物件導向觀點一

  • 最高觀點:
    • –以客戶的需求為出發點,  從需求衍生系統介面.
  • 中階觀點:
    • –以高階物件產生需求並衍生介面.​
  • 低階觀點:
    • –以程式碼來看, 提高關注點.

物件導向觀點二

  • 從程式碼來看:
    • –寫好類別方法內的事情.
  • 從架構來看:
    • –以會影響類別的型與關聯.​
  • 從需求來看:
    • –會影響整個系統架構與功能模組間的關聯.

 

抽象

  • 抽象並非單純簡化, 而是外界對事物的認知​:
    • –對事物的認知會反映出類別的特色與職責.
  • 抽象省略了細節, 專注再需求的描述上​:
    • –學習用抽象的角度來看待事物之間的互動.​
  • 過度抽象會導致外界無法理解甚至錯誤​:
    • –不要將事物的特徵完全抽離, 特色應被保留.
  • 重需求出發, 先關注需求要什麼, 再談如何達成:
    1. ​​思考由需求衍生出的物件如何互動, 決定架構.
    2. 從用戶端(呼叫端, 需求, …, client/server )的角度去設計.
    3. 讓底層的元件去組合出符合需求的程式碼.

 

架構分層

  • 一般而言系統程式架構分為​:
    • –介面層
    • –控制層
    • –業務邏輯層
    • –資料存取層
  • 衍生出服務層(創造接口, 實作類)​:
    • –業務邏輯服務層
    • –應用程式服務層
    • –第三方工具服務層
      創造這些接口的目的是為了降低與實作的相依外, 替換實做時也較為容易.

 

封裝是什麼?

  • 簡單的說就是將很多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個需求依職責來分類, 最後分成三個職責, 由需求出發創造三個介面.

那這由同一個大功能所分下去的職責, 那每個職責可能會有流程控制(相依), 若將流程控制寫在使用端必然會衍生程式碼不易維護的問題.
所以要將流程控制封裝起來, 使用一個介面去繼承原本職責區分的三個介面, 再由一個抽象類(控制流程的類)去繼承該第四個介面, 這個類的功能單單只專注於流程控制!!

 

 


多多指教!! 歡迎交流!!

你不知道自己不知道,那你會以為你知道