SlideShare a Scribd company logo
Design Patterns.
Рефакторинг
Немчинский Сергей
2008
Содержание



Что такое рефакторинг кода
Методы рефакторинга










Изменение сигнатуры метода (Change Method Signature)
Инкапсуляция поля (Encapsulate field)
Выделение метода (Extract Method)
Перемещение метода (Move Method)
Замена условного оператора полиморфизмом (Replace
Conditional with Polymorphism)

Проблемы, возникающие при проведении
рефакторинга
Средства автоматизации рефакторинга
Что такое рефакторинг




Рефакторинг или Реорганизация —
процесс полного или частичного
преобразования внутренней структуры
программы при сохранении её внешнего
поведения.
В его основе лежит последовательность
небольших эквивалентных (т.е.,
сохраняющих поведение) преобразований.
Что такое рефакторинг






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

Наиболее употребимые методы рефакторинга:














Изменение сигнатуры метода (Change Method Signature)
Инкапсуляция поля (Encapsulate Field)
Выделение класса (Extract Class)
Выделение интерфейса (Extract Interface)
Выделение локальной переменной (Extract Local Variable)
Выделение метода (Extract Method)
Генерализация типа (Generalize Type)
Встраивание (Inline)
Введение фабрики (Introduce Factory)
Введение параметра (Introduce Parameter)
Подъём поля/метода (Pull Up)
Спуск поля/метода (Push Down)
Замена условного оператора полиморфизмом (Replace Conditional with
Polymorphism)
Изменение сигнатуры метода
(Change Method Signature)






Заключается в добавлении, изменении или
удалении параметра метода.
Изменив сигнатуру метода, необходимо
скорректировать обращения к нему в коде всех
клиентов.
Это изменение может затронуть внешний
интерфейс программы, кроме того, не всегда
разработчику, изменяющему интерфейс,
доступны все клиенты этого интерфейса, поэтому
может потребоваться та или иная форма
регистрации изменений интерфейса для
последующей передачи их вместе с новой
версией программы.
Инкапсуляция поля
(Encapsulate field)




В случае, если у класса имеется
открытое поле, необходимо сделать
его закрытым и обеспечить методы
доступа.
После "Инкапсуляции поля" часто
применяется "Перемещение метода".
Выделение метода (Extract
Method)








Заключается в выделении из длинного и/или требующего
комментариев кода отдельных фрагментов и преобразовании их в
отдельные методы, с подстановкой подходящих вызовов в местах
использования.
В этом случае действует правило: если фрагмент кода требует
комментария о том, что он делает, то он должен быть выделен в
отдельный метод и назван так, чтобы исключить комментарий как
таковой.
Также правило: один метод не должен занимать более чем один
экран (25-50 строк, в зависимости от условий редактирования), в
противном случае некоторые его фрагменты имеют
самостоятельную ценность и подлежат выделению.
Из анализа связей выделяемого фрагмента с окружающим
контекстом делается вывод о перечне параметров нового метода и
его локальных переменных.
Перемещение метода (Move
Method)


Применяется по отношению к
методу, который чаще обращается к
другому классу, чем к тому, в котором
сам располагается.
Замена условного оператора
полиморфизмом (Replace
Conditional with Polymorphism)




Условный оператор с несколькими ветвями
заменяется вызовом полиморфного
метода некоторого базового класса,
имеющего подкласссы для каждой ветви
исходного оператора.
Выбор ветви осуществляется неявно, в
зависимости от того, экземпляру какого из
подклассов оказался адресован вызов.
Замена условного
оператора полиморфизмом


Последовательность действий:












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




проблемы, связанные с базами
данных
проблемы изменения интерфейсов
трудности при изменении дизайна
Средства автоматизации
рефакторинга




Как правило, либо среды разработки
(IDE) либо плагины к ним
Ограниченное количество средств
автоматического рефакторинга для
С++
Итоги




Что такое рефакторинг кода
Методы рефакторинга
Проблемы, возникающие при
проведении рефакторинга

