Есть ли формальное определение "рефакторинга"?
Кто-нибудь знает способ определить рефакторинг более формально?
ОБНОВИТЬ.
Рефакторинг - это пара 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
держит после трансформации
моя символическая математика ржавая, но это общее направление
это сделало бы хорошую магистерскую диссертацию, кстати
Ну не напрямую, а с точки зрения денег - могу сказать да. Я не могу придумать уравнения по этому вопросу:)
Хорошо написанный код, не сложный (что может быть связано с рефакторингом) может сэкономить время / усилия и, следовательно, деньги.