這是剛才和一個朋友的聊天記錄,希望對大家有幫助:
佘士東 08:41:47
我設計一個接口,其中有些方法很類似,比如取得某個工作對象,有可能需要獲得多個,也有可能獲得其中一個,參數為工作對象的名字、名字列表。
我是用窄接口還是寬接口好,是用一個最大功能的方法還是多個重載方法好?
比如:
IService
public Worker? getWorker(String name);
public Vector<Worker> getWorkers(final Vector<String> names);
我是在接口約束這兩個方法還是只約束最大的那個,使所有的方法都適配為后面這個最大方法,而在接口中去掉第一個方法
楊中科 08:51:57
我認為還是多個重載方法好,主要是考慮方便別人使用
?
楊中科 08:52:31
順便說一句:為什么參數和返回值要用Vector?用List接口不更好嗎?
?
佘士東 08:53:55
如果適用者很有限,大概只有5個左右,實際上使用者也是提供適配功能,比如使用cs結構,web方式,wap方式,sms方式獲得接口服務的適配模塊
佘士東 08:55:04
我的想法是使用Vector它是異步安全的,服務可能是多線程實現的,所以使用Vector返回,不知道有沒有這個必要,有沒有這個作用
楊中科 08:55:12
你說的是什么意思,不太明白。你說getworker方法不是所有實現類都能實現?
?
佘士東 08:56:35
其實這個接口是夾在實現和使用這中間的,使用者實現不同類型服務的適配,實現根據項目不同所要求的業務實現不一樣,實際上這個接口是約束實現要多
佘士東 08:58:08
如果接口方法太多,我怕如果變更會不會陷入變更里面,因為重載多了,其中很多有重復,比如參數列表,如果需要加上用戶驗證,那就都要加,這樣所有實現都要改動一批
楊中科 08:59:41
“我的想法是使用Vector它是異步安全的,服務可能是多線程實現的,所以使用Vector返回,不知道有沒有這個必要,有沒有這個作用 ”,你可以將傳進來的List參數用Collections類中的syn****List方法將List搞成異步安全的,返回的時候你也可以返回Vector類型的,但是返回值要生命成List類型
?
楊中科 09:00:14
要考慮二次開發人員的易用性,大部分人還是傾向于使用List、ArrayList這樣的東西的
?
楊中科 09:01:50
“如果接口方法太多,我怕如果變更會不會陷入變更里面,因為重載多了,其中很多有重復,比如參數列表,如果需要加上用戶驗證,那就都要加,這樣所有實現都要改動一批 ”,還是那句話,不要陷入實現的漩渦中,你的接口是聲明服務用的,不要管實現,怎么實現是實現類的事情,站在二次開發人員的角度來看你必須同時提供getworker和getworkers兩個方法
?
佘士東 09:01:49
原來如此,就是說實際上還是Vector,只不過返回值使用List接口,但是如果他直接轉換成ArrayList使用會不會丟掉原來異步安全特性?因為返回值畢竟只是一個引用,可能其它地方也在用同一個引用
楊中科 09:02:30
不可能轉換為ArrayList的,否則運行的時候會拋ClassCastException
?
佘士東 09:02:46
但是,二次開發實際上是開發實現類,而不是服務調用類
楊中科 09:03:24
哦,也就是二次開發實際上是寫一個實現了你定義的接口的插件???
?
佘士東 09:03:47
對,就是這個意思
楊中科 09:04:57
那也最好提供這兩個接口,這樣你使用這些插件的時候也方便,你可以寫一個抽象類來實現默認的getworker方法,在getworker中調用getworkers方法,這樣二次開發人員一般只要實現getworkers方法就可以了
?
佘士東 09:04:57
但是這個插件是惟一的,使用一個Factory獲得實現
佘士東 09:05:57
哈哈,豁然開朗,寬接口,加上適配抽象父類,就搞定了
楊中科 09:06:26
接口方法是越多用起來越方便
?
佘士東 09:07:10
我只是怕在產生變更的時候,對應的實現也要改動很多,畢竟框架才是初期
楊中科 09:08:29
“對應的實現也要改動很多”,那就看你抽象類的實現水平的,定義接口的時候不要去想實現,只要想接口定義那些方法才夠用就可以,實現和接口不能混
?
楊中科 09:09:00
你可以用各種設計模式來保證不會發生“產生變更的時候,對應的實現也要改動很多”
?
楊中科 09:09:11
但是接口就是接口