More Related Content

What's hot

Step 3.1
Step 3.1Step 3.1
Step 3.1
DmitryTrushkin
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
Unguryan Vitaliy
 
Щаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. АнтипаттерныЩаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. Антипаттерны
Sergey Nemchinsky
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
Unguryan Vitaliy
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
Unguryan Vitaliy
 
Msu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And UmlMsu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And Umlolegol
 
03 ООП и UML
03 ООП и UML03 ООП и UML
03 ООП и UMLphearnot
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
Unguryan Vitaliy
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
Unguryan Vitaliy
 
Java. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLJava. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLcolriot
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
Unguryan Vitaliy
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
Unguryan Vitaliy
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
Pavel Tsukanov
 
Принципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаПринципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаСергей Шебанин
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
EPAM
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5Technopark
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Интерфейсы
ИнтерфейсыИнтерфейсы
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 

What's hot (20)

Step 3.1
Step 3.1Step 3.1
Step 3.1
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Щаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. АнтипаттерныЩаблоны разработки ПО. Антипаттерны
Щаблоны разработки ПО. Антипаттерны
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
 
Msu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And UmlMsu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And Uml
 
03 ООП и UML
03 ООП и UML03 ООП и UML
03 ООП и UML
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
 
Java. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLJava. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UML
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Принципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайнаПринципы объектно-ориентированного дизайна
Принципы объектно-ориентированного дизайна
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Интерфейсы
ИнтерфейсыИнтерфейсы
Интерфейсы
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 

Similar to Шаблоны разработки ПО. Рефакторинг

ук 03.009.01 2011
ук 03.009.01 2011ук 03.009.01 2011
ук 03.009.01 2011etyumentcev
 
Refactoring
RefactoringRefactoring
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Luxoft Education Center
 
Design Rules And Principles
Design Rules And PrinciplesDesign Rules And Principles
Design Rules And Principles
Evgeniy Krivosheev
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
robete3065
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
Anton Loginov
 
Podprogram
PodprogramPodprogram
Podprogram
LidiKashka
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
Magecom Ukraine
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
Igor Shkulipa
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
Pavel Usachev
 
ВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫ
ВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫ
ВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫ
ITMO University
 
TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...
TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...
TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...
Iosif Itkin
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
Dima Dzuba
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
Igor Shkulipa
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
Constantin Kichinsky
 
Demand management Agile-style
Demand management Agile-styleDemand management Agile-style
Demand management Agile-style
Yehor Churilov
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
geekfamilyrussia
 

Similar to Шаблоны разработки ПО. Рефакторинг (20)

ук 03.009.01 2011
ук 03.009.01 2011ук 03.009.01 2011
ук 03.009.01 2011
 
Refactoring
RefactoringRefactoring
Refactoring
 
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПОЕвгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
 
Design Rules And Principles
Design Rules And PrinciplesDesign Rules And Principles
Design Rules And Principles
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
 
алгоритмы и их виды
алгоритмы и их видыалгоритмы и их виды
алгоритмы и их виды
 
алгоритмы и их виды
алгоритмы и их видыалгоритмы и их виды
алгоритмы и их виды
 
алгоритмы и их виды
алгоритмы и их видыалгоритмы и их виды
алгоритмы и их виды
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
Podprogram
PodprogramPodprogram
Podprogram
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
 
ВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫ
ВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫ
ВНЕСЕНИЕ ИЗМЕНЕНИЙ В АВТОМАТНЫЕ ПРОГРАММЫ
 
TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...
TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...
TMPA-2015 Paper: Автоматизированное создание тест-кейсов для тестирования сое...
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
 
Demand management Agile-style
Demand management Agile-styleDemand management Agile-style
Demand management Agile-style
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
 

More from Sergey Nemchinsky

Как найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететьКак найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететь
Sergey Nemchinsky
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
Sergey Nemchinsky
 
Как пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыКак пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системы
Sergey Nemchinsky
 
