Проблема ремонтопригодности рефакторинга «fA ()» и & quot; fB () & quot; на & quot; fAB () {вернуть отчет;} & quot;

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

Когда он стал старше, я обнаружил, что удобнее объединять некоторые похожие функции и группировать возвращаемые результаты старых функций как «Отчет».

«Отчет» может быть легко передан как коммуникационный пакет между различными модулями.

Пример 1

Код V1

class B{
float getWidth(C c){
float width= ... (very cheap function about "c") ;
return width;
}
float getHeight(C c){
float height= ... (very cheap function about "c") ;
return height;
}
};

Код V2

class ReportSize { float width; float height; }
class B{
ReportSize getSize(C c){   //<-- grouped
float width = ... ;
float height= ... ;
return ReportSize(width ,height);
}
};

Пример 2

Код V1

class D{
Vector3 calculateNarrow(){ ... }
Vector3 calculateBoard(){ ... }
};

Код V2

class ReportVector3Pair{
Vector3 resultNarrow;
Vector3 resultBoard;
Vector3 get(NARROW_OR_BOARD paramEnum){
//return "resultNarrow" or "resultBoard"}
};
class D{
ReportVector3Pair calculate(){ ... }  //<-- grouped
};

Вопрос

Рефакторинг стоил времени на разработку. Все местоположения кода (до 100 вызывающих абонентов) должны быть вручную реорганизованы для соответствия новой подписи.

Как минимизировать вероятность необходимости рефакторинга позже? Как минимизировать стоимость рефакторинга, если это может произойти в будущем?

1

Решение

Как минимизировать вероятность необходимости рефакторинга позже?

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

Например, вместо написания V2 Bсохранить существующие B и использовать:

class ReportSize { float width; float height; }
ReportSize getReportSize(B const& b, C c)
{
return {b.getWidth(c), b.getHeight(c)}
}

Аналогично, вместо создания V2 Dсохранить существующие D и использовать:

Vector3 calculate(D const& d, NARROW_OR_BOARD paramEnum) {
//return "resultNarrow" or "resultBoard"}

Как минимизировать стоимость рефакторинга, если это может произойти в будущем?

Используйте функции, не являющиеся членами, для расширения функциональности вместо изменения существующих классов.

По словам Скотта Мейерса, использование не-членских функций улучшает инкапсуляцию.

Использование функций, не являющихся членами, для добавления новых функций также следует Открытый / Закрытый Принцип.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]