2012-02-08 43 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