使用 Router 思想劃分模組

shiweifu發表於2015-03-08

不管是《21天學會XXX》還是《Java程式設計死象》,基本上所有的程式設計入門書都會反覆跟你講「強類聚,弱耦合」,我理解模組劃分中很容易發生模組之間耦合嚴重。你的程式碼執行依賴他的程式碼,然後他改了個介面你的程式碼就沒法執行了。

所以…

  • 模組要能獨立編寫、執行、測試
  • 模組要減少對外部引數的依賴

如果熟悉 Web 開發,會發現框架要工作需要你定義 Router , Router 的作用是一個請求來了,幫這個請求找到對應的模組,接下來怎麼渲染、需要顯示啥,都是 Router 背後的模組的事兒了。試想 Web 開發不用任何框架,也不寫 Router,一個請求過來了,會發生啥:


def matchURL(url): if url.find(`/article`): article = Article() article.articleID = 1000050 article.title = `鈴鐺和花瓶` return article.render() return `No Match`

有了 Router 之後:

urls = (
  `/article/:articleID`, `article`
)

Router 的本質是一個約定、一種傳參規則。

我們遇到的問題不就是 Router 解決的麼?彼此之間就不需要再關心對方的模組做了啥,需要呼叫對方模組的時候,只需要像 Router 要,不需要去關心對方模組到底做了啥,暴露了啥介面,這樣也就解藕了。

其實早在遠古的 Three20 時代就有運用這種思想造出的輪子:
https://github.com/alunny/three20/blob/master/src/TTNavigator.m

然後近代的復刻版有:
https://github.com/gaosboy/urlmanager
https://github.com/Huohua/HHRouter
https://github.com/usepropeller/routable-ios
https://github.com/aaronbrethorst/ABRouter

使用上都是像 Router 註冊 URL 和對應的 Controller,然後在使用的時候忘記 Controller 建立、初始化的存在,直接向 Router 去要:

//註冊
[[HHRouter shared] map:@"/read/:userId/" toControllerClass:ReadController.class];

//呼叫
[[HHRouter shared] matchController:@"/read/1/?tabIndex=3"]

通過這種思想,模組之間的耦合度降低了,因為彼此之間傳遞引數都是通過URL,Controller 也更清晰。

參考資料:
http://pizi.me/86
https://github.com/gaosboy/urlmanager/

相關文章