通过可调用来配置某些服务是不是一个坏主意?

时间:2015-09-10 22:18:53

标签: php symfony oop design-patterns

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

例如某些路由器服务:

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');

1 个答案:

答案 0 :(得分:0)

说实话,可能有无数的原因,但对我来说可能主要是可读性。闭包很好并且有它们的位置,但是它们能够快速读取代码并将其调试成为一场噩梦。

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

很多程序员可以学到很多东西,如果他们遵循KISS原则就可以生成更容易阅读的代码,并且在编写“时髦”的代码时并没有下载。代码。

请记住,其他人可能必须在您之后维护您的代码和/或您可能需要记住您在编写后6/12个月回来时编码的内容。那时候有意义的事情对你来说可能看起来很陌生!

更不用说在您的特定示例中,如果您稍后添加代码以添加其他功能,则该对象的所有初始化代码都会通过代码填充。