让一些服务通过一个可调用对象来配置是不是一个坏主意


Is it a bad idea to make some service configurable by a callable?

对于许多框架来说,拥有可以从数组接受配置参数的类是很常见的,但是如果我们可以使用闭包或可调用类,为什么要使用数组呢?

例如:

class Router 
{
    public function __construct(Closure $config)
    {
        $closure($this);
    }
    public function addRoute(...$params) {
        // some code
    }
}
配置/router.php:

return function($router) {
    $router
        ->addRoute('/')
        ->setName('home')
    ;
    // and so on....        
}

然后某处:

$router = new Router(include 'config/router.php');
$controller = $router->match('/some/path');

我错过了什么吗?也许我没有足够的经验,但我还没有见过这种方法。

UPD:为了更好地说明我的观点,这里有一个更新的版本:
class Router 
{
    public function configureWith(callable $configurator)
    {
        $configurator($this);
        return $this;
    }
    public function addRoute(...$params) {
        // some code
    }
}

class RouterConfigurator 
{
    public function __invoke($router)
    {
        $router->addRoute('/');
        $router->addRoute('/some');
        // and so on....  
    }
}

$router = new Router;
$router->configureWith(new RouterConfigurator);
$controller = $router->match('/some/path');

老实说,可能有很多原因,但对我来说最主要的可能是可读性。闭包很好,有自己的位置,但它们会使快速读取和调试代码的能力成为噩梦。

另一方面,数组是简单、轻量级的,处理它们的所有代码都在对象(封装)中。

如果遵循KISS原则,很多程序员可以学到很多东西,生成更容易阅读的代码,而不是开始编写"时髦"的代码。

请记住,其他人可能需要在你之后维护你的代码,或者你可能需要在你写完代码6/12个月后回来时记住你写了什么。当时说得通的东西,你以后可能会觉得陌生!

更不用说在您的特定示例中,如果您稍后添加代码来添加额外的功能,那么该对象的所有初始化代码都会在代码中被打乱。