Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы по ЭСТП.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
399.63 Кб
Скачать

34. Понятие рефакторинга. Рефакторинги «Метод в объект», «Добавление параметра», «Параметр метода в параметр конструктора».

В рамках TDD рефакторинг1 используется интересным образом. Обычно ре­факторинг не может изменить семантику программы ни при каких условиях. В рамках TDD условия семантики формулируются при помощи тестов, которые уже срабатывают. Таким образом, и рамках TDD мы можем, например, заменить константы переменными и с чистой совестью назвать эту процедуру рсфакторин- гом, потому что набор срабат ывающих тестов при этом не изменился. Однако на­бор срабатывающих тестов может состоять всего из одного теста. Возможно, семантика программы должна описываться большим количеством тестов. Воз­можно также, что некоторые из этих потенциальных тестов в результате выпол­нения ^факторинга перестали бы срабатывать, если бы они существовали. Одна­ко их пег. поэтому мы о них не беспокоимся.

Отсюда следует, что на программиста, работающею о стиле TDD, возлагается важная обязанность: он должен иметь лопаточное количество тестов» описываю­щих семантику программы. Достаточное по крайней мере настолько, настолько он может судить на момент завершения работы над кодом. Необходимо понимать, что рефакторинг выполняется не с учетом всех существующих тестов, а с учетом всех шзможнмх гсстов. Фраза наподобие: «Я знаю, что там была проблема, но все тесты сработали, поэтому я посчитал код завершенным и интегрировал сто и сис­тему», — не может считаться оправданием. Пишите больше тестов.

METHOD OBJECT (МЕТОД В ОБЪЕКТ)

Каким образом лучше всего реализовать сложный метод, использующий не­сколько параметров и локальных переменных? Преобразуйте метод в отдельный объект.

Как

  1. Создайте класс с таким же количеством параметров, как и оригинальный метод.

  2. Сделайте локальные переменные метода экземплярными переменными но­вого класса.

  3. Определите в новом классе метод с именем run(). Тело этого метода будет таким же, как и тело оригинального метода.

  4. В оригинальном методе создайте новый объект и обратитесь к методу run() этого объекта.

Зачем

Объекты-методы полезны в качестве подготовительного этапа перед добавлени­ем в систему абсолютно нового вида внутренней логики. Например, представьте, что для вычисления обшего денежного потока используется несколько разных методов, позволяющих учесть в вычислении несколько разных компонентов об­щего денежного потока. Вначале вы можете создать объект-метод, вычисляющий общий денежный поток первым способом. Затем вы можете описать следующий способ вычислений при помощи тестой меньшего масштаба. После этого добавле­ние в программу нового способа вычислений будет несложным делом.

Объекты-методы также позволяют упростить код. в отношении которого не­удобно использовать Extract Method (Выделение метода). В некоторых ситуациях вы вынуждены иметь дело с блоком кода» который работает с обширным набором временных переменных и параметров, и каждый раз. когда вы пытаетесь выде­лить хогя бы часть этого кода в отдельный метод, вы вынуждены переносить в но­вый метод пять или шесть временных переменных и параметров. Результирую­щий выделенный метод выглядит ничем не лучше, чем изначальный код, так как его сигнатура слишком длинна. В результате создания обьекга-метода вы полу­чаете в свое распоряжение новое пространство имен, в рамках которого вы може­те извлекать методы, без необходимости передачи и них каких-либо параметров.

ADD PARAMETER (ДОБАВЛЕНИЕ ПАРАМЕТРА)

Каким образом можно добавить в метод новый параметр?

Как

  • Если метод входит в состав интерфейса, вначале добавьте параметр в ин­терфейс.

  • Добавьте параметр.

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

Зачем

Добавление параметра зачастую связано с расширением функциональности. Чтобы обеспечить срабатывание первою теста, вы написали код без параметра, однако далее условия изменились, и для корректного выполнения вычислений нам необ­ходимо принять во внимание дополнительные данные.

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

METHOD PARAMETER TO CONSTRUCTOR PARAMETER (ПАРАМЕТР МЕТОДА В ПАРАМЕТР КОНСТРУКТОРА)

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

Как

  1. Добавьте параметр в конструктор.

  2. Добавьте в класс экэемплярную переменную с тем же именем, что и пара­метр.

  3. Установите значение переменной в конструкторе.

  4. Одну за другой преобразуйте ссылки parameter в ссылки this.parameter.

  5. Когда в коде не останется ни одной ссылки на параметр, уладите параметр из метода.

  6. После этого удалите ненужный теперь префикс this.

  7. Присвойте переменной подходящее имя.

Зачем

Если вы передаете один к тот же параметр нескольким разным методам одного и того же объекта, вы можете упростить API, передав параметр только один раз (удалив дублирование). Напротив, если вы обнаружили, что некоторая экземп- лярная переменная используется только в одном методе объекта, вы можете вы­полнить обратный рефакторинг.