2011-08-17 4 views
1

J'ai le problème suivant illustré par le code pseudo ci-dessous (peut-être pas faire beaucoup de sens):Modèle de conception créative pour ce problème?

class Form { 
    boolean loggedOn = false; 
    String id = null; 
    ...get/set shared methods 
} 

class SearchFormA extends Form{ 
    String name = null; 
    String email = null; 

    ...get/set methods 
} 

class SearchFormB extends Form{ 
    String age = null; 
    String gender = null; 

    ...get/set methods 
} 

class Search { 
    public Search(HttpServletRequest request){ 
      String searchMode = (String) request.getSearchMode(); 
     if("0".equals(searchMode)){ 
      SearchFormA formA = new SearchFormA(); 
      formA.setName((String)request.getParameter("name")); 
      formA.setId((String)request.getParameter("id")); 
      ...populate form 
      request.getSession().setAttribute("formA",formA); 
     } 

     if("1".equals(searchMode)){ 
      SearchFormB formB = new SearchFormB(); 
      formB.setAge((String)request.getParameter("age")); 
      formB.setId((String)request.getParameter("id")); 
      ...populate form 
      request.getSession().setAttribute("formB",formB); 
     } 

     ...rest of code 
    } 
} 

Ce que je l'ai fait utilise la réflexion, mais est-il une autre façon de le faire à compiler le temps? J'ai également essayé la méthode Factory, mais les classes SearchFormA et SearchFormB n'ont pas beaucoup en commun.

EDIT: ok, fondamentalement, dans ce cas, j'ai 4-5 searchModes, chaque searchMode a une forme différente. Entre ces formes, ils partagent certains champs similaires. A l'avenir, je pourrais avoir à ajouter 10 searchModes et ça va être répéter beaucoup de remplissage des mêmes champs.

+1

D'où vient la valeur de searchMode? De la demande? – migu

+0

Utilisez simplement la surcharge de méthode pour les différents types et factorisez les choses courantes. Pensez à taper Search; c'est-à-dire 'Search ' – Bohemian

+0

Où utilisez-vous la réflexion? Je ne vois pas une telle utilisation. –

Répondre

0

Qu'est-ce que vous essayez évidemment d'éviter est que dans la méthode de recherche que vous auriez à garder annexant à la structure if (spaghetti code).

Je me sens comme la situation que vous décrivez n'est pas si différente de celle que j'ai écrit this answer pour. Cela signifierait que Stratégie et Modèle (et d'autres) pourraient être utiles ici.

Cheers, Wim

2

Malheureusement votre code est trop "pseudo". Par exemple, on ne sait pas d'où vous prenez searchMode. L'initialisation de vos formulaires spécifiques est également codée en dur. Je crois que dans la vie réelle toutes ces données sont tirées de la classe Data. Donc, je suppose que la classe Data contient le nom, l'âge, l'id. Maintenant, la question est de savoir comment la classe de données contient ces données. Champs spéciaux? Table de hachage générique?

Dans tous les cas, je pense que le fait que vous ayez une sorte de code "général" (classe Search) et que vous ayez à créer des formulaires spéciaux est un mauvais modèle. Vous devriez utiliser un framework MVC qui remplit automatiquement votre formulaire spécifique. Ensuite, lancez votre logique de recherche en utilisant les données du formulaire. Si vous avez une logique partagée pour les deux modes, implémentez-la dans la classe abstract ou dans la classe utilitaire.

1

Je ne vois pas grand chose de mal avec votre approche actuelle. Vous pouvez utiliser un ENUM pour éviter les comparaisons de chaînes comme dans l'exemple suivant:

public enum SearchMode { 
    A { 
     @Override 
     public Form createForm(Data data) { 
      SearchFormA form = new SearchFormA(); 
      form.setName(...); 
      populateCommon(form, data); 
      return form; 
     } 
    }, 
    B { 
     @Override 
     public Form createForm(Data data) { 
      SearchFormB form = new SearchFormB(); 
      form.setAge(...); 
      populateCommon(form, data); 
      return form; 
     } 
    }; 

    public abstract Form createForm(Data data); 

    public void populateCommon(Form form, Data data) { 
     // Set common properties 
     form.setId(...); 
    } 

    public static Form createForm(String searchMode, Data data) { 
     return SearchMode.valueOf(searchMode).createForm(data); 
    } 
} 
Questions connexes