背景
比如現在要設計一個使用者貸款能力評估的一個系統,需要根據使用者的狀況和條件計算使用者的貸款分值。
實現部分
從 if else 和 使用 Pipeline 進行比較:
使用者例項:
$user = [
'credit_value' => 100, // 芝麻信用分
'have_car' => true, // 是否有車
'car_value' => 30, // 車子的價值多少萬
'is_marray' => false, // 是否結婚
'have_home' => false, // 是否有房子
];
ifelse 實現
func creditAssess($user)
{
$credit = 0;
// 芝麻信用
if ($user['credit_value'] >= 550) {
$credit += 300;
} elseif ($user['credit_value'] >= 300) {
$credit += 150;
} elseif ($user['credit_value'] >= 100) {
$credit += 50;
} else {
$credit += 0;
}
// 車子評估
....
// 婚姻評估
...
// 其他維度
...
}
Pipeline 實現
index.php
$user = [
'credit_value' => 100,
'have_car' => true,
'car_value' => 30,
'is_marray' => false,
'have_home' => false,
];
$pipes = [
PersonalCreditAssess::class,
MarrayAssess::class,
HomeAssess::class,
CarAssess::class,
];
$credit = (new Pipeline(app()))
->send($user)
->through($pipes)
->then(function(array $user) {
return 0;
});
dd($credit);
芝麻信用:PersonalCreditAssess
class PersonalCreditAssess
{
public function handle($user, $next)
{
$credit = 0;
if ($user['credit_value'] >= 550) {
$credit = 300;
} elseif ($user['credit_value'] >= 300) {
$credit = 150;
} elseif ($user['credit_value'] >= 100) {
$credit = 50;
} else {
$credit = 0;
}
$nextCredit = $next($user);
return $credit + $nextCredit;
}
}
婚姻部分:MarrayAssess
class MarrayAssess
{
public function handle($user, $next)
{
$credit = 0;
if ($user['is_marray']) {
$credit = 100;
}
return $next($user) + $credit;
}
}
房子評估:HomeAssess
class HomeAssess
{
public function handle($user, $next)
{
$credit = 0;
if ($user['have_home']) {
$credit = 300;
}
return $next($user) + $credit;
}
}
等等,其它部分
總結
我們可以看到,Pipeline 將程式碼變得優雅,從龐大的 if else 中解脫出來,以及對以後的使用者其它維度做到了方便的擴充套件,是 “對修改關閉,有擴充套件開放” 的設計原則體現。
本作品採用《CC 協議》,轉載必須註明作者和本文連結