J'ai une grande méthode qui ressemble à ceciCommutateurs imbriqués ou fonctions multiples, quel serait un meilleur design?
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;
}
Donc, chaque fois que je dois ajouter un fournisseur je besoin d'ajouter un cas à ce fournisseur, puis répétez le commutateur method
pour ce nouveau fournisseur.
je une suggestion d'un collègue qui devrait être divisé en méthodes pour chaque method
donc par exemple au lieu de ce qui précède, il sera
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;
}
pensées personnelles: Peut-être diviser en plusieurs méthodes le rend plus propre, mais si j'ai besoin de faire des choses communes à PROVIDER_1
(malgré le method
) alors cette chose commune devra être répétée/dupliquée dans chaque méthode (comme indiqué par les //TODO
s dans le code ci-dessus) qui signifie un peu plus de lignes de code, mais c'est un peu hors de propos peut-être.
J'aimerais avoir quelques réflexions à ce sujet, que considéreriez-vous comme plus lisibles et plus propres? De meilleures alternatives?
modifier: Pour donner plus de contexte, je travaille avec les fournisseurs hôteliers .. la plupart des fournisseurs ont 3 méthodes de recherche commun (hotel_code, destination_code, géo) .. à partir de l'extérieur de cette méthode que je peux faire une hotel_code
recherche pour tous les fournisseurs (en bouclant sur le fournisseur enum et en appelant la méthode pour chaque fournisseur avec hotel_code
enum param) ou je peux le faire à un fournisseur spécifique.
Pas sympa, mais faisable sans les instructions switch: Reflection. D'un autre côté, il semble que vous pourriez résoudre ce problème en utilisant l'héritage. Recueillir des informations communes dans la classe de base et mettre la partie de modification dans les classes enfant – ParkerHalo
@ParkerHalo l'utilisation de * réflexion * devrait être le dernier recours pour faire quelque chose en Java! –
@TimothyTruckle C'est pourquoi j'ai écrit _ "Pas gentil" _... C'est aussi pourquoi je n'ai pas fait de réponse et suggéré héritage/polymorphisme – ParkerHalo