or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
設計模式前置知識
抽象化
由 Wiki 的定義 , 我們可以知道抽象化是
針對某個事物或是概念 , 僅使用你對其感興趣或是覺得重要的資訊特徵(Feature)來描述
這樣做的好處是
當我們將現實事物或概念抽象化為類別後 , 其在呈現上會比原本的樣子更簡單 , 這可幫助我們在處理問題時 , 不需要處理過多的雜訊
PS : 建立一個類別很簡單 , 但如何建好一個類別 , 卻很困難XD.
參考資源
抽象化WIKI
高內聚 & 低耦合
高內聚和低耦合是我們用來評估程式是否寫得好的一個重要指標 , 也是目標 !!!
高內聚
低耦合
低耦合定義
直接耦合
抽象耦合
PS : 通常我們會讓高位模組不知道其真正使用的低位模組的型別 , 所以我們會盡可能使用抽象耦合 , 而非直接耦合
參考資源
内聚性(電腦科學)
耦合性
繼承 & 封裝 & 多型
OOP 三大特性 , 若能善加運用這三個特性 , 可以幫助我們寫出更好的程式
繼承
使用繼承的原因
封裝
多型
參考資源
繼承 (電腦科學)
封裝 (物件導向程式設計)
多型 (電腦科學)
SOLID 設計原則
遵守 SOLID 設計原則可以幫我們更好地達成高內聚以及低耦合的目標.
單一職責原則 Single Responsibility Principle (SRP)
關注點分離(Separation of Concerns)
SRP 定義
PS: 實務上 , 很可能無法一開始就實現這個原則 , 即使一開始是 , 也有可能在之後的開發 , 隨著不斷疊加新的功能而變得沒有滿足這個原則的要求. 當你發現一個類別負責太多功能(過於龐大) , 導致難以維護時 , 請適時的進行類別的重構 , 將類別中實作相關功能的部分抽取出來並封裝成一個新的類別 , 再透過組合的方式將新增的類別加入原類別之中 , 以此慢慢再度達成單一職責的要求.
參考資源
深入淺出單一職責原則 Single Responsibility Principle
單一功能原則
開放封閉原則 Open-Closed Principle (OCP)
定義 : 對擴展開放 , 對修改封閉
e.g. 公開方法 or 公開屬性等等
e.g. 透過繼承式多型來增加功能
因為不會去修改到舊的程式碼 ,所以舊的程式碼理論上不應該會產生新的 Bug
OCP Summary
則應該考慮遵守 OCP 原則, 重構其為遵守 OCP 的程式碼.
OCP Example
參考資源
深入淺出開放封閉原則 Open-Closed Principle
里式替換原則 Liskov’s Substitution Principle (LSP)
定義 : 子類別必定能夠替換父類別
例如 : 鴕鳥繼承鳥類. 鳥類會飛 , 但鴕鳥不會飛 , 故使用鳥類的地方 , 不能使用鴕鳥去替換.
所以我們只能說鴕鳥是鳥類的 SubClass , 但不能說是 SubType.
參考資源
深入淺出 Liskov 替換原則 Liskov Substitution Principle
倚賴倒置原則 The Dependency Inversion Principle (DIP)
倚賴倒置原則定義
例如 : 想要使用 RSA 加密 , 則應該先思考的是加密應該如何抽象化(e.g. 其他人會如何與加密介面型態互動) 而非 RSA 加密可以如何實作. –> 先寫抽象(加密) , 再實作(RSA加密演算法).
參考資源
深入淺出依賴反向原則 Dependency Inversion Principle
介面隔離原則 Interface Segregation Principle (ISP)
Summary
參考資源
深入淺出介面分割原則 Interface Segregation Principle
菜雞與物件導向 (13): 介面隔離原則
最少知識原則 Law of Demeter (LOD)
反過來說 , 一個類別不應該公開那些不需要讓人知道的資訊. 請善加使用 private 修飾詞以封裝那些外界不需要知道的資訊 , 因為你永遠不知道外界如何使用你的公開成員.
參考資源
Law of Demeter
迪米特法则
[心得整理] c# 物件導向程式 - 6.LKP 最少知識原則
控制反轉 Inversion of Control
定義
–> 需要甚麼 , 就跟第三方要 , 透過第三方(負責 new 物件,再回傳)得到所需物件.
依賴注入 (Dependency Injection)
定義
依賴注入是將高位模組所需的低位模組注入(提供)到高位模組中的一種技術
所以可以把依賴注入想成是控制反轉的其中一種實作方式. 因為高位模組不需要自己產生低位模組 , 低位模組會透過某種方式被提供給高位模組. 而這就滿足了控制反轉所需要達成的目標.
常見的注入方式
簡單自製 IOC 容器範例
自製 IOC 容器實作方式
自製 IOC 容器使用範例
控制反轉 vs 依賴反轉
控制反轉 不等於 依賴反轉 !!!
遵守控制反轉但不遵守依賴反轉 !?
此程式違反了依賴倒置原則. 但 Programmer 仍然可以由 IOC 容器取得 Computer 物件.
遵守依賴反轉但不遵守控制反轉 !?
同時使用遵守依賴反轉以及控制反轉
總結 : 控制反轉 vs 依賴反轉
參考資源
你確定懂?徹底搞懂 控制反轉(IoC Inversion of Control )與依賴注入(DI Dependency Inversion Principle )
淺入淺出 Dependency Injection
控制反轉 (IoC) 與 依賴注入 (DI)
Writing a Minimal IoC Container in C#
控制反轉(Inversion of Control)與依賴注入(Dependency Inversion)
Thank you!
You can find me on
若有謬誤 , 煩請告知 , 新手發帖請多包涵
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →