Какие улучшения я могу сделать, чтобы избежать этих Если заявления?


У меня объектной модели автомобилей.

public class Car
{
  private String colour;
  private String make;
  private String yearOfMake;
}

Тогда управляемого Bean-компонента

public Class CarSearchManagedBean
{
  private Car car;

  @EJB
  private CarFacade carFacade;

  public String search()
  {
     this.car =carFacade.find(car);
     .....
  }
}

Тогда у меня в JSF экземпляры facelet с полями ввода, подключенных к объекту автомобиль, путем копирования и кнопка поиска зернах связаны с методом поиска .Нет AJAX и использовать может обеспечить значений любого свойства и, поскольку нет автоматическая чистка может обеспечить значений больше, чем одно свойство, но поиск использует только один.

Тогда прежде чем я покажу CarFacade я покажу CarDao потому что я думаю, что имеет смысл здесь.

public class CarDaoImpl implements CarDao
{
  public Car findByColour(Car car){
  //Calls a webservice method
  }
  public Car findByMake(Car car){
  //Calls a webservice method
  }
  public Car findByYearOfMake(Car car){
  //Calls a webservice method
  }

}

Теперь если CarFacade у меня это некрасиво при условии, что я не знаю как избежать.

public class CarFacade

{
   @EJB
   CarDao carDao;

   public Car find(final Car car)
   {
      Car aCar ;
      //How can improve the design to avoid this If statment
      if (car.getColour()!=null)
      {
       aCar = carDao.findByColour(car)
      }
      else if (car.getMake()!=null)
      {
        aCar = carDao.findByMake(car);
      }
      else
      {
        aCar =carDao.findByYearOfMake(car);
      }
      return aCar;
   }
}


323
3
задан 18 сентября 2011 в 08:09 Источник Поделиться
Комментарии
1 ответ

Вы хотите найти стратегии шаблон.

В вашем конкретном случае, вы, вероятно, собираетесь хотеть сделать что-то вдоль этих линий (примечание - Я никогда не работал с ManagedBeans, поэтому я не знаю, что ключи, которые бросает).

Оставьте ваш автомобиль класса в обычном режиме. Или, может, вы хотите предоставить конкретные типы заданий, если это возможно (поэтому цвет фактического класса, даже если он содержит только актуальные строки - просто так люди не могут назначить принимать значения...).

Ваш CarDAO должно быть несколько экземпляров. Что-то вроде:

public class CarColorFinderDAOImpl implements CarDAO {

public Car find(String colorToFind) {
// search by color here
}
}

Тогда ваш CarFacade на самом деле превращается в нечто подобное:

public class CarFacade {

private Map<String, CarDAO> finderDAO = new HashMap<String, CarDAO>();

public Car find(Sring searchValue, String searchColumn) {

return finderDAO.get(searchColumn).find(searchValue);
}

public void registerFinder(String searchColumn, CarDAO finder) {
finderDAO.put(searchColumn, finder);
}
}

Что тогда вы называете (в основном), как обычно, из своего управляемого компонента.
Обратите внимание, что есть и другие абстракции (например, инкапсуляция searchValue и searchColumn в какой-то FinderContract объекта). Но это быстрый простой, чтобы вы начали.

3
ответ дан 19 сентября 2011 в 06:09 Источник Поделиться