badqiu

          XPer
          隨筆 - 46, 文章 - 3, 評論 - 195, 引用 - 0
          數據加載中……

          接口濫用問題

          我們知道,大家提倡面向接口編程,但凡事都有個度,當濫用,那么面向接口完全流于形式。

          一.首先,我們先講一下面向約定編程。

          企業編程中,都有一定的項目分層編程規范,如前臺與后臺邏輯之間的聯系通過定義接口來完成。

          正如我們平時使用的 MVC三層模形,service層,dao層很多都使用接口,那么新來者肯定也要遵守規范,在這三層使用接口。

          就是大家約定成俗都使用接口而已。但請確記,你這不是面向接口編程,而是面向約定編程.

          為什么這樣說呢,請后面聽我道來。

          如果有如下幾個特點,那么面向接口編程是流于形式的。

          1. 定義的接口沒有經過大腦設計

          沒有考慮是否有多實現,完全遵從于大家都是這樣使用,那么可以確認,你現在是面向約定編程。

          2. 接口方法過多

          精心設計的接口,接口方法一般比較精簡,才可能有多個實現類。而我們平時的業務接口,如果沒有將不變及需要變化的接口分離,通通塞在一個大的接口類中,即使有多實現,這種結構也是不合理的,再次確認這種接口完全是遵照某種約定。

          3. 是否符合面向接口的目的

          使用接口的目的是"定義一個接口,可以有多個實現",因為你有可能連這個目的都不符合。

          舉一個例子

          1。如我們有一個 UserDao接口,及一個IbatisUserDaoImpl實現,如果我們有跨數據庫的使用需求(同時支持mysql,oracle),根據ibatis實際的使用需求,我們其實是不會有多個IbatisUserDaoImpl實現的,

          因為實際的效果是,我們通過同一個實現類,只需要在執行查詢時路由至不同的sqlmap及dataSource就行了,而一般不會做 IbatisOracleUserDaoImpl及IbatisMysqlUserDaoImpl這種實現方式。所以說你是使用ibatis的話,一般也是沒有必要使用接口的。

          2。如果你定義的接口UserDao,那么實現類的名稱為 IbatisUserDaoImpl,HibernateUserDaoImpl,那么也是有問題的,既然已經選擇的一個技術框架(Ibatis或者Hibernate),一般不會出來切換技術實現的需求,跨數據庫倒比較實際,如MysqlUserDao,HibernateUserDao.

          二.撇開擴展性,那使用接口又有啥好處呢?

          1. 通過接口比較容易瀏覽所有的接口方法,即沒有繁雜的實現代碼,更易于看懂

          2. 接口不能實例化,避免使用者直接實例化后使用(類就有這種問題,直接實例化使用往往是錯誤的)

          以上兩個好處,也有足夠理由支持我們使用接口。


          三.那么我們應該怎么做?

          1。除了面向約定使用的接口,其它的業務邏輯代碼,如果沒有必要使用接口的就不要使用接口,減少類的數量(太多類看著也很累人的)

          2。如果定義的接口方法過多,重新審視一下,是否應該改進設計

          posted on 2010-10-11 17:33 badqiu 閱讀(2142) 評論(2)  編輯  收藏

          評論

          # re: 接口濫用問題  回復  更多評論   

          個人建議:
          如果接口的不同實現處理了有相同規則但完全不同的業務,考慮用接口。

          如果不同實現處理了相同的事情,但只是拿新的實現替換了舊的實現,建議不要使用接口,直接將原來的實現覆蓋即可。
          2010-10-11 21:11 | @joe

          # re: 接口濫用問題  回復  更多評論   

          接口的濫用也讓我感到非常的反感,在我們的業務邏輯中大部分都是因為接口而接口,忘了定義接口的最簡單初衷是要將“做什么”和“怎么做”進行分離
          2010-10-12 23:16 | 陳于喆

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 怀宁县| 尉氏县| 永嘉县| 高唐县| 威信县| 普安县| 和政县| 汕尾市| 雷波县| 夹江县| 汝南县| 漠河县| 定兴县| 射洪县| 西丰县| 汉沽区| 永德县| 乌拉特前旗| 孝感市| 阿图什市| 顺昌县| 股票| 商都县| 和田县| 嘉定区| 沅江市| 苍溪县| 云林县| 山西省| 商水县| 陆川县| 平顶山市| 当阳市| 南昌市| 宁晋县| 天祝| 营山县| 郯城县| 博野县| 剑阁县| 绥棱县|