2015年11月28日 星期六

Creational Design Patterns

creational design pattern

顧名思義
即產生instance 的pattern
為何要用factory 其實跟DIP(dependency inversion principle)有關系
為了要讓高階的程式邏輯不直接和低階的邏輯產生相依性
而讓new 這個動作交由外部的程式來產生



跟create object 有相關的design pattern 如下:

Abstract Factory and Factory method

Builder

Prototype

Singleton

結論:
1. 可以把這些 creational design pattern 當成互補的pattern
Factory pattern 可以當作產生object 的首選方法
Builder 可以利用factory 作每一個step 的實作,進而完成複雜的 component
Prototype 是利用現成的prototype object 來copy 成另一個新的object
Singleton 可以用在每一個pattern 中。

2. 在開發過程中,
一開始常會用factory pattern
等到factory 的靈活性不足時
才會考慮使用prototype, builder 的pattern
雖然更複雜
但也更有彈性。

Reference: 
1. book Learning PHP Design Patterns 
2. https://sourcemaking.com/design_patterns/builder

2015年11月27日 星期五

Object Oriented Programming basic concept



講到OOP

就一定要講到SOLID

S => SRP(Single Responsibility Principle) 單一職責原則O => OCP(Open Close Principle) 開放封閉原則L => LSP(Liskov Substitution Principle) 替換原則I => IAP(Interface Agreegation Principle) 介面分割原則D => DIP(Dependency Inversion Principle) 相依性反轉原則








SRP(Single Responsibility Principle): 

當一把瑞士刀太多功能時,你也不會想要用它

指每一個class 都應該只有一個職責
若一個class 作了太多事情
會導致這個class 的複雜度增加
也會造成日後的maintain cost 增加




OCP(Open Close Principle)

藉由增加新的code 來擴充系統的功能,非修改現有的程式碼來擴充系統的功能,所以新的code加進去時不會對現有的功能 造成影響。
對擴充具有開放性,對修改具有封閉性(單一理由修改)



LSP(Liskov Substitution Principle) 替換原則

子型別必需可替換父型別
玩具鴨需要電池
但野鴨不需要電池
兩者的行為也不同,
就無法用繼承的方式作實作

I => IAP(Interface Agreegation Principle) 介面分割原則

用戶不應被迫相依於他們用不到的函式,
介面屬於client site
不屬於server site
儘可能該介面單純化


想一想
如果介面為了要server 眾多的client 的需求
把介面作的越來越複雜
這樣增加的複雜度是所有的使用者共同承擔的
會造成所有使用者互相影響

D => DIP(Dependency Inversion Principle) 相依性反轉原則

高階邏輯應相依於抽像概念
而非相依於細節
也就是說所有的 new   instance
都應該由factory 來產生
讓所有的物件只相依於interface
而相依於實際上的object

寫程式如何看有沒有功力
就看他寫的code 是否有分階層
讓看的人可以比較清楚的了解程式的邏輯

插頭相依於插座
只有二頭插座侑三頭插座之分
並不會管後面到底是怎麼供電、
電從那裡來的問題


Design pattern overview

在學習design pattern 的同時
需要對它有一個整體性的了解

1. 需了解OOP 的basic concept
2. 對UML 需要有一些認知
3. 需要在寫程式上面多一些經驗

接下來再來談design pattern


  1. Creational Design Patterns
  2. Structural Design Patterns
  3. Behavioral Design Patterns