Можем ли мы провести рефакторинг этих методов? - PullRequest
3 голосов
/ 19 апреля 2011

У меня есть классы с методами, реализованными следующим образом:

void methodOne() {
    try {
        getHelper().doActionOne();
    } catch ( Exception ex ) {
        throw new CustomException( ex );
    }
}

void methodTwo() {
    try {
        getHelper().doActionTwo();
    } catch ( Exception ex ) {
        throw new CustomException( ex );
    }
}

void methodThree() {
    try {
        getHelper().doActionThree();
    } catch ( Exception ex ) {
        throw new CustomException( ex );
    }
}


void methodFour;
void methodFive;
...

Есть ли лучший способ сделать это?Эти коды делают меня неудобным.

РЕДАКТИРОВАТЬ: Извините за неясный пример.Я реализую класс GenericDao с Hibernate, реальный код выглядит примерно так:

class GenericDaoImpl<T, PK> {

    PK create( T object ) {
        try {
           getSession().save( object );
        } catch( Exception ex ) {
           throw new DataAccessLayerException( ex );// wrap any exception to my exception
        }
    }

   T read( PK id ) {
       try {
           getSession().get( T.class, id );
       } catch ( Exception ex ) {
           throw new DataAccessLayerException( ex );
       }

   }

  void update( T object );
  void delete( T object );

}

Ответы [ 3 ]

6 голосов
/ 19 апреля 2011

Просто базовое предложение, но вы можете преобразовать его в нечто вроде «Командного образца». Этот шаблон позволяет вам инкапсулировать некоторые функциональные возможности в класс, который реализует единственный метод. Класс может быть создан и передан в другой класс для выполнения, и класс executor не должен знать или заботиться о том, что он делает, ему просто нужно вызвать execute (). Если действия требуют аргументов, классы, реализующие Command, могут включать поля / свойства, которые могут быть установлены в конструкторе или стандартными установщиками свойств.

Создайте такой интерфейс (у меня Java ржавый, так что это может быть неверный синтаксис на 100%):

public interface Command
{
    public void execute();
}

public class ActionOne implements Command
{
    public void execute()
    {
        // do actionOne...
    }
}

public class ActionTwo implements Command
{
    public void execute()
    {
        // do actionTwo...
    }
}

// etc. for more actions

Затем создайте класс, который выполняет действие, и вызывающему коду просто нужно передать правильный класс реализации Command.

public class Executor
{

    public void executeCommand(Command command)
    {
        try
        {
            // Put any boilerplate code here (logging, auditing, etc.)
            command.execute();
        }
        catch (Exception ex)
        {
            // Put general error handling code here.  If you're just catching and rethrowing, consider not catching the Exception at this level.  If it's a checked exception, add a throws clause to the method.
            throw new CustomException();
        }
    }
}
1 голос
/ 19 апреля 2011

Да, вы всегда можете рефакторинг кода.Единственная проблема заключается в том, собираетесь ли вы проводить рефакторинг, чтобы сделать его лучше или хуже.Намек на то, что этот код странный, является хорошим намеком на то, что его можно сделать намного лучше.

Это выглядит как хороший кандидат на полиморфизм.Вместо пяти разных методов попробуйте пять разных классов с одним общим методом.Интерфейс свяжет все это вместе.

public interface DoIt {
  public void doIt();
}

public class One implements DoIt {
  public void doIt() {
    // code which was previously in getHelper.doActionOne();
  }
}

public class Two implements DoIt {
  public void doIt() {
    // code which was previously in getHelper.doActionTwo();
  }
}

...

public class Five implements DoIt {
  public void doIt() {
    // code which was previously in getHelper.doActionFive();
  }
}

Теперь единственное, что нужно - это создать правильный класс для ситуации и вызвать его метод doIt().

0 голосов
/ 20 апреля 2011

Это средство предоставляется Spring Framework вместе со многими другими.Во-первых, у него есть определенный HibernateTemplate, который сопоставляет каждое исключение, специфичное для Hibernate, с неконтролируемым связанным исключением Spring.Во-вторых, он предоставляет службу AOP для преобразования исключений на уровне метода, так что вы можете указать сопоставления один раз и применять их одинаково для нескольких служб.

Хотя я бы не использовал Spring только для этой единственной функции, он имеетогромные преимущества для создания приложений, и я продолжаю использовать его в течение многих лет.

...