【问题标题】:Is router a facade pattern?路由器是外观模式吗?
【发布时间】:2015-05-11 01:30:27
【问题描述】:

我有这个路由器类,但我不确定它应该属于什么模式。对我来说,这似乎是facade 或中介模式。你怎么看?

class Router 
{
...
}

用法,

$router = new Router();

$router->get('/', function() { ... });
$router->get('foo/', function() { ... });
$router->post('foo/', function() { ... });

但是,似乎有人说路由器是一种反模式,正如question 中的一些评论所暗示的那样。如果路由器违反模式,那么解决方案是什么?

【问题讨论】:

    标签: php oop design-patterns solid-principles facade


    【解决方案1】:

    路由器本身并不是一个模式,它只是一个工具,它只是将 URI 字符串与已知的 reg-ex 模式进行匹配。一旦找到匹配项,控制器的实例化需要由另一个工具处理,该工具称为 Dispatcher。所以职责之间有一个清晰的分离,从而遵守单一职责原则

    路由器本身不违反任何已知模式。只有您在编写路由器类时可能会违反它们。

    要启动您的应用程序,您还需要实现诸如 Front Controller、Dispatcher 和 PSR-0 类自动加载器之类的东西。

    至于外观,您的路由器实现与它无关。因为外墙不适合这样的事情。 Taylor 调用外观类,提供服务,它不是外观模式的实现。

    外观本身只是一个包装器,它必须为不同的环境提供一个接口。例如,一个非常流行的 JavaScript 中 Facade 实现示例

    function click(elem, event, callback){
      if (elem.addEventListener != undefined){
         return elem.addEventListener(..);
      } else if (elem.attachEvent != undefined) {
         return elem.attachEvent(..);
      } else {
         return elem.onclick = callback;
      }
    }
    

    或者可能是这样的:

    // For old PHP versions
    if (!function_exists('file_get_contents')){
      function file_get_contents(){
        // ...
      }
    }
    

    这就是外观的全部意义所在。

    最后回答你的问题, 我想说,如果你不知道路由器应该如何工作,你应该停止思考如何编写完美的代码。你最好先写出有用的东西,然后再考虑改进它。因此,您可能会得到良好且有效的代码。

    【讨论】:

    • 感谢您的回答。但是Only you might violate them when writing a router class. - 为什么不应该让路由器成为一个类?那么它应该只是一个函数?
    • 当我写这句话时,我的意思是,许多开发人员滥用路由实现,把所有东西都放进去。他们的路由器知道的太多了,也就是说你可以在一个类中看到调度程序和前端控制器的实现。
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2015-11-30
    • 2012-06-04
    • 2020-03-31
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多