無論是《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