Объединить два очень похожих метода - PullRequest
0 голосов
/ 08 октября 2011

У меня есть такая теоретическая ситуация:

a форма с

  • 2 входа [атрибуты attr1, attr2 объекта item] **

    <h:inputText id="attr1" value="#{bean.item.attr1}"/> 
    <h:inputText id="attr2" value="#{bean.item.attr2}"/>
    
  • 2 кнопки отправки [поиск по attr1, attr2 в dtb] в файле foo.xhtml:

    <h:commandButton id="search1" action="#{bean.search1}" /> 
    <h:commandButton id="search2" action="#{bean.search2}" />
    

и два очень похожих метода в bean.java:

public void search1(){
    try 
    {
      session = DaoSF.getSessionFactory().openSession();
      Criteria criteria = session.createCriteria(Foo.class);
      criteria.add(Restrictions.like("attr1", item.getAttr1()));
      dataList = criteria.list();
    } 
    catch (Exception e) {...}
  }

  public void search2(){
    try 
    {
      session = DaoSF.getSessionFactory().openSession();
      Criteria criteria = session.createCriteria(Foo.class);
      criteria.add(Restrictions.like("attr2", item.getAttr2()));
      dataList = criteria.list();
    } 
    catch (Exception e) {...}
  }

Есть ли способ объединить эти два метода в один?

ОБНОВЛЕНИЕ: , а также объединить действие команды кнопки?

РЕШЕНИЕ:

private void search(String field, String value)
action="#{bean.search('attr2', bean.item.attr1)}"

Ответы [ 3 ]

2 голосов
/ 08 октября 2011

Просто передайте то, что отличается, как параметр:

public void search(String param, Attr attr){
    try 
    {
      session = DaoSF.getSessionFactory().openSession();
      Criteria criteria = session.createCriteria(Foo.class);
      criteria.add(Restrictions.like(param, attr));
      dataList = criteria.list();
    } 
    catch (Exception e) {...}
  }
2 голосов
/ 08 октября 2011

Вы можете создать третий метод и вызвать его из этих методов:

private void doSearch(String field, String value) {
  session = DaoSF.getSessionFactory().openSession();
  Criteria criteria = session.createCriteria(Foo.class);
  criteria.add(Restrictions.like(field, value));
  dataList = criteria.list();
}

public void search1() {
  doSearch("attr1", item.getAttr1());
}

public void search2() {
  doSearch("attr2", item.getAttr2());
}
2 голосов
/ 08 октября 2011

Конечно: ищите, что то же самое, а что отличается.Вы не предоставляете достаточно информации, чтобы узнать, возможно ли это:

public void search(String sAttr, T attr) {
    try {
        session = DaoSF.getSessionFactory().openSession();
        Criteria criteria = session.createCriteria(Foo.class);
        criteria.add(Restrictions.like(sAttr, attr));
        dataList = criteria.list();
    } catch (Exception e) {...}
}

Если типы атрибутов не совпадают, это немного раздражает, и радость, которую вызывает Java, вызывает уродливость.head.

В какой-то момент вы в конечном итоге получите метод, который принимает Criteria, и вы либо создаете их на лету и передаете их во что-то, что оборачивает try / catch и списокили вы в конечном итоге создаете интерфейс и передаете реализацию тому же самому.

Кстати, IMO, создающий побочные эффекты, такие как установка dataList внутри метода поиска, в конечном итоге приведет к разрывам:вместо этого возвращая список из метода, даже если вы просто установите его для свойства, которое будет передано тому, кто его использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...