<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3</id>
	<title>Рефакторинг - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3&amp;action=history"/>
	<updated>2026-07-17T12:00:51Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=40636&amp;oldid=prev</id>
		<title>imported&gt;Alex NB OT: унификация языковых шаблонов</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=40636&amp;oldid=prev"/>
		<updated>2025-11-15T11:10:47Z</updated>

		<summary type="html">&lt;p&gt;унификация языковых шаблонов&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Рефа́кторинг&amp;#039;&amp;#039;&amp;#039; ({{lang-en|refactoring}}), или &amp;#039;&amp;#039;&amp;#039;перепроекти́рование кода, перерабо́тка кода, равноси́льное преобразова́ние алгоритмов&amp;#039;&amp;#039;&amp;#039; — процесс изменения внутренней структуры [[Компьютерная программа|программы]], не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы&amp;lt;ref&amp;gt;М. Фаулер (2000), стр. 61-62&amp;lt;/ref&amp;gt;{{sfn|Кериевски|2008|loc=Введение}}. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований. Поскольку каждое преобразование маленькое, программисту легче проследить за его правильностью, и в то же время вся последовательность может привести к существенной перестройке программы и улучшению её согласованности и чёткости.&lt;br /&gt;
&lt;br /&gt;
== Цели рефакторинга ==&lt;br /&gt;
Цель рефакторинга — сделать код программы более легким для понимания; без этого рефакторинг нельзя считать успешным.&lt;br /&gt;
&lt;br /&gt;
Рефакторинг следует отличать от [[Оптимизация кода|оптимизации производительности]]. Как и рефакторинг, оптимизация обычно тоже не изменяет поведение программы, а только ускоряет её работу. Но оптимизация часто затрудняет понимание кода, что противоположно рефакторингу&amp;lt;ref name=autogenerated1&amp;gt;М. Фаулер (2000), стр. 62&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, нужно отличать рефакторинг и от [[Реинжиниринг программного обеспечения|реинжиниринга]], который осуществляется для расширения функциональности программного обеспечения. Как правило, крупные рефакторинги предваряют реинжиниринг.&lt;br /&gt;
&lt;br /&gt;
== Причины применения рефакторинга ==&lt;br /&gt;
Рефакторинг нужно применять постоянно при разработке кода. Основными стимулами его проведения являются следующие задачи:&lt;br /&gt;
# необходимо добавить новую функцию, которая недостаточно укладывается в принятое [[Архитектура программного обеспечения|архитектурное решение]];&lt;br /&gt;
# необходимо исправить ошибку, причины возникновения которой сразу не ясны;&lt;br /&gt;
# преодоление трудностей в командной разработке, которые обусловлены сложной логикой программы.&lt;br /&gt;
&lt;br /&gt;
== Признаки плохого кода ==&lt;br /&gt;
{{main|Код с запашком}}&lt;br /&gt;
Во многом при рефакторинге лучше полагаться на интуицию, основанную на опыте. Тем не менее имеются некоторые видимые проблемы в коде ({{lang-en|code smells}}), требующие рефакторинга:&lt;br /&gt;
# [[дублирование кода]];&lt;br /&gt;
# длинный метод;&lt;br /&gt;
# большой класс;&lt;br /&gt;
# длинный список параметров;&lt;br /&gt;
# «жадные» функции — это метод, который чрезмерно обращается к данным другого объекта;&lt;br /&gt;
# избыточные временные переменные;&lt;br /&gt;
# классы данных;&lt;br /&gt;
# несгруппированные данные.&lt;br /&gt;
&lt;br /&gt;
== Рефакторинг кода ==&lt;br /&gt;
В программировании термин &amp;#039;&amp;#039;рефакторинг&amp;#039;&amp;#039; означает изменение исходного кода программы без изменения его внешнего поведения. В [[экстремальное программирование|экстремальном программировании]] и других гибких методологиях рефакторинг является неотъемлемой частью цикла разработки ПО: разработчики попеременно то создают новые тесты и функциональность, то выполняют рефакторинг кода для улучшения его логичности и прозрачности. Автоматическое [[юнит-тестирование]] позволяет убедиться, что рефакторинг не разрушил существующую функциональность.&lt;br /&gt;
&lt;br /&gt;
Рефакторинг изначально не предназначен для исправления [[Программная ошибка|ошибок]] и добавления новой функциональности, он вообще не меняет поведение программного обеспечения&amp;lt;ref name=autogenerated1 /&amp;gt; и это помогает избежать ошибок и облегчить добавление функциональности. Он выполняется для улучшения понятности кода или изменения его структуры, для удаления «мёртвого кода» — всё это для того, чтобы в будущем код было легче поддерживать и развивать. В частности, добавление в программу нового поведения может оказаться сложным с существующей структурой — в этом случае разработчик может выполнить необходимый рефакторинг, а уже затем добавить новую функциональность.&lt;br /&gt;
&lt;br /&gt;
Это может быть перемещение поля из одного [[Класс (программирование)|класса]] в другой, вынесение фрагмента [[исходный код|кода]] из [[Метод (языки программирования)|метода]] и превращение его в самостоятельный метод или даже перемещение кода по иерархии классов. Каждый отдельный шаг может показаться элементарным, но совокупный эффект таких малых изменений в состоянии радикально улучшить проект или даже предотвратить распад плохо спроектированной программы.&lt;br /&gt;
&lt;br /&gt;
== Методы рефакторинга ==&lt;br /&gt;
Наиболее употребимые{{sfn|Кериевски|2008|сс=24-25}} методы рефакторинга:&lt;br /&gt;
* Изменение [[Сигнатура функции|сигнатуры метода]] (change method signature)&lt;br /&gt;
* [[Инкапсуляция (программирование)|Инкапсуляция]] [[Поле данных (информатика)|поля]] (encapsulate field)&lt;br /&gt;
* [[Выделение частного класса данных|Выделение класса]] (extract class)&lt;br /&gt;
* Выделение [[Интерфейс (объектно-ориентированное программирование)|интерфейса]] (extract interface)&lt;br /&gt;
* Выделение локальной переменной (extract local variable)&lt;br /&gt;
* Выделение [[Метод (языки программирования)|метода]] (extract method)&lt;br /&gt;
* Генерализация типа (generalize type)&lt;br /&gt;
* Встраивание (inline)&lt;br /&gt;
* Введение [[фабричный метод (шаблон проектирования)|фабрики]] (introduce factory)&lt;br /&gt;
* Введение [[параметр (программирование)|параметра]] (introduce parameter)&lt;br /&gt;
* Подъём метода (pull up method)&lt;br /&gt;
* Спуск метода (push down method)&lt;br /&gt;
* Переименование метода (rename method)&lt;br /&gt;
* Перемещение метода (move method)&lt;br /&gt;
* Замена условного оператора [[Полиморфизм (программирование)|полиморфизмом]] (replace conditional with polymorphism)&lt;br /&gt;
* Замена [[наследование (программирование)|наследования]] [[делегирование (программирование)|делегированием]] (replace inheritance with delegation)&lt;br /&gt;
* Замена кода типа подклассами (replace type code with subclasses)&lt;br /&gt;
&lt;br /&gt;
=== Изменение сигнатуры метода (change method signature) ===&lt;br /&gt;
Суть изменения сигнатуры метода заключается в добавлении, изменении или удалении параметра метода. Изменив сигнатуру метода, необходимо скорректировать обращения к нему в коде всех клиентов. Это изменение может затронуть внешний интерфейс программы, кроме того, не всегда разработчику, изменяющему интерфейс, доступны все клиенты этого интерфейса, поэтому может потребоваться та или иная форма регистрации изменений интерфейса для последующей передачи их вместе с новой версией программы.&lt;br /&gt;
&lt;br /&gt;
=== Инкапсуляция поля (encapsulate field) ===&lt;br /&gt;
{{Якорь|Инкапсуляция поля}}В случае, если у класса имеется открытое поле, необходимо сделать его закрытым и обеспечить методы доступа. После &amp;#039;&amp;#039;&amp;#039;«Инкапсуляции поля»&amp;#039;&amp;#039;&amp;#039; часто применяется &amp;#039;&amp;#039;&amp;#039;«[[#Перемещения метода|Перемещение метода]]»&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Выделение метода (extract method) ===&lt;br /&gt;
{{Якорь|Выделения метода}}Выделение метода заключается в выделении из длинного и/или требующего комментариев кода отдельных фрагментов и преобразовании их в отдельные методы, с подстановкой подходящих вызовов в местах использования. В этом случае действует правило: если фрагмент кода требует комментария о том, что он делает, то он должен быть выделен в отдельный метод. Также правило: один метод не должен занимать более чем один экран (25-50 строк, в зависимости от условий редактирования), в противном случае некоторые его фрагменты имеют самостоятельную ценность и подлежат выделению. Из анализа связей выделяемого фрагмента с окружающим контекстом делается вывод о перечне параметров нового метода и его локальных переменных.&lt;br /&gt;
&lt;br /&gt;
=== Перемещение метода (move method) ===&lt;br /&gt;
{{Якорь|Перемещения метода}}Перемещение метода применяется по отношению к методу, который чаще обращается к другому классу, чем к тому, в котором сам располагается.&lt;br /&gt;
&lt;br /&gt;
=== Замена условного оператора полиморфизмом (replace conditional with polymorphism) ===&lt;br /&gt;
[[Условный оператор]] с несколькими ветвями заменяется вызовом полиморфного метода некоторого базового класса, имеющего подклассы для каждой ветви исходного оператора. Выбор ветви осуществляется неявно, в зависимости от того, экземпляру какого из подклассов оказался адресован вызов.&lt;br /&gt;
&lt;br /&gt;
Основные принципы:&lt;br /&gt;
* вначале следует создать базовый [[Класс (программирование)|класс]] и нужное число подклассов;&lt;br /&gt;
* в некоторых случаях следует провести оптимизацию условного оператора путём &amp;#039;&amp;#039;&amp;#039;«[[#Выделения метода|Выделения метода]]»&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* возможно использование &amp;#039;&amp;#039;&amp;#039;«[[#Перемещения метода|Перемещения метода]]»&amp;#039;&amp;#039;&amp;#039;, чтобы поместить условный оператор в вершину иерархии наследования;&lt;br /&gt;
* выбрав один из подклассов, нужно конкретизировать в нём полиморфный метод базового класса и переместить в него тело соответствующей ветви условного оператора;&lt;br /&gt;
* повторить предыдущее действие для каждой ветви условного оператора;&lt;br /&gt;
* заменить весь условный оператор вызовом полиморфного метода базового класса.&lt;br /&gt;
&lt;br /&gt;
== Проблемы, возникающие при проведении рефакторинга ==&lt;br /&gt;
* проблемы, связанные с базами данных;&lt;br /&gt;
* проблемы изменения интерфейсов;&lt;br /&gt;
* трудности при изменении дизайна.&lt;br /&gt;
&lt;br /&gt;
== Средства автоматизации рефакторинга ==&lt;br /&gt;
Технические критерии для инструментов рефакторинга:&lt;br /&gt;
* базы данных программы;&lt;br /&gt;
* деревья синтаксического разбора;&lt;br /&gt;
* точность.&lt;br /&gt;
Практические критерии для инструментов рефакторинга:&lt;br /&gt;
* скорость;&lt;br /&gt;
* отмена модификаций;&lt;br /&gt;
* интеграция с другими инструментами.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Шаблоны проектирования]]&lt;br /&gt;
* [[Экстремальное программирование]]&lt;br /&gt;
* [[Просмотр кода]]&lt;br /&gt;
* [[Рефакторинг баз данных]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = [[Фаулер, Мартин|Фаулер М.]], Бек К., Брант Д., Робертс Д., Апдайк У.&lt;br /&gt;
|заглавие = Рефакторинг: улучшение существующего кода&lt;br /&gt;
|оригинал = Refactoring: Improving the Design of Existing Code (2000)&lt;br /&gt;
|тираж = 3000&lt;br /&gt;
|ссылка =&lt;br /&gt;
|издание = &lt;br /&gt;
|место = Спб &lt;br /&gt;
|издательство = Символ-Плюс&lt;br /&gt;
|год = 2009&lt;br /&gt;
|страниц = 432&lt;br /&gt;
|isbn = 5-93286-045-6&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Скотт В. Эмблер, Прамодкумар Дж. Садаладж&lt;br /&gt;
|заглавие = Рефакторинг баз данных: эволюционное проектирование&lt;br /&gt;
|оригинал = Refactoring Databases: Evolutionary Database Design (Addison-Wesley Signature Series)&lt;br /&gt;
|ссылка = https://archive.org/details/refactoringdatab0000ambl&lt;br /&gt;
|издание = &lt;br /&gt;
|место =  М.&lt;br /&gt;
|издательство = [[Вильямс (издательство)|«Вильямс»]]&lt;br /&gt;
|год = 2007&lt;br /&gt;
|страниц = 368&lt;br /&gt;
|isbn = 0-321-29353-3&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
|автор = Джошуа Кериевски&lt;br /&gt;
|заглавие = Рефакторинг с использованием шаблонов&lt;br /&gt;
|оригинал = Refactoring to Patterns&lt;br /&gt;
|издательство = Вильямс&lt;br /&gt;
|год = 2008&lt;br /&gt;
|страниц = 400&lt;br /&gt;
|isbn = 5-93286-045-6&lt;br /&gt;
|ref = Кериевски&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://c2.com/cgi/wiki?WhatIsRefactoring Что такое рефакторинг?]{{ref|en}}&lt;br /&gt;
* [http://www.refactoring.com/ Домашняя страница Мартина Фаулера о рефакторинге]{{ref|en}}&lt;br /&gt;
* {{cite web|url=http://citforum.ru/SE/project/refactor/|author=Ксензов Михаил|title=Рефакторинг архитектуры программного обеспечения: выделение слоев|access-date=2007-11-30|description=Рассматривается один из основных методов рефакторинга архитектуры ПО – выделение слоев, а также его место в контексте рефакторинга архитектуры как многошагового итеративного процесса|url-status=live}}&lt;br /&gt;
* [http://www.softkey.info/reviews/review5449.php Обзор программ для автоматического рефакторинга]&lt;br /&gt;
* [http://blog.symprise.net/2009/04/revisiting-fowlers-video-store-refactoring-code-reengineering-abstractions/ Revisiting Fowler’s Video Store: Refactoring Code, Refining Abstractions]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Программирование]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Alex NB OT</name></author>
	</entry>
</feed>