協議如何運作

面向對象編程的一大好處就是封裝。可以使用各種行爲來組建應用程序,而這些行爲能分爲不同但又可以起互動的組件,爲這些組件創建對象。

組件可能是一些界面或視圖。其他的組件可能是底層的數據或模型的一部分。還有一些事控制器,用於將視圖和數據關聯起來。但是這些區分並不足夠。當創建更多的應用程序時,你會發現自己一遍又一遍的重複做同樣類型的事情。

例如,存在一系列相關的屏幕:一個屏幕顯示一組數據對象,如Car對象;另一個屏幕顯示某個對象的細節,如car detail視圖;還有一個屏幕讓你編輯該車的屬性,如make或year。

哎喲解決該問題,首選也是最經典的方式,是在對象和相關的屏幕中設置引用。詳情屏幕(detail screen)會有概覽(overview)的引用,屬性編譯器會擁有到詳情屏幕的引用,等等。

然後每個類都實現方法,讓另外的類調用。概覽視圖會有一個方法用於更新一輛汽車。詳情視圖也會有類似的目的方法。詳情視圖有一個方法用於更新字段。很快到最後,代碼會像一碗意大利麪,充斥着各種相互關聯的方法、屬性和屏幕。某個地方的改動會對其他地方造成重要的影響。代碼不靈活而且難以維護。更糟糕的是,類開始明確針對它們所要顯示的數據,所以用的一組類以及界面流。這些都不可重用。

使用協議是修復該問題的好方法。協議定義一種類型的對象如何與另一種類型的對象交流:我需要何種信息?我將發送何種信息和狀態?以及我能實現何種行爲?協議也可以具體致命,代理必須實現哪兒些消息以及哪兒些消息是可選的。

使用協議允許清理這碗意大利麪,並且很容易做出變更,因爲你知道具體哪兒個類、屏幕或對象如何與另一個交流。可以更改協議的供給者或使用者的整個實現部分的代碼,只要他們都遵循該協議即可,並且隨着深入,你會開始將常見的需求抽取爲類,從而能能在多個項目中重用。

使用協議讓這些變得更簡單,尤其是在你注意到對象是協議的代理,或是協議的實現而非只是協議時。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章