Есть ли формальное определение "рефакторинга"?

Кто-нибудь знает способ определить рефакторинг более формально?

ОБНОВИТЬ.

Рефакторинг - это пара R = (pre; T), где pre - предварительное условие, которому должна удовлетворять программа, а T - преобразование программы.

4 ответа

Это интересный вопрос, который я не рассматривал. Я немного погуглил и придумал эту статью (PDF) о рефакторинге в AOP, которая пытается применить некоторое математическое моделирование к аспектам, чтобы показать, что функциональные аспекты обладают той же гибкостью, что и традиционные аспекты, но с уменьшенной сложностью. Я не читал всю статью, но вы могли бы найти что-то там.

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

Я также нашел эту статью, которая устанавливает алгебру ОО-программирования и выводит некоторые основные законы, а затем использует эти основные правила для получения более сложного рефакторинга.

Интересные вещи. Надеюсь это поможет.

Было бы интересно отметить, что большинство рефакторингов идут парами:

  • Добавить параметр - Удалить параметр
  • Извлечь класс / метод - встроенный класс / метод
  • Поле / метод подтягивания - Поле / метод подтягивания
  • Изменить двунаправленную ассоциацию на однонаправленную - Изменить однонаправленную ассоциацию на двунаправленную
  • ...

Применение двух рефакторингов пары является нулевым преобразованием.

Для пары рефакторинга R, R ':

R '(R (код)) = код

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

поэтому мы не можем просто утверждать, что преобразование рефакторинга T в программе P имеет одинаковые свойства R до и после рефакторинга, но свойства R'реорганизованной программы P' должны быть как минимум эквивалентны R

given program P implies R
refactoring transformation T(P) produces P'
where (P' implies R') and (R' is equivalent to or subsumes R')

мы также можем утверждать, что входы и выходы остаются неизменными или эквивалентными

но, следуя вашему примеру, возможно, мы хотим определить преобразование рефакторинга T как 4 кортежа P,I,O,R, где P - исходная программа, I - входные данные и / или предварительные условия, O - выходные данные и / или постусловие, и R - преобразованная программа, затем утверждают (используя временную логику?), что

P:I -> O

держит до трансформации

T(P) -> R

определяет преобразование и

R:I -> O

держит после трансформации

моя символическая математика ржавая, но это общее направление

это сделало бы хорошую магистерскую диссертацию, кстати

Ну не напрямую, а с точки зрения денег - могу сказать да. Я не могу придумать уравнения по этому вопросу:)

Хорошо написанный код, не сложный (что может быть связано с рефакторингом) может сэкономить время / усилия и, следовательно, деньги.

Другие вопросы по тегам