不管是《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/