在配置中声明的路由与由其控制器声明的路由相比



我今天大部分时间都在思考这个问题。我正在开发两个应用程序——一个支持ExtJS4的应用程序和一个支持Backbone的应用程序。在这两种情况下,它们都是单页应用程序——用户不会离开页面,因此他们可以"暂停"自己正在做或正在看的事情,以对另一个兴趣点做出反应。

在ExtJS4的案例中,我使用了一种自制的路由系统,当应用程序启动时,它会询问所有控制器"你对哪些路由做出响应?"。据我所知,这有几个优点——

  1. 路由是在控制器上定义的,因此删除控制器就不需要更新配置文件
  2. 该应用程序更容易添加控制器,而且似乎使其更加模块化
  3. 更改路由或参数不需要应用程序更改,只需要控制器即可(由于控制器在内部处理路由,因此它受到了很好的限制)

问题是,到目前为止,我还没有看到任何框架或应用程序能做这样的事情。我不知道为什么——这是一种如此可怕的做法,以至于无法进入生产环境吗?或者我只是没有参与使用它的项目。。?基于Backbone的应用程序基于一些疯狂的hackjob代码,所以今天我用相同的基本格式重写了大部分代码。它极大地降低了代码的复杂性,这让我怀疑这是否是一个"太好而不真实的情况"。

Psuedo代码:

controller
    routes: ['/bookmarks', '/bookmarks/(:action)/(:id)', '/bookmarks/(:action)']
    init: fn ()
       this.application.registerRoutes(this.routes, this);
       //other code to set up views and such
    routeHandler: fn (route, params)
       //tells the application to switch the visible stuff to this thing's 
       //main view, declared elsewhere
       this.application.showView(this.view) 
       switch(params.action)
          case "edit":
             //some internal stuff to show the editing field for the ID passed..
             this.showEditor();
             this.loadRecordById(params.id)
          case "new":
             //some internal stuff 
             this.showEditor();

所以,我想问题是:"这是一种糟糕的做法吗?为什么?如果不是,为什么不在其他地方使用?用其他语言设置太难或太混乱了?你能预见到以后会有什么东西咬我吗?"

谢谢。

编辑:我昨晚意识到了一些不利因素-

  1. 注册所有可能的路由需要所有的控制器启动。但是,即便如此(尤其是JS),也有一个简单的方法可以解决这个问题
  2. 如果我想更改一条路线,我必须找到管理该特定路线的控制器。当然,如果我的路线命名得当,这应该不会成为问题
  3. 追踪别名路由会很困难,例如/marketing_page实际上是/pages/3..但这不是应用程序的工作方式,所以在这种情况下,这是一个没有意义的问题

如果我想弄清楚用户是如何到达/bookmarks/edit/5的,我该去哪里?

用你的方法,我必须找到控制者;谁知道你把它放在哪里。也许你遵循了命名惯例,也许没有。也许路线更像/users/domenic/edit/preferences——我不知道控制器会在那里。

在传统方法中,路由布线与控制器分离。如果我想知道路线的走向,只有一个地方可以看。我不会意外地为同一条路线添加两个响应,因为线路会紧挨着——而如果我把我的路线放在控制器上,我可能会花很长时间想"为什么我的动作没有被触发?"因为其他地方的其他控制器已经在对该路线做出响应。

一般来说,这个想法是关注点的分离。担心路由不是控制器的工作:暴露操作是控制器的工作,这些操作可以通过多种方式调用(路由就是其中之一)。然后,控制器的责任范围非常严格(单一责任原则:控制器只有一个变化轴)。路由问题可以分离到一个专用的路由表中,该表将路由与其实现解耦,并使其易于更改(打开-关闭原则)。如果以后要将/users/domenic/edit/preferences更改为使用preferences控制器而不是users控制器,则根本不必编辑控制器:这是应该的,因为它们不需要担心路由问题。

最新更新