- Дайте своим существенным именам
- Дайте своим сущностям осмысленные имена
- Дайте своим сущностям осмысленные имена
- Дайте своим сущностям осмысленные имена
- Извлечение функций для общего кода
- Возможно, вам нужны концепции сигналов / слотов / слушателей / наблюдателей.
edit: Рефакторинг Пример:
Предположим, ваш код:
void Button1_Click() {
function1();
function2();
function3();
function4();
function5();
}
void Button2_Checked(int variable0) {
if (variable0) {
function1();
function2();
} else {
function1();
function2();
function3();
function4();
function5();
}
}
Шаг 0-10 - найти значимые имена для всех, кнопок, функций,
переменные, параметры (переименовывать только одну сущность за раз; я пропустил это ради поста):
void orderPizzaButton_Click() {
requestSalamis();
requestAnchovis();
requestShitake();
requestCheese();
requestGroundMeat();
}
void lasagnePervesityLevel_Changed(int newValue) {
if (newValue <= 0) {
requestCheese();
requestGroundMeat();
} else {
requestSalamis();
requestAnchovis();
requestShitake();
requestCheese();
requestGroundMeat();
}
}
Шаг 11 - найти общность в этих функциях и извлечь новую, многократно используемую функцию
из них:
void orderPizzaButton_Click() {
requestStrangeIngredientCombination();
}
void lasagnePervesityLevel_Changed(int newValue) {
if (newValue <= 0) {
requestCheese();
requestGroundMeat();
} else {
requestStrangeIngredientCombination();
}
}
void requestStrangeIngredientCombination() {
requestSalamis();
requestAnchovis();
requestShitake();
requestCheese();
requestGroundMeat();
}
Шаг 12 - для уточнения поиска по общему коду (воспринимайте это как своего рода нормализацию):
void orderPizzaButton_Click() {
requestStrangeIngredientCombination();
}
void lasagnePervesityLevel_Changed(int newValue) {
if (newValue <= 0) {
requestStandardComponents();
} else {
requestStrangeIngredientCombination();
}
}
void requestStandardComponents() {
requestCheese();
requestGroundMeat();
}
void requestStrangeIngredientCombination() {
requestSalamis();
requestAnchovis();
requestShitake();
requestStandardComponents();
}
Хотя в этом примере кажется, что вы не сохранили код, на самом деле часто будет . Кроме того, сохранение строк кода здесь не главное, дело в том, чтобы уменьшить избыточность, потому что как только вы решите, что ваша извращенная лазанья и странная пицца должны также содержать перец чили и изображение Сильвестра Сталлоне, у вас будет не только дублирование кода, но работа-дублирование ; и что самое важное, в некоторых местах вашего кода есть возможность забыть о новых функциях. Это, конечно, очень плохо и даже критично для бизнеса. Предположим, что ваши клиенты ожидают изображение Сильвестра Сталлоне на своей лазаньи, как обещала ваша маркетинговая кампания, и тогда никто, кто заказал пиццу, никогда не получит такой образ, кроме тех, кто заказал лазанью.
Существует много других рефакторингов и проектов, в зависимости от фактического кода. я действительно
Рекомендую приобрести следующие книги. Кроме того, самое важное правило: один шаг за раз. Сделайте ровно один небольшой рефакторинг, скомпилируйте, протестируйте.
- Рефакторинг - Улучшение дизайна существующего кода Мартина Фаулера из Аддисона-Уэсли
- Стандарты кодирования C ++: 101 правила, руководящие указания и лучшие практики C ++ . Автор: Херб Саттер, Андрей Александреску (C ++ In-Depth series), Addison-Wesley
- Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения Гаммы, Хелма, Джонсона, Влиссидеса (обычно называемого GoF, для Банды четырех), еще раз в Addison-Wesley