ConstructiCat Logo
CodeBust.
Browse section ▾

Замена параметра набором специализированных методов.

Problem

Метод разбит на части, каждая из которых выполняется в зависимости от значения какого-то параметра.

Solution

Извлеките отдельные части метода в собственные методы и вызывайте их вместо оригинального метода.

##Example

Before
void setValue(String name, int value) {
  if (name.equals("height")) {
    height = value;
    return;
  }
  if (name.equals("width")) {
    width = value;
    return;
  }
  Assert.shouldNeverReachHere();
}
After
void setHeight(int arg) {
  height = arg;
}
void setWidth(int arg) {
  width = arg;
}

##Why Refactor

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

##Benefits

  • Улучшает читабельность кода. Куда очевидней, что делает метод startEngine() чем setValue("engineEnabled", true).

##How to Refactor

  1. Для каждого варианта исполнения метода создайте свой метод. Запускайте эти методы в зависимости от значения параметра в основном методе.

  2. Найдите все места, где вызывается оригинальный метод. Подставьте туда вызов одного из новых методов в зависимости от передающегося параметра.

  3. Когда не останется ни одного вызова оригинального метода, его можно будет удалить.