2012-02-08 21 views
3

我花了大今天思索这个在被宣布的路线。我正在处理两个应用程序 - 一个ExtJS4驱动的应用程序和一个Backbone驱动的应用程序。在这两种情况下,他们都是单页面应用程序 - 用户不会离开页面,因此他们可以“暂停”他们正在做什么或想要对另一个兴趣点作出反应。路由在配置正在申报VS由自己控制

在ExtJS4情况下,我使用的是一种土生土长的航线系统,其中,当应用程序启动时,它要求所有的控制器,“你回应什么路线?”。据我所知,这有几个优点 -

  1. 路由在控制器上定义,所以删除控制器,不需要更新配置文件。
  2. 应用程序更容易添加控制器,它似乎让它变得更加模块化。
  3. 改变路线,或参数不需要申请变更,只控制器(而且由于控制器内部处理的路线,这是很好的限制)。

问题是,我还没有看到任何框架或应用程序到目前为止,做这样的事情。我不知道为什么 - 这是一种非常糟糕的做法,它不会将其变为生产环境?或者我只是没有在使用它的项目上工作..?基于Backbone的应用程序基于一些疯狂的hackjob代码,所以今天我使用相同的基本格式重写了大部分代码。它极大地降低了代码的复杂性,导致我怀疑这是不是真正的情况。

的伪代码:

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 ..但这不是应用程序的工作方式,所以在这种情况下,这是一个有争议的问题。

回答

2

如果我想弄清楚用户如何到/bookmarks/edit/5,我在哪里看?

你的方法,我一定要找到控制器;谁知道你把它放在哪里。也许你正在遵循一个命名约定,或者不是。也许路线更像/users/domenic/edit/preferences ---我不知道控制器会在那里。

使用传统的方法,路线布线与控制器分开。如果我想知道路线的走向,只有一个地方可以看。我不会无意中为同一条路线添加两个响应,因为这些配线会彼此相邻 - 而如果我将我的路线放在我的控制器上,我可能花费相当多的时间思考“为什么不是我的动作被触发?“这是因为其他控制器在其他地方已经响应该路线。

一般来说,这个想法是分离关注点。控制者的工作不是担心路由:控制者的工作是暴露行为,可能以各种方式调用(路由是其中之一)。控制器责任范围非常紧密(单一责任原则:控制器只有一个更改轴)。路由问题可分为专用路由表,该路由表将路由与其实施分离,并使其易于更改(开闭原则)。如果您稍后想要更改/users/domenic/edit/preferences以使用preferences控制器而不是users控制器,则根本不需要编辑控制器:应该是这样,因为它们不需要担心路由。

+0

这就是为什么做一个唯一的程序员有时真的不是最好的方式去。输入互联网后不超过几个小时,我意识到存在问题,然后您确认。 – Stephen 2012-02-08 19:15:14

+0

这就是我们在这里! :d – Domenic 2012-02-08 19:25:32