簡潔架構 - Chapter 25 - 層與邊界
Chapter 25 - 層與邊界如果我們將系統看作是由三個元件組成的:UI、業務規則跟資料庫。假設我們要設計一個簡單的電腦遊戲,UI處理玩家到遊戲規則的所有訊息,遊戲規則則以某種資料結構儲存遊戲的狀態。讓我們以這個遊戲最簡單的形式為基底,我們將在這樣的架構上加點東西。
假設我們要保留基底文字的UI,但要將遊戲規則解耦開來,以便我們可以在不同國家的版本上使用不同的語言。如果原始碼的依賴關係被正確管理,則會如下圖顯示,任何數量的UI都可以重複使用同一套的規則。
再來,假設我們想要遊戲可以切換儲存的硬體機制,或許是儲存在RAM,或許是儲存在雲端上。我們不希望遊戲規則知道任何有關硬體儲存機制的事情,所以依賴關係必須按照依賴規則進行適當的定向,如下圖。
簡潔的架構?顯而易見的,我們可以將「簡潔的架構」的設計應用在這個地方,但我們是否真的找到了所有重要的架構邊界呢?
例如,語系並非是UI發生變化的唯一要素,或許我今天需要將文字顯示在聊天視窗、或是遊戲的文字對話筐中。這意味著我們的架構中存在一個潛在的邊界,或許我們應該建構一個跨越邊界的API,將語系及通訊機制隔離開來,如下圖所示。
虛線框定 ...
簡潔架構 - Chapter 24 - 部分邊界
Chapter 24 - 部分邊界全面性的架構邊界代價是昂貴的,在設計上也會因為預想某個地方可能需要一個邊界,而預先的為這個邊界保留一個位置,但這樣子的設計違反了YAGNI原則(You Aren’t Going to Need it 你還不需要他),這種情況下,我們就會需要部分邊界(partial boundary)
三種可行的簡單方式跳過最後一步完成可獨立編譯及可獨立部署元件所需的所有工作,然後將它們全部包在同一個元件裡面。(簡單的說就是我全都要)如此一來,雙方能受惠的介面包含在裡面,輸入輸出會用到的資料結構也在裡面,但我們將他們全部都編譯和部署成一個單一的元件了。
Strategy Pattern 策略模式
ServiceBoundary介面由Client使用,並由ServiceImpl實作。原本的依賴方向是虛線箭頭,而我們加了介面跟制定了邊界,為了未來的架構邊界訂定了基礎。
來看一個策略模式的UML
CashNormal - 普通收費
CashRebate - 打折收費
CashReturn - 紅利收費
CashSuper - 抽象收費策略
CashContext - Cl ...
簡潔架構 - Chapter 14 - 元件耦合性
Chapter 14 - 元件耦合性本章會討論到關於元件耦合性的三個原則:
無環依賴原則
The Acyclic Dependencies Priciple
簡稱 ADP
穩定依賴原則
The Stable Dependencies Principle
簡稱 SDP
穩定抽象原則
The Stable Abstractions Principle
簡稱 SAP
無環依賴原則 (ADP)在元件的依賴關係圖中不允許出現環
如14-2圖中,Database的發佈必須相容於Entities,而遵循這個依賴關係,我們也必須讓Authorizer也相容,同時Database跟Authorizer都相容於Interractors,這使任何改動與發佈要付出很大的成本。這些元件之間的改動及行為必須要完全一致,事實上他們已經變成了同一個大元件。
解除依賴環
使用依賴反轉原則(DIP),新增介面至Entities中
新建立一個Entities與Authorizer都依賴的元件(Permission),不過此解決方案在存在改變的前提下,元件的結構是不穩定的。不過此解決方案在存在改變的前提 ...
簡潔架構 - Chapter 13 - 元件內聚性
Chapter 13 - 元件內聚性本章會討論到關於元件內聚性的三個原則:
再使用性 - 發佈等價原則
The Reuse/Release Equivalence Principle
簡稱 REP
共同封閉原則
The Common Closure Principle
簡稱 CCP
共同重複使用原則
The Common Reuse Principle
簡稱 CRP
再使用性 - 發佈等價原則 (REP)再使用性的細微度就是發佈的細微度
使軟體擁有再使用性,是物件導向模型的其中一個承諾
從軟體設計及架構的角度來看,這個原則意味著組成一個元件的類別及模組必須是一個擁有高內聚性的群組
共同封閉原則 (CCP)將那些會因相同理由、在相同時間發生變化的那些類別收集到相同的元件之中。
將那些在不同時間、因著不同理由發生變化的類別分割到不同的元件之中。
大致上我們可以將共同封閉原則(CCP)想像成單一職責原則(SRP)加上開放封閉原則(OCP)的元件版本。
與單一職責原則(SRP)相似如同單一職責原則(SRP)規定一個類別不可包含多個引起變化的原因一般,共同封閉原則( ...
簡潔架構 - Chapter 12 - 元件
Chapter 12 - 元件元件(Component)是部署(Deployment)的單位,就像
Java 中的 jar
Ruby 中的 gem
.NET 中的 dll
這一張剩餘的部分都在歷史小故事,所以我就跳過了
在 win10 上使用 php-cs-fixer 自動排版 php 程式碼為 psr-12 格式
在 win10 上使用 php-cs-fixer 自動排版 php 程式碼為 psr-12 格式首先,我們先透過composer安裝php-cs-fixer
1composer global require friendsofphp/php-cs-fixer
然後我們便可以透過下面指令去重新排版資料夾內的檔案成預設的排版規則
1php php-cs-fixer.phar fix /path/to/project
在 windows 上,如果你想要透過絕對路徑去執行上方指令的話可以參考下方路經
其中UserName為自己的帳號名稱
1C:\Users\UserName\AppData\Roaming\Composer\vendor\friendsofphp\php-cs-fixer\php-cs-fixer
所以我們就可以將指令改為透過絕對路徑去執行
1php C:\Users\UserName\AppData\Roaming\Composer\vendor\friendsofphp\php-cs-fixer\php-cs-fixer fix /path/to/project
...