条件是否应该在函数/方法的内部或外部

时间:2014-01-22 13:25:31

标签: php

什么是可取的:一个函数,决定它是否应该做任何事情,或决定是否调用该函数?

function x() {
    if ($userIsLoggedIn) {
        alwaysHelloUser();
    }

    if ($visitorRegion != 'US') {
        alwaysDisplayNoInternationalShipping();
    }

    if ($day == 'Sunday') {
        alwaysLockDownStore();
    }
}

function alwaysLockDownStore() {
    //close store
    //offer alternative store
    //show opening hours
    //display form for user leaving order for next day
    exit("Sorry, we are closed!");
}

function y() {
    perhapsSayHelloUser($user);
    maybeDisplayNoInternationalShipping($region);
    sometimesLockDownStore($day);
}

function sometimesLockDownStore($day) {
    if ($day == 'Sunday') {
        //close store
        //offer alternative store
        //show opening hours
        //display form for user leaving order for next day
        exit ("Sorry, we are closed!");
    }
}

该示例很简单,但想象一下使用配置或访问权限启用功能。有接受的标准吗?当我遇到类似y()的东西时,我的直觉告诉我去​​exit(),打破正常的流程。否则,封装和DRY会支持x()。你觉得怎么样?

编辑我已经花了这个例子。我的问题是:如果存在一个应该执行函数/方法的条件,那么该控制是否应该在函数中发生(整齐但结果是不确定的)或者在它之外(调用是冗长的,但预期输出总是相同的) )?

2 个答案:

答案 0 :(得分:2)

我更喜欢在功能中保留主要功能。外面的额外逻辑。因为该功能只会做出意图。或者你每次都会运行所需的功能。取决于您的问题的复杂程度。

function lockStoreOnDay($day) {
    // do locking
    return "Sorry, we are closed on $day!";
}

echo lockStoreOnDay('Sunday'); //will print "Sorry, we are closed on Sunday!"
echo lockStoreOnDay('Saturday'); //will print "Sorry, we are closed on Saturday!"

一般情况下:为什么不使用班级?

如果您具有访问权限或配置,则此信息可以存储在数组或对象中。因此,您遍历数组或搜索关键字,然后处理应处理的任何内容。 I. e。打个电话。

function lockStoreOnDay()
{
    //do locking
    return "Sorry, we are closed!";
}

$config_closeOnDay = array (
    'Sunday'
);

foreach ($config_closeOnDay as $dayToCloseOn) {
    echo lockStoreOnDay();
}

也许这有帮助。

答案 1 :(得分:1)

你不应该在函数内部对这些约束进行硬编码。你的目标应该是:

function isStoreLocked($dayToCheck, $daysLocked)
    {
    // You can replace "locking" logic with database or something
    // There shouldn't be an raw array of days inside code
    return in_array($dayToCheck, $daysLocked);
    }

然后在你的代码中:

$curentDayName = date('l');
$lockedDays = array('Saturday', 'Sunday');
if(isStoreLocked($currentDayName, $daysLocked))
    {
    die('Sorry, store is locked!');
    }

为我的答案提供上下文:如果你使用框架(我的选择是Symfony2),isStoreLocked应该是服务或存储库方法,它应该在控制器内调用,同时返回Response(而不是简单) die())。