轉 介面濫用問題

yunzhongxia發表於2011-08-22

我們知道,大家提倡面向介面程式設計,但凡事都有個度,當濫用,那麼面向介面完全流於形式。

 

一.首先,我們先講一下面向約定程式設計。

企業程式設計中,都有一定的專案分層程式設計規範,如前臺與後臺邏輯之間的聯絡通過定義介面來完成。

正如我們平時使用的 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。如果定義的介面方法過多,重新審視一下,是否應該改進設計

 

 

如果介面的不同實現處理了有相同規則但完全不同的業務,考慮用介面。

如果不同實現處理了相同的事情,但只是拿新的實現替換了舊的實現,建議不要使用介面,直接將原來的實現覆蓋即可。

 

介面的最簡單初衷是要將“做什麼”和“怎麼做”進行分離

 

相關文章