- •Централизованные системы контроля версий.
- •Основные команды.
- •Конфликты.
- •Просмотр различий.
- •Ответвления и метки.
- •Распределенные системы контроля версий (git, Mercurial, Bazaar).
- •Обычный workflow при работе с локальным репозитарием.
- •Общественные репозитарии.
- •Встраивание метода
- •Встраивание временной переменной
- •Замена временной переменной вызовом метода
- •Введение поясняющей переменной
- •Расщепление временной переменной
- •Удаление присваиваний параметрам
- •Выделение метода.
- •Замена метода объектом методов
- •Замещение алгоритма
- •Перемещение метода.
- •Удаление посредника.
- •Введение внешнего метода.
- •Консолидация дублирующихся условных фрагментов.
- •Удаление управляющего флага.
- •Замена вложенных условных операторов граничным оператором
- •Замена условного оператора полиморфизмом
- •Введение объекта null
- •Введение assert
- •Анти-паттерны в программировании
- •Анти-паттерны в объектно-ориентированном программировании
- •Анти-паттерны в разработке по
- •Методологические анти-паттерны
Консолидация дублирующихся условных фрагментов.
Описание: Один и тот же фрагмент кода присутствует во всех ветвях условного выражения.
Действие: Переместить его за предел выражения.
If (IsSpecialDeal) {
Total = price * 0.8;
Send(); }
Else {
Total = price * 0.9;
Send(); }
-----------------------------------------------
If (IsSpecialDeal)
Total = price * 0.8;
Else
Total = price * 0.9;
Send();
Удаление управляющего флага.
Описание: Имеется переменная-флаг.
Действие: Использовать вместо нее break или return.
For ( int I=0; I<N; I++ ){
If ( !found ){
If ( people[i] == “Don” ){
SendAlert();
found = true; }
}
}
-----------------------------------------------------------------
For ( int I=0; I<N; I++ ){
If ( people[i] == “Don” ){
SendAlert();
break; }
}
}
Замена вложенных условных операторов граничным оператором
Описание: Метод использует условное выражение, из которого не ясен нормальный путь выполнения.
Действие: Использовать граничные условия для всех особых случаев.
Double result;
if ( _isDead ) result = deadAmount();
else If ( _isSeparated ) result = separatedAmount();
else result = NormalPayAmount();
return result;
------------------------------------------------------
if ( _isDead ) return deadAmount();
if ( _isSeparated ) return separatedAmount();
return NormalPayAmount();
Замена условного оператора полиморфизмом
Описание: Есть условный оператор, поведение к-ого зависит от типа объекта.
Действие: Переместить каждую ветвь условного оператора в перегруженный метод подкласса.
Введение объекта null
Введение assert
ЛЕКЦИЯ 12. Рефакторинг. Решение задач обобщения.
ЛЕКЦИЯ 13. Антипаттерны.
Анти-паттерны в программировании
Ненужная сложность (Accidental complexity): Внесение ненужной сложности в решение.
Не путать с «присущей сложностью», которая есть в любом проекте. Ненужная сложность связана не с самой проблемой, а с подходом, выбранным для ее решения.
Действие на расстоянии (Action at a distance): Неожиданное взаимодействие между широко разделёнными частями системы. Данные в одной части программы могут неочевидно изменяться другой частью программы. Например, глобальные переменные.
Накопить и запустить (Accumulate and fire): Установка параметров подпрограмм в наборе глобальных переменных
Слепая вера (Blind faith): Недостаточная проверка (a) корректности исправления ошибки (внедрение нового кода без проверок и тестов) или (b) результата работы подпрограммы (например, процедура сохранения данных на диск не проверяется на успешность)
Лодочный якорь (Boat anchor): Сохранение более не используемой части системы.
Активное ожидание (Busy spin): Потребление ресурсов ЦПУ (процессорного времени) во время ожидания события, обычно при помощи постоянно повторяемой проверки, вместо того, чтобы использовать асинхронное программирование (к примеру, систему сообщений или событий)
Кэширование ошибки (Caching failure): Забывать сбросить флаг ошибки после её обработки
Воняющий подгузник (The Diaper Pattern Stinks): Сброс флага ошибки без ее обработки или передачи вышестоящему обработчику
Инерция кода (Code momentum): Сверхограничение части системы путём постоянного подразумевания её поведения в других частях системы
Кодирование путём исключения (Coding by exception): Добавление нового кода для поддержки каждого специального распознанного случая
Таинственный код (Cryptic code): Использование аббревиатур вместо мнемоничных имён
Жёсткое кодирование (Hard code): Внедрение предположений об окружении системы в слишком большом количестве точек её реализации
Мягкое кодирование (Soft code): Патологическая боязнь жёсткого кодирования, приводящая к тому, что настраивается всё что угодно, при этом конфигурирование системы само по себе превращается в программирование
Поток лавы (Lava flow): Сохранение нежелательного (излишнего или низкокачественного) кода по причине того, что его удаление слишком дорого или будет иметь непредсказуемые последствия
Магические числа (Magic numbers): Включение в алгоритмы чисел без объяснений их смысла
Процедурный код (Procedural code): Когда другая парадигма является более подходящей
Спагетти-код (Spaghetti code): Код с чрезмерно запутанным порядком выполнения
Равиоли-код – лучше (пельмешки – это небольшие слабосцепленные объекты).
Лазанья-код – лучше (слои).
Код «Макароны-по-флотски» - как и Спагетти-код, плохо.
Мыльный пузырь (Soap bubble): Класс, инициализированый мусором, максимально долго притворяется, что содержит какие-то данные
