使用 Router 思想劃分模塊

無論是《21天學會XXX》仍是《Java編程死象》,基本上全部的編程入門書都會反覆跟你講「強類聚,弱耦合」,我理解模塊劃分中很容易發生模塊之間耦合嚴重。你的代碼運行依賴他的代碼,而後他改了個接口你的代碼就無法運行了。ios

因此...

  • 模塊要能獨立編寫、運行、測試
  • 模塊要減小對外部參數的依賴

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


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

有了 Router 以後:github

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/ABRouterurl

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

//註冊
[[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/three

相關文章
相關標籤/搜索