Пример рефакторинга «извлечение метода» при вычислении ширины колонок


Исходный код

void SimplexIteration::ReWidth()
{  w[-2]=w[0]=Width; w[-1]=5; for(size_t j=1;j<A.size_j();j++) w[j]=Width;
   if (var) for(size_t j=1; j<A.size_j(); j++)
               if (strlen(var[j])>w[j]) w[j]=strlen(var[j]);
}

Что не так в исходном коде

  1. Отличный пример ужасного форматирования кода.
  2. Странные индексы массива -1 и -2.
  3. Короткие названия переменных wAvar, которые ничего не сообщают об их предназначении.
  4. Магический литерал 5, смысл которого неизвестен.
  5. Сомнительная необходимость в двух одинаковых циклах.
  6. Смешаны две разных ответственности (два разных знания): вычисление ширины элемента и присвоение новой ширины всем элементам. Разные ответственности всегда необходимо разделять.

Как отрефакторить исходный код

void SimplexIteration::ReWidth()
{  
   ItemWidths[-2] = w[0] = DefaultWidth; 
   ItemWidths[-1] = 5; 
   for (size_t j = 1; j < Items.size_j(); j++) {
      w[j] = GetItemWidth(j);
   }
}

int SimplexIteration:GetItemWidth(int i)
{
   return ItemContent ? max(DefaultWidth, strlen(ItemContent[i])) : DefaultWidth; 
}

Теория