一個 Pipeline 的使用場景

Shadow12345發表於2022-06-09

背景

比如現在要設計一個使用者貸款能力評估的一個系統,需要根據使用者的狀況和條件計算使用者的貸款分值。

實現部分

從 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 協議》,轉載必須註明作者和本文連結

相關文章