Как найти первую работу и не вылететь с нее
Как найти первую работу  и не вылететь с нееКак найти первую работу  и не вылететь с нее
Как найти первую работу и не вылететь с нее
Sergey Nemchinsky
 
Быть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозговБыть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозгов
Sergey Nemchinsky
 
Service oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service BusService oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service Bus
Sergey Nemchinsky
 
Java enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективыJava enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективы
Sergey Nemchinsky
 
Enterprise или на чем стоит мир
Enterprise или на чем стоит мирEnterprise или на чем стоит мир
Enterprise или на чем стоит мир
Sergey Nemchinsky
 
Java enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективыJava enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективы
Sergey Nemchinsky
 
Clean code
Clean codeClean code
Clean code
Sergey Nemchinsky
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
Sergey Nemchinsky
 
Основы Java. 4. Web
Основы Java. 4. WebОсновы Java. 4. Web
Основы Java. 4. Web
Sergey Nemchinsky
 
Основы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkОсновы Java. 4. Collection Framework
Основы Java. 4. Collection Framework
Sergey Nemchinsky
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статика
Sergey Nemchinsky
 
Основы Java. 2. JVM
Основы Java. 2. JVMОсновы Java. 2. JVM
Основы Java. 2. JVM
Sergey Nemchinsky
 
Основы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсыОсновы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсы
Sergey Nemchinsky
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFSergey Nemchinsky
 

More from Sergey Nemchinsky (17)

Как найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететьКак найти первую работу и как с нее не вылететь
Как найти первую работу и как с нее не вылететь
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
Как пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системыКак пишутся и поддерживаются Enterprise системы
Как пишутся и поддерживаются Enterprise системы
 
Как найти первую работу и не вылететь с нее
Как найти первую работу  и не вылететь с нееКак найти первую работу  и не вылететь с нее
Как найти первую работу и не вылететь с нее
 
Быть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозговБыть разработчиком: вызовы, ожидания, перестроение мозгов
Быть разработчиком: вызовы, ожидания, перестроение мозгов
 
Service oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service BusService oriented architecture, Oracle Service Bus
Service oriented architecture, Oracle Service Bus
 
Java enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективыJava enterprise: обучение, работа, перспективы
Java enterprise: обучение, работа, перспективы
 
Enterprise или на чем стоит мир
Enterprise или на чем стоит мирEnterprise или на чем стоит мир
Enterprise или на чем стоит мир
 
Java enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективыJava enterprise: Обучение, работа, перспективы
Java enterprise: Обучение, работа, перспективы
 
Clean code
Clean codeClean code
Clean code
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Основы Java. 4. Web
Основы Java. 4. WebОсновы Java. 4. Web
Основы Java. 4. Web
 
Основы Java. 4. Collection Framework
Основы Java. 4. Collection FrameworkОсновы Java. 4. Collection Framework
Основы Java. 4. Collection Framework
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статика
 
Основы Java. 2. JVM
Основы Java. 2. JVMОсновы Java. 2. JVM
Основы Java. 2. JVM
 
Основы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсыОсновы Java. ООП. Объекты, классы, интерфейсы
Основы Java. ООП. Объекты, классы, интерфейсы
 
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoFШаблоны разработки ПО. Часть 3. Шаблоны GoF
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
 

