多条件判断,怎么写优雅

需求如下

腐植酸含量30 g/L(不低于30 g/L)(右边有+-键,可以增加或减少,但净含量不低于30 g/L)。大量元素含量(合计不低于200 g/L):氮70 g/L(下边有两个选择,UAN或氮,每个健右边有+-键,可以增加或减少,下同), 磷70 g/L(下边有两个选择,磷酸一铵或磷酸二铵,每个健右边有+-键,可以增加或减少,下同),钾60 g/L(下边有四个选择,氯化钾、硫酸钾、硝酸钾或磷酸二氢钾,每个健右边有+-键,可以增加或减少,下同)。至少包括两种元素,单一元素净含量不低于20 g/L,氮、磷、钾三个相加不能低于200 g/L,低于200 g/L弹出错误提示。

游离氨基酸100 g/L(不低于100 g/L)(右边有+-键,可以增加或减少,但净含量不低于100 g/L),微量元素(不低于20 g/L):铁4 g/L(每个右边有+-键,可以增加或减少,至少包括1种微量元素,6种元素净含量总和不低于20 g/L,低于则有错误提示。若添加任一微量元素,不低于0.5 g/L,低于则有错误提示)、锌4g/L、硼4g/L、铜4g/L、锰3.5g/L、钼0.5g/L(右边有+-键,可以增加或减少,钼净含量不能高于5 g/L,高于则有错误提示)

除了挨着判断,还有没有什么好的方式呀

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

那不如直接用laravel的pipeLine,简单的还是直接if else 更容易维护

1年前 评论
讨论数量: 10

责任链设计模式了解一下:

<?php

/**
 * 假设有一个复杂的判断流程,检查一个人是否符合参加某项比赛的条件
 * 条件包括:
 *   1. 年龄必须大于等于18岁;
 *   2. 身高必须大于等于170cm;
 *   3. 体重必须在60kg~80kg之间;
 *   4. 必须有一定的运动能力,包括50米短跑必须在10秒以内、100米游泳必须在2分钟以内、50米自行车骑行必须在15秒以内。
 */
interface Handler
{
    public function handle($request);
}

abstract class AbstractHandler implements Handler
{
    protected $successor;

    public function setSuccessor(Handler $successor)
    {
        $this->successor = $successor;
    }

    public function handle($request)
    {
        if ($this->process($request) && $this->successor) {
            $this->successor->handle($request);
        }
    }

    abstract protected function process($request);
}

class AgeHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['age'] < 18) {
            echo "年龄必须大于等于18岁。";
            return false;
        }

        return true;
    }
}

class HeightHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['height'] < 170) {
            echo "身高必须大于等于170cm。";
            return false;
        }

        return true;
    }
}

class WeightHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['weight'] < 60 || $request['weight'] > 80) {
            echo "体重必须在60kg~80kg之间。";
            return false;
        }

        return true;
    }
}

class SkillHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['running'] > 10 || $request['swimming'] > 120 || $request['biking'] > 15) {
            echo "必须有一定的运动能力,包括50米短跑必须在10秒以内、100米游泳必须在2分钟以内、50米自行车骑行必须在15秒以内。";
            return false;
        }

        return true;
    }
}

$ageHandler = new AgeHandler();
$heightHandler = new HeightHandler();
$weightHandler = new WeightHandler();
$skillHandler = new SkillHandler();

$ageHandler->setSuccessor($heightHandler);
$heightHandler->setSuccessor($weightHandler);
$weightHandler->setSuccessor($skillHandler);

$request = [
    'age' => 18,
    'height' => 170,
    'weight' => 90,
    'running' => 11,
    'swimming' => 110,
    'biking' => 14
];

$ageHandler->handle($request);
1年前 评论
CTdream 1年前

优雅用不过时

1年前 评论
Jennie 1年前

责任链设计模式了解一下:

<?php

/**
 * 假设有一个复杂的判断流程,检查一个人是否符合参加某项比赛的条件
 * 条件包括:
 *   1. 年龄必须大于等于18岁;
 *   2. 身高必须大于等于170cm;
 *   3. 体重必须在60kg~80kg之间;
 *   4. 必须有一定的运动能力,包括50米短跑必须在10秒以内、100米游泳必须在2分钟以内、50米自行车骑行必须在15秒以内。
 */
interface Handler
{
    public function handle($request);
}

abstract class AbstractHandler implements Handler
{
    protected $successor;

    public function setSuccessor(Handler $successor)
    {
        $this->successor = $successor;
    }

    public function handle($request)
    {
        if ($this->process($request) && $this->successor) {
            $this->successor->handle($request);
        }
    }

    abstract protected function process($request);
}

class AgeHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['age'] < 18) {
            echo "年龄必须大于等于18岁。";
            return false;
        }

        return true;
    }
}

class HeightHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['height'] < 170) {
            echo "身高必须大于等于170cm。";
            return false;
        }

        return true;
    }
}

class WeightHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['weight'] < 60 || $request['weight'] > 80) {
            echo "体重必须在60kg~80kg之间。";
            return false;
        }

        return true;
    }
}

class SkillHandler extends AbstractHandler
{
    protected function process($request)
    {
        if ($request['running'] > 10 || $request['swimming'] > 120 || $request['biking'] > 15) {
            echo "必须有一定的运动能力,包括50米短跑必须在10秒以内、100米游泳必须在2分钟以内、50米自行车骑行必须在15秒以内。";
            return false;
        }

        return true;
    }
}

$ageHandler = new AgeHandler();
$heightHandler = new HeightHandler();
$weightHandler = new WeightHandler();
$skillHandler = new SkillHandler();

$ageHandler->setSuccessor($heightHandler);
$heightHandler->setSuccessor($weightHandler);
$weightHandler->setSuccessor($skillHandler);

$request = [
    'age' => 18,
    'height' => 170,
    'weight' => 90,
    'running' => 11,
    'swimming' => 110,
    'biking' => 14
];

$ageHandler->handle($request);
1年前 评论
CTdream 1年前

责任链逐层递进下去就行了,不要看楼上的代码,他那个和观察者模式没区别

1年前 评论

要是没有思路的话,可以看一下我刚发的帖子, 看看对你有没有帮助

1年前 评论

那不如直接用laravel的pipeLine,简单的还是直接if else 更容易维护

1年前 评论

基于责任链模式,将所有的验证类放到数组中,然后循环调用就可以了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!