最小知識原則

最小知識原則,全名 Least Knowledge Principle,簡稱 LKP

定義

一個物件應該對其他物件有最少的了解,盡可能減少類別中的 public method,降低其他類別對此類別的偶合度。

你知道的太多了

秘訣

  • 已經成形的操作流程就封裝起來
  • 不必要的公開方法就設為 private 或 protected
  • 外面知道的越少,偶合度就越低

範例

假設我們今天要開一間洗衣店,首先寫個洗衣服務。

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
36
class LaundryService
{

private $clothing;

public function __constrcut(array $clothing)
{
$this->clothing;
}

public function cleanSpecialStain()
{
...
}

public function wash()
{
...
}

public function dry()
{
...
}

public function iron()
{
...
}
}

$service = new LaundryService($dirtyClothes);
$service->cleanSpecialStain()
->wash()
->dry()
->iron();

嗯,看起來很不錯。
從清除特殊污漬、清洗、烘乾、到整燙,服務很完整。
SOP 流程很明暸, 但是有一個問題,想使用這個洗衣服務的人都居然要知道這個固定的 SOP!!!
既然這是固定的作業流程,我們還是將它封裝起來吧!免得有人不照著流程亂搞。或是有一天老闆佛心來地想要把除毛球服務加到固定流程裡,但是客人不知道。

所以,再來把這個 SOP 流程給包裝起來,讓使用這個服務的人只要呼叫 doLaundry 函式就可以了。

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
36
37
38
39
40
41
42

class LaundryService
{

private $clothes;

public function __constrcut(array $clothes)
{
$this->clothes;
}

public function doLaundry()
{
$this->cleanSpecialStain()
->wash()
->dry()
->iron();
}

private function cleanSpecialStain()
{
...
}

private function wash()
{
...
}

private function dry()
{
...
}

privat function iron()
{
...
}
}

$service = new LaundryService($dirtyClothes);
$service->doLaundry();

Reference

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