【问题标题】:Routes being declared in a config vs routes being declared by their controller在配置中声明的路由与由其控制器声明的路由
【发布时间】:2012-02-08 08:52:52
【问题描述】:

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

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

【问题讨论】:

    标签: javascript routes


    【解决方案1】:

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

    用你的方法,我必须找到控制器;谁知道你把它放在哪里。也许您正在遵循命名约定,也可能没有。也许路由更像/users/domenic/edit/preferences---我不知道控制器会在那里。

    使用传统方法,路由布线与控制器分离。如果我想知道路线的去向,只有一个地方可以查看。我不会不小心为同一条路线添加两个响应,因为线路会彼此相邻——而如果我将路线放在控制器上,我可能会花很长时间想知道“为什么不是我的行动被触发了?”当这是因为其他地方的某个其他控制器已经在响应该路由时。

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

    【讨论】:

    • 这就是为什么有时候做一个单独的程序员真的不是最好的方法。在互联网上输入后不到几个小时,我就意识到有问题,然后你确认。
    • 这就是我们在这里的目的! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2014-01-19
    • 2020-05-28
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多