Шаблоны разработки ПО. Рефакторинг

  • 2. Содержание   Что такое рефакторинг кода Методы рефакторинга        Изменение сигнатуры метода (Change Method Signature) Инкапсуляция поля (Encapsulate field) Выделение метода (Extract Method) Перемещение метода (Move Method) Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism) Проблемы, возникающие при проведении рефакторинга Средства автоматизации рефакторинга
  • 3. Что такое рефакторинг   Рефакторинг или Реорганизация — процесс полного или частичного преобразования внутренней структуры программы при сохранении её внешнего поведения. В его основе лежит последовательность небольших эквивалентных (т.е., сохраняющих поведение) преобразований.
  • 4. Что такое рефакторинг    Поскольку каждое преобразование маленькое, программисту легче проследить за его правильностью, и в то же время, вся последовательность может привести к существенной перестройке программы и улучшению её согласованности и четкости. Рефакторинг позволяет разрабатывать архитектуру программы постепенно, откладывая проектные решения до тех пор, пока не станет более ясной их необходимость. Рефакторинг изначально не предназначен для исправления ошибок и добавления новой функциональности, но помогает избежать ошибок и облегчить добавление функциональности.
  • 5. Методы рефакторинга  Наиболее употребимые методы рефакторинга:              Изменение сигнатуры метода (Change Method Signature) Инкапсуляция поля (Encapsulate Field) Выделение класса (Extract Class) Выделение интерфейса (Extract Interface) Выделение локальной переменной (Extract Local Variable) Выделение метода (Extract Method) Генерализация типа (Generalize Type) Встраивание (Inline) Введение фабрики (Introduce Factory) Введение параметра (Introduce Parameter) Подъём поля/метода (Pull Up) Спуск поля/метода (Push Down) Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism)
  • 6. Изменение сигнатуры метода (Change Method Signature)    Заключается в добавлении, изменении или удалении параметра метода. Изменив сигнатуру метода, необходимо скорректировать обращения к нему в коде всех клиентов. Это изменение может затронуть внешний интерфейс программы, кроме того, не всегда разработчику, изменяющему интерфейс, доступны все клиенты этого интерфейса, поэтому может потребоваться та или иная форма регистрации изменений интерфейса для последующей передачи их вместе с новой версией программы.
  • 7. Инкапсуляция поля (Encapsulate field)   В случае, если у класса имеется открытое поле, необходимо сделать его закрытым и обеспечить методы доступа. После "Инкапсуляции поля" часто применяется "Перемещение метода".
  • 8. Выделение метода (Extract Method)     Заключается в выделении из длинного и/или требующего комментариев кода отдельных фрагментов и преобразовании их в отдельные методы, с подстановкой подходящих вызовов в местах использования. В этом случае действует правило: если фрагмент кода требует комментария о том, что он делает, то он должен быть выделен в отдельный метод и назван так, чтобы исключить комментарий как таковой. Также правило: один метод не должен занимать более чем один экран (25-50 строк, в зависимости от условий редактирования), в противном случае некоторые его фрагменты имеют самостоятельную ценность и подлежат выделению. Из анализа связей выделяемого фрагмента с окружающим контекстом делается вывод о перечне параметров нового метода и его локальных переменных.
  • 9. Перемещение метода (Move Method)  Применяется по отношению к методу, который чаще обращается к другому классу, чем к тому, в котором сам располагается.
  • 10. Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism)   Условный оператор с несколькими ветвями заменяется вызовом полиморфного метода некоторого базового класса, имеющего подкласссы для каждой ветви исходного оператора. Выбор ветви осуществляется неявно, в зависимости от того, экземпляру какого из подклассов оказался адресован вызов.
  • 11. Замена условного оператора полиморфизмом  Последовательность действий:       вначале следует создать базовый класс и нужное число подклассов в некоторых случаях следует провести оптимизацию условного оператора путем "Выделения метода" возможно использование "Перемещения метода", чтобы поместить условный оператор в вершину иерархии наследования выбрав один из подклассов, нужно конкретизировать в нём полиморфный метод базового класса и переместить в него тело соответствующей ветви условного оператора. повторить предыдущее действие для каждой ветви условного оператора заменить весь условный оператор вызовом полиморфного метода базового класса
  • 12. Проблемы, возникающие при проведении рефакторинга    проблемы, связанные с базами данных проблемы изменения интерфейсов трудности при изменении дизайна
  • 13. Средства автоматизации рефакторинга   Как правило, либо среды разработки (IDE) либо плагины к ним Ограниченное количество средств автоматического рефакторинга для С++
  • 14. Итоги    Что такое рефакторинг кода Методы рефакторинга Проблемы, возникающие при проведении рефакторинга

Editor's Notes

  1. {}