我今天大部分时间都在考虑这个问题。我正在开发两个应用程序 - 一个ExtJS4驱动的应用程序和一个Backbone驱动的应用程序。在这两种情况下,它们都是单页应用程序 - 用户不会离开页面,因此他们可以“暂停”他们正在做的事情或者看到对另一个兴趣点做出反应。
在ExtJS4案例中,我使用的是一种本土路由系统,当应用程序启动时,它会询问所有控制器“你回应哪些路由?”。据我所知,这有几个优点 -
问题是,到目前为止我还没有看到任何类似这样的框架或应用程序。我不知道为什么 - 这是一种如此可怕的做法,它不能进入生产环境吗?或者我只是没有在使用它的项目上工作..?基于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();
所以,我想这个问题是:“这是不好的做法,为什么?如果没有,为什么不在其他地方使用?用其他语言设置太难或太乱了?你能预见到管道上有什么东西吗?以后会咬我的?“
感谢。
编辑: 昨晚我意识到了一些缺点 -
答案 0 :(得分:2)
如果我想弄清楚用户如何到达/bookmarks/edit/5
,我在哪里看?
通过你的方法,我必须找到控制器;谁知道你把它放在哪里。也许你正在遵循一个命名约定,或者可能不是。也许路线更像是/users/domenic/edit/preferences
---我不知道控制器会在那里。
采用传统方法,路由布线与控制器分离。如果我想知道路线的去向,那么只有一个地方可以看。我不会意外地为同一条路线添加两个响应,因为接线将紧挨着彼此---如果我将路线放在我的控制器上,我可能会花很多时间想知道“为什么不是我的动作被触发?“当它是因为某个其他控制器,在其他地方,已经在响应那条路线。
一般来说,这个想法是关注点分离。担心路由不是控制器的工作:控制器的工作是暴露操作,可以通过多种方式调用(路由就是其中之一)。然后,控制器的责任范围非常严格(单一责任原则:控制器只有一个变更轴)。路由问题可以分为专用路由表,它将路由与其实现分离,并使其易于更改(开放 - 关闭原则)。如果您以后想要更改/users/domenic/edit/preferences
以使用preferences
控制器而不是users
控制器,则根本不需要编辑控制器:这应该是,因为它应该是他们不应该担心路由。