![](/user_photo/_userpic.png)
Ответы на билеты
.pdf![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c411x1.jpg)
Возвратное проектирование (Round trip design)
Синхронизация рабочих продуктов и генерируемого исходного кода. Трационая схема:
Примеры программ CDPro и Borland Together.
Реинжиниринг
Реинжиниринг ПО – перепроектирование программных систем. Две фазы:
○обратный
○прямой
Обратный – процесс анализа существующей программы с целью редокументирования, описания функциональности и определения технических решений, которые были сделаны.
Прямой – создание нового ПО, с использованием части решений старого.
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c413x1.jpg)
4. Рефакторинг, цели и правила применения. Каталог рефакторингов, классификация, примеры применения
Рефакторинг – процесс изменения внутренней структуры ПО без изменения функциональности. Метод улучшения программы.
Почему нужно?
●рефакторинг улучшает процесс разработки ПО
●рефакторинг делает ПО лучше познаваемым
●позволяет находить ошибки
●улучшает стиль программирования
●снижает время разработки
Когда этим заниматься?
●при добавлении новой функциональности
●когда исправляется ошибка
●при обзоре кода
Где?
●дублирование кода
●длинный метод
●большой класс
●длинный список параметров
●комментарий
●lazy class “ленивый” класс
●“пулеметная хирургия” (?)
Большой хороший каталог рефакторинга:https://refactoring.guru/ru/catalog
Классификация:
1.Составление методов
○Извлечение метода
○Встраивание метода
○Извлечение переменной
○Встраивание переменной
○Замена переменной вызовом метода
○Расщепление переменной
○Удаление присваиваний параметрам
○Замена метода объектом методов
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c414x1.jpg)
○Замена алгоритма
Пример: Извлечение метода
Проблема
У вас есть фрагмент кода, который можно сгруппировать.
void printOwing() {
printBanner();
System.out.println("name: "+ name);
System.out.println("amount: "+ getOutstanding());
}
Решение
Выделите участок кода в новый метод (или функцию) и вызовите этот метод вместо старого кода.
void printOwing() {
printBanner();
printDetails(getOutstanding());
}
void printDetails(double outstanding) {
System.out.println("name: "+ name);
System.out.println("amount: "+ outstanding);
}
2.Перемещение функций между объектами
○Перемещение метода
○Перемещение поля
○Извлечение класса
○Встраивание класса
○Сокрытие делегирования
○Удаление посредника
○Введение внешнего метода
○Введение локального расширения
Пример:
Извлечение класса
Проблема Один класс работает за двоих.
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c415x1.jpg)
Решение Создайте новый класс, переместите в него поля и методы, отвечающие за определённую функциональность.
3.Организация данных
○Самоинкапсуляция поля
○Замена простого поля объектом
○Замена значения ссылкой
○Замена ссылки значением
○Замена полямассива объектом
○Дублирование видимых данных
○Замена однонаправленной связи двунаправленной
○Замена двунаправленной связи однонаправленной
○Замена магического числа символьной константой
○Инкапсуляция поля
○Инкапсуляция коллекции
○Замена кодирования типа классом
○Замена кодирования типа подклассами
○Замена кодирования типа состоянием/стратегией
○Замена подкласса полями
Пример:
Проблема
Есть много одинаковых экземпляров одного класса, которые можно заменить одним объектом.
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c416x1.jpg)
Решение
Превратите одинаковые объекты в один объектссылку.
4.Упрощение условных выражений
○Разбиение условного оператора
○Объединение условных операторов
○Объединение дублирующихся фрагментов в условных операторах
○Удаление управляющего флага
○Замена вложенных условных операторов граничным оператором
○Замена условного оператора полиморфизмом
○Введение Nullобъекта
○Введение проверки утверждения
Пример:
Разбиение условного оператора
Проблема
У вас есть сложный условный оператор (ifthen/elseилиswitch). if (date.before(SUMMER_START) || date.after(SUMMER_END)) { charge = quantity * winterRate + winterServiceCharge;
}
else {
charge = quantity * summerRate;
}
Решение
Выделите в отдельные методы все сложные части оператора: условие, thenи else.
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c417x1.jpg)
if (notSummer(date)) {
charge = winterCharge(quantity);
}
else {
charge = summerCharge(quantity);
}
5.Упрощение вызовов методов
○Переименование метода
○Добавление параметра
○Удаление параметра
○Разделение запроса и модификатора
○Параметризация метода
○Замена параметра набором специализированных методов
○Передача всего объекта
○Замена параметра вызовом метода
○Замена параметров объектом
○Удаление сеттера
○Сокрытие метода
○Замена конструктора фабричным методом
○Замена кода ошибки исключением
○Замена исключения проверкой условия
Пример:
Проблема
Методу не хватает данных для осуществления какихто действий.
Решение
Создайте новый параметр, чтобы передать эти данные.
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c418x1.jpg)
6.Решение задач обобщения
○Подъём поля
○Подъём метода
○Подъём тела конструктора
○пуск метода
○Спуск поля
○Извлечение подкласса
○Извлечение суперкласса
○Извлечение интерфейса
○Свёртывание иерархии
○Создание шаблонного метода
○Замена наследования делегированием
○Замена делегирования наследованием Пример:
Подъём поля Проблема
Два класса имеют одно и то же поле.
Решение
Переместите поле в суперкласс, убрав его из подклассов.
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c419x1.jpg)
5. Шаблоны проектирования, цели, правила применения Использовал:
https://ru.wikipedia.org/wiki/Шаблон_проектирования lektsii2.djvu
Страуструп (страница 377 ...) http://www.williamspublishing.com/PDF/5845903017/part3.pdf https://habrahabr.ru/post/210288/
Шаблон проектирования— повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
Цели: шаблоны обеспечивают простой способ введения разного рода общих концепций и простые методы их совместного использования. Получающиеся в результате классы и функции сопоставимы по времени выполнения и требованиям к памяти с написанными вручную специализированным кодом. Шаблоны обеспечивают непосредственную поддержку обобщенного программирования.
Применениемногих шаблонов проектирования позволяет также создавать более модифицируемое и гибкое программное обеспечение. Причина состоит в том, что эти решения уже испытаны временем. Поэтому использование шаблонов позволяет создавать структуры, допускающие их модификацию в большей степени, чем это возможно в случае решения, первым пришедшего на ум.
Типы шаблонов проектирования
1.Основные
2.Порождающие шаблоны шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.
●Абстрактная фабрика
●Строитель
●Фабричный метод
![](/html/16379/253/html_KvTa9YvstM.noAL/htmlconvd-la72c420x1.jpg)
●Прототип
●Одиночка
3.Структурные шаблоныопределяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
●Адаптер
●Мост
●Компоновщик
●Декоратор
●Фасад
●Приспособленец
●Заместитель