使用變數執行 method 取代 if else

傳統我們會使用 if else 判斷,執行不同的 method,但由於 ECMAScript 與 PHP 動態語言的特性,我們可以將要執行的 method 名稱以變數表示,直接以該變數執行 method。

Version


ECMAScript 5
PHP 7.0

ECMAScript


if else
傳統若要根據不同的 property 值,執行不同 method,我們會使用 if else方式 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function User(showed) {
this.showed = showed;

this.toggleShow = function() {
if (this.showed) {
this.show();
} else {
this.hide();
}
};

this.show = function() {
print('User show');
};

this.hide = function() {
print('User hide');
};
}

var user = new User(false);
user.toggleShow();

第 4 行

1
2
3
4
5
6
7
this.toggleShow = function() {
if (this.showed) {
this.show();
} else {
this.hide();
}
};

使用 if else 去判斷 property 值,執行不同 method。

Variable
若將 method 名稱使用變數表示,則不需使用 if else 判斷 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function User(showed) {
this.showed = showed;

this.toggleShow = function() {
var method = (this.showed) ? 'show' : 'hide';
this[method]();
};

this.show = function() {
print('User show');
};

this.hide = function() {
print('User hide');
};
}

var user = new User(false);
user.toggleShow();

第 4 行

1
2
3
4
this.toggleShow = function() {
var methodName = (this.showed) ? 'show' : 'hide';
this[methodName]();
};

判斷 this.showed,並將要執行的 method 名稱存入 methodName 變數。

在 ECMAScript,若要執行物件的 method,有以下3種方式 :

  1. object.method()
  2. object‘method’ : 其中 ‘method’ 是字串
  3. objectmethod : 其中 method 是變數

因為第 3 種方式,我們可以將 method 名稱以變數方式傳入 []

PHP


PHP 也可以達到類似 ECMAScript 的功能。

if else
傳統若要根據不同的 field 值,執行不同 method,我們會使用 if else方式 :

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
class User
{

private $showed;

function __construct(bool $showed)
{

$this->showed = showed;
}

public function toggleShow()
{

if ($this->showed) {
$$this->show();
} else {
$this->hide();
}
}

public function show()
{

echo('User show');
}

public function hide()
{

echo('User hide');
}
}

$user = new User(false);
$user->toggleShow();

第 10 行

1
2
3
4
5
6
7
8
public function toggleShow()
{

if ($this->showed) {
$$this->show();
} else {
$this->hide();
}
}

使用 if else 去判斷 field 值,執行不同 method。

Variable
若將 method 名稱使用變數表示,則不需使用 if else判斷 :

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
class User
{

private $showed;

public function __constructor(bool $showed)
{

$this->showed = showed;
}

public function toggleShow()
{

$method = ($this->showed) ? 'show' : 'hide';
$this->$method();
}

public function show()
{

echo('User show');
}

public function hide()
{

echo('User hide');
}
}

$user = new User(false);
$user->toggleShow();

第 10 行

1
2
3
4
5
public function toggleShow()
{

$method = ($this->showed) ? 'show' : 'hide';
$this->$method();
}

判斷 $this->showed,並將要執行的 method 名稱存入 $method 變數。

在 PHP,允許我們在 -> 之後直接加上變數(),代表要執行的 method。

Conclusion


  • ECMAScript 與 PHP 都允許我們將欲執行的 method 名稱以變數表示。
  • 因為 method 名稱是字串,所以我們可以將 method 名稱存在設定檔內,如 config/app.php,將來若因為需求改變,須改變執行的 method 時,只需修改設定檔即可,並透過 config::get() 讀取 method 名稱,原來程式碼完全不用修改,達到開放封閉原則的要求。

Sample Code


完整的範例可以在我的 GitHub 上找到。

2016-02-28