:notebook: Эта статья была заархивирована в: "blog"
Переведено с: https://sourcemaking.com/refactoring/smells/change-preventers
Группа неприятных запахов Change Preventers означает, что когда вам нужно изменить одну часть кода, вы обнаружите, что вам нужно изменить другие места. Это делает разработку программы сложной и дорогой.
- дивергентное изменение
- Параллельная система наследования
- Модификация дробовика
- Расширенное чтение
- использованная литература
дивергентное изменение
发散式变化(Divergent Change)
похожий на霰弹式修改(Shotgun Surgery)
, а на самом деле совсем другое.发散式变化(Divergent Change)
Это означает, что на класс влияют множественные изменения.霰弹式修改(Shotgun Surgery)
Это означает, что несколько изменений вызывают соответствующие модификации нескольких классов.
особенность
Вы обнаружите, что хотите изменить функцию, но вам нужно изменить много несвязанных функций одновременно. Например, если вы хотите добавить новый тип продукта, вам необходимо одновременно изменить функции поиска, отображения и сортировки продуктов.
проблема вызывает
Часто такие расходящиеся модификации происходят из-за плохо структурированного программирования или «программирования с копированием и вставкой».
Решение
- использовать
提炼类(Extract Class)
Поведение разделения классов.
доход
- Улучшить организацию кода
- уменьшить дублирующийся код
Описание метода рефакторинга
Извлечь класс
вопрос
Класс делает больше, чем одну вещь.
решать
Создайте новый класс и переместите соответствующие поля и функции из старого класса в новый класс.
Параллельная система наследования
平行继承体系(Parallel Inheritance Hierarchies)
Фактически霰弹式修改(Shotgun Surgery)
особые обстоятельства.
особенность
Всякий раз, когда вы добавляете подкласс к классу, вы также должны добавить соответствующий подкласс к другому классу. Типичной особенностью этой ситуации является то, что префиксы имен классов или суффиксы имен классов в иерархии наследования абсолютно одинаковы.
проблема вызывает
Первоначально система наследования была небольшой, но по мере добавления новых классов система наследования становилась все больше и ее стало труднее модифицировать.
Решение
- Общая стратегия заключается в том, чтобы экземпляр одной иерархии ссылался на экземпляр другой иерархии. Если вы продолжите использовать
搬移函数(Move Method)
а также搬移字段(Move Field)
, вы можете исключить систему наследования на стороне ссылки.
доход
- лучшая организация кода
- уменьшить дублирующийся код
когда игнорировать
- Иногда наличие параллельных иерархий классов — это просто способ избежать загромождения архитектуры программы. Если вы обнаружите, что попытка исключить параллельное наследование приводит к более уродливому коду, вам следует отменить свои изменения.
Описание метода рефакторинга
Метод перемещения
вопрос
В вашей программе есть функция, которая больше взаимодействует с другим классом, чем с тем, в котором она находится: вызывает последний или вызывается последним.
решать
Создайте новую функцию с аналогичным поведением в классе, на который функция чаще всего ссылается. Превратите старую функцию в чистую функцию делегата или полностью удалите старую функцию.
Переместить поле
вопрос
В вашей программе поле больше используется другим классом, чем классом, в котором оно находится.
решать
Создайте новое поле в целевом классе и измените всех пользователей исходного поля, чтобы вместо этого использовалось новое поле.
Модификация дробовика
霰弹式修改(Shotgun Surgery)
похожий на发散式变化(Divergent Change)
, а на самом деле совсем другое.发散式变化(Divergent Change)
Это означает, что на класс влияют множественные изменения.霰弹式修改(Shotgun Surgery)
Это означает, что несколько изменений вызывают соответствующие модификации нескольких классов.
особенность
Любая модификация потребует небольших модификаций во многих различных классах.
проблема вызывает
Одна ответственность разбита на большое количество классов.
Решение
- использовать
搬移函数(Move Method)
а также搬移字段(Move Field)
чтобы переместить одно и то же поведение из разных классов в отдельный класс. Если нет подходящего класса для хранения функции или поля перемещения, создайте новый класс. - Обычно вы можете использовать
将类内联化(Inline Class)
Поместите ряд связанных моделей поведения в один и тот же класс.
доход
- лучшая организация кода
- уменьшить дублирующийся код
- легче поддерживать
Описание метода рефакторинга
Метод перемещения
вопрос
В вашей программе есть функция, которая больше взаимодействует с другим классом, чем с тем, в котором она находится: вызывает последний или вызывается последним.
решать
Создайте новую функцию с аналогичным поведением в классе, на который функция чаще всего ссылается. Превратите старую функцию в чистую функцию делегата или полностью удалите старую функцию.
Переместить поле
вопрос
В вашей программе поле больше используется другим классом, чем классом, в котором оно находится.
решать
Создайте новое поле в целевом классе и измените всех пользователей исходного поля, чтобы вместо этого использовалось новое поле.
Встроить класс (Inline Class)
вопрос
Определенный класс мало что делает.
решать
Переместите все свойства этого класса в другой класс, а затем удалите исходный класс.
Расширенное чтение
- Плохой запах кода и рефакторинг
- Раздувание кода с неприятным запахом кода
- Злоупотребление объектно-ориентированным кодом
- Барьеры на пути к изменениям: плохой запах кода
- Ненужный запах плохого кода
- Сочетание запахов плохого кода
использованная литература
- Рефакторинг — улучшение дизайна существующего кода - by Martin Fowler
- https://sourcemaking.com/refactoring