我有,看起來我需要添加一個供應商,我需要的情況下添加到供應商,然後重複method
開關這種新的供應商,此嵌套開關或多個功能,什麼會更好的設計?
List<Hotel> findAvailHotels(Provider provider, Method method, List<String> codes) {
switch (provider) {
case PROVIDER_1:
//TODO Do common things to provider 1
switch (method) {
case HOTEL_CODE:
break;
case DESTINATION_CODE:
break;
case GEO:
break;
}
break;
case PROVIDER_2:
switch (method) {
case HOTEL_CODE:
break;
case DESTINATION_CODE:
break;
case GEO:
break;
}
break;
}
所以每次都像一個大方法。
我從應該被劃分成每個method
方法老鄉的建議,以便例如不是上述情況,這將是
List<Hotel> findAvailHotelsByHotelCode(Provider provider, List<String> codes) {
switch (provider) {
case PROVIDER_1:
//TODO Do common things to provider 1
break;
case PROVIDER_2:
break;
}
List<Hotel> findAvailHotelsByDestinationCode(Provider provider, List<String> codes) {
switch (provider) {
case PROVIDER_1:
//TODO Do common things to provider 1
break;
case PROVIDER_2:
break;
}
List<Hotel> findAvailHotelsByGeo(Provider provider, List<String> codes) {
switch (provider) {
case PROVIDER_1:
//TODO Do common things to provider 1
break;
case PROVIDER_2:
break;
}
個人的想法:也許分成多種方法使得它更加清潔,但如果我需要對PROVIDER_1
(儘管method
)做一些常見的事情,那麼這種常見的事情將需要在每種方法中重複/重複(如上述代碼中的//TODO
所示),這意味着更多的線代碼,但這可能有點不相關。
我想聽聽一些關於這方面的想法,您認爲哪些更具可讀性和更乾淨?任何更好的選擇?
編輯:爲了讓更多的背景,我與酒店供應商工作..大多數供應商具有搜索(hotel_code,DESTINATION_CODE,GEO)的3種常見方法..此方法之外,我可以做一個hotel_code
搜索對於所有提供者(通過遍歷Provider枚舉並調用每個提供者的方法,使用hotel_code
枚舉參數)..或者我可以將它提供給特定的提供者。
不好,但沒有開關語句可行:反射。另一方面,它聽起來像你可以通過使用繼承來解決這個問題。在基類中收集常見信息並將修改部分放在子類中 – ParkerHalo
@ParkerHalo使用* reflection *應該是在Java中做某件事的最後手段! –
@TimothyTruckle這就是爲什麼我寫了_「不好」_...這也是爲什麼我沒有做出答案,並建議繼承/多態 – ParkerHalo