- •Централизованные системы контроля версий.
- •Основные команды.
- •Конфликты.
- •Просмотр различий.
- •Ответвления и метки.
- •Распределенные системы контроля версий (git, Mercurial, Bazaar).
- •Обычный workflow при работе с локальным репозитарием.
- •Общественные репозитарии.
- •Выделение метода.
- •Встраивание метода
- •Встраивание временной переменной
- •Замена временной переменной вызовом метода
- •Введение поясняющей переменной
- •Расщепление временной переменной
- •Удаление присваиваний параметрам
- •Замена метода объектом методов
- •Замещение алгоритма
- •Перемещение метода.
- •Удаление посредника.
- •Введение внешнего метода.
- •Консолидация дублирующихся условных фрагментов.
- •Удаление управляющего флага.
- •Замена вложенных условных операторов граничным оператором
- •Замена условного оператора полиморфизмом
- •Введение объекта null
- •Введение assert
- •Анти-паттерны в программировании
- •Анти-паттерны в объектно-ориентированном программировании
- •Анти-паттерны в разработке по
- •Методологические анти-паттерны
Выделение метода.
Описание: Есть участок кода, который можно сгруппировать.
Действие: Поместить участок кода в метод, название к-ого отвечает назначению.
string _sname;
string _name;
void PrintInfo() {
PrintBanner();
cout << “surname: ” << _sname; | PrintFullName();
cout << “name: ” << _name; |
}
Проблемы с локальными переменными.
если локальная переменная только читается, то передевать ее параметром
если локальная переменная изменяется, то: если она используется только внутри выделенного кода, то сделать ее локальной в выделяемом методе; иначе необходимо организовать возврат.
Вопрос: если надо вернуть значения нескольких переменных:
организовать возврат значений по отдельности;
если не получается, то данный участок кода лучше не выделять.
Встраивание метода
Описание: Тело метода столь же понятно, как и его название.
Действие: Поместить тело метода в код, к-ый его вызывает, и удалить метод.
bool IsFlagChecked() {
return bFlagChecked;
}
Встраивание временной переменной
Описание: Есть временная переменная, к-ой один раз присваивается простое выражение, и она мешает проведению Выделения метода.
Действие: Заменить этим выражением все ссылки на данную переменную.
…
double basePrice = Order.BasePrice();
return ( basePrice > 1000 );
…
----------------------------------------------------------------
…
return ( Order.BasePrice() > 1000 );
Замена временной переменной вызовом метода
Описание: временная переменная используется для хранения значения выражения.
Действие: преобразовать выражение в метод. Заменить все ссылки на временную переменную вызовом метода. Новый метод может быть использован в других методах.
double basePrice = _quantity * _itemPrice;
if ( basePrice > 1000 ) {…}
-----------------------------------------------------
double BasePrice() {
return _quantity * _itemPrice;
}
if ( BasePrice() > 1000 ) {…}
Введение поясняющей переменной
Описание: имеется сложное выражение.
Действие: поместить результат выражения или его части во временную переменную, имя которой поясняет его назначение.
If (_age >= 18 ) && (_age <= 25) && ( _sex == ‘m’ ) && (!isStudent()) {…}
-----------------------------------------------------
bool bAgeFits = ( (_age >= 18 ) && (_age <= 25) );
bool bSexFits = (_sex == ‘m’);
if ( bAgeFits ) && (bSexFits) && (!isStudent()) {…}
Альтернатива выделению метода, если локальные переменные затрудняют выделение метода.
Расщепление временной переменной
Описание: имеется временная переменная, которой неоднократно присваивается значение, но это не переменная цикла и не для накопления результата.
Действие: создать для каждого присваивания отдельную временную переменную.
double temp = _width * _height;
cout << “Square: ” << temp;
temp = 2 * (_width + _height);
cout << “Perimeter: ” << temp;
-----------------------------------------------------
double square = _width * _height;
…
double perimeter = 2 * (_width + _height);
…
Удаление присваиваний параметрам
Описание: выполняется присваивание параметру.
Действие: заменить это временной переменной.
double discount( double price, int quantity ) {
if ( price > 1000.0 ) { price *= 0.9 }
if ( quantity >= 5 ) { price *= 0.8 }
return price;
}
-----------------------------------------------------
double discount( double price, int quantity ) {
double result = price;
if ( price > 1000.0 ) { result *= 0.9 }
if ( quantity >= 5 ) { result *= 0.8 }
return result;
}