單ㄧ職責原則

A class should have one, and only one, reason to change.
Robert C. Martin

單ㄧ職責原則,全名 Single Responsibility Principle,簡稱 SRP
個人覺得 SRP 是 SOLID 六大原則中最簡白易懂的原則。

定義

應該且僅有一個原因引起類別的變更,讓類別只有一個職責。

秘訣

  • 關注點分離,一個類別只應有一個核心任務
  • 不要貪方便全塞一起
  • 注意切太細會有類別太多的問題

提醒

  • 設計階段就可以避開類別職責太大的問題
  • 但小心在維護階段受到誘惑又讓類別職責變多,所以,想清楚類別的核心價值,若是需要開新的類別,當開則開

範例

先來看一個例子,下面這個例子是否有可以優化的地方?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Order
{
private $products;
private $amount;

public function calculateAmount()
{
if ($this->products) {
// calculate total amount...
}
}

public function printInvoice()
{
//download a PDF invoice
}

public function printPackingList()
{
//download a PDF packing list
}
}

稍微修改一下,把輸出檔案的部分拆出來,這樣 Order 是不是看起來就更能專注在核心的工作項目上,有關輸出成單據的部分都拆出去,之後也可能會有不同的單據要輸出,擴充性也能更好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Order
{
private $products;
private $amount;

public function calculateAmount()
{
if ($this->products) {
// calculate total amount...
}
}
}

interface Printable
{
public function print(Order $order);
}

class InvoicePrinter implements Printable
{
public function print(Order $order)
{
$contensts = $order->getContents();
//prepare PDF then download...
}
}

class PackingListPrinter implements Printable
{
public function print(Order $order)
{
$contensts = $order->getContents();
//prepare PDF then download...
}
}

Reference

PHP 也有 Day #19 - PHP 返樸歸真系列之從實例學設計模式 by 大澤木小鐵 (Jace Ju)​
物件導向設計原則 SOLID
SOLID:五則皆變
The Principles of OOD