
- •1. Основні терміни технології програмування
- •2. Класифікація програмного забезпечення
- •Поняття життєвого циклу розробки програмного забезпечення.
- •Етапи розробки
- •Базові моделі розробки програмних продуктів.
- •Вимоги до методології та технології розробки пп
- •Каскадна модель
- •3. Модель прототипування програмного продукту
- •4. Спіральна модель
- •5. Модель rad
- •6. Модель екстремального програмування (xp)
- •7. Модель msf (Microsoft Solutions Framework)
- •Принципи й види налагодження.
- •Аксіоми налагодження.
- •Автономне налагодження модуля.
- •Комплексне налагодження програмного засобу.
- •Інструменти розробки програмних засобів.
- •Інструментальні середовища розробки й супроводу програмних засобів.
- •Інструментальні середовища програмування.
- •Поняття комп'ютерної технології розробки програмних засобів і її робочі місця.
- •Інструментальні системи технології програмування.
- •Приклад реалізації класу Log.
- •Розробка програмного продукту з двома потоками
- •Визначення крапок контролю програмного продукту.
- •Визначення кількості викликів
- •Визначення ступеня покриття
- •Фундаментальні проблеми профілювання.
- •Причини рефакторингу
- •Підстави для проведення рефакторингу
- •Прийоми рефакторингу
- •Автоматизований рефакторинг
- •1. Принципи повторного використання елементів програм
- •2. Створення шаблонів форм у вигляді файлів
- •3. Використання шаблонів форм у новому проекті
- •4. Збереження шаблонів форм в депозитарії
- •5. Використання шаблонів форм із депозитарію
- •Шаблони класів на мові програмування с#.
- •Приклади шаблонів (класів шаблонів).
- •1. Використання підпрограм в оброблювачах подій
- •2. Звертання до активного компонента не за ім’ям
- •2. Обробка групи компонентів
- •4. Обробка компонентів як масиву
- •5. Сортування даних у компонентах
- •1. Принципи модульного програмування
- •2. Принцип «приховання даних»
- •3. Поняття модуля в Object Pascal
- •4. Структура модульного файлу
- •5. Створення модуля в Object Pascal
- •6. Створення модуля з переліком стандартних діалогів
- •7. Використання текстових констант у модулях
- •8. Створення підпрограм для обробки компонентів
- •1. Поняття dll
- •2. Створення dll бібліотеки в Delphi
- •3. Внесення форм в dll
- •4. Використання dll бібліотеки
- •Питання для самоконтролю
- •Використання регулярних виразів у програмах.
- •1. Призначення зовнішніх компонентів
- •2. Установка й видалення зовнішніх компонентів
- •3. Установка й видалення бібліотек компонентів
- •4. Запуск зовнішніх програм і файлів
- •Питання для самоконтролю
- •1. Загальні принципи технології com
- •2. Робота з com-сервером Microsoft Word
- •Робота з документами в Microsoft Word
- •Використання шаблону для формування документів
- •Робота з таблицями
- •Вставка малюнків і їх форматування
- •1. Операції з Com-Сервером Microsoft Excel
- •Робота із книгами в Microsoft Excel
- •Робота з аркушами книги в Microsoft Excel
- •Використання шаблону для формування книги
- •Формування таблиці
- •6. Форматування чарунок
- •Види довідкових систем
- •Інші засоби підтримки користувача
- •2.Формати довідників
- •3.Створення довідки у форматі html Help
- •4.Створення контекстної довідки
- •5.Інтеграція довідкового файлу в додаток
- •Перелік шаблонів, що породжують
- •Перелік структурних шаблонів
- •Перелік шаблонів поведінки
- •Призначення патерну Singleton
- •Реалізація патерну Singleton
- •Результати застосування патерну Singleton
- •Призначення патерна Observer
- •Постановка проблеми, що вирішується за допомогою патерна
- •Структура патерна Observer
- •Приклад патерна Observer
- •Реалізація патерна Observer
- •Реалізація патерну Observer: до та після
- •Призначення патерну Strategy
- •Опис патерну Strategy
- •Реалізація патерну Strategy
- •Призначення патерна Factory Method
- •Опис патерну Factory Method
- •Реалізація патерна Factory Method
Структура патерна Observer
Subject представляє головну (незалежну) абстракцію. Observer являє змінювану (залежну) абстракцію. Суб'єкт сповіщає спостерігачів про свої зміни, на що кожен спостерігач може запросити стан суб'єкта.
UML-діаграма класів паттерна Observer
Приклад патерна Observer
Патерн Observer визначає залежність "один-ко-многим" між об'єктами так, що при зміні стану одного об'єкта всі залежні від нього об'єкти повідомляються і оновлюються автоматично. Деякі аукціони демонструють цей патерн. Кожен учасник має картку з цифрами, яку він використовує для позначення пропонованої ціни (ставки). Ведучий аукціону (Subject) починає торги і спостерігає, коли хто-небудь піднімає картку, пропонуючи нову більш високу ціну. Ведучий приймає заявку, про що тут же сповіщає всіх учасників аукціону (Observers).
Приклад паттерна Observer
Використання паттерна Observer
Проведіть відмінності між основною (або незалежною) і додаткової (або залежної) функціональностями.
Змоделюйте "незалежну" функціональність за допомогою абстракції "суб'єкт".
Змоделюйте "залежну" функціональність за допомогою ієрархії "спостерігач".
Клас Subject пов'язаний тільки c базовим класом Observer.
Клієнт налаштовує кількість і типи спостерігачів.
Спостерігачі реєструються у суб'єкта.
Суб'єкт сповіщає всіх зареєстрованих спостерігачів.
Суб'єкт може "проштовхнути" інформацію в спостерігачів, або спостерігачі можуть "витягнути" необхідну їм інформацію від об'єкта Subject.
Особливості паттерна Observer
Патерни Chain of Responsibility, Command, Mediator і Observer показують, як можна розділити відправників і одержувачів запитів з урахуванням своїх особливостей. Chain of Responsibility передає запит відправника по ланцюжку потенційних одержувачів. Command визначає зв'язок - "оправітель-одержувач" за допомогою підкласу. В Mediator відправник і одержувач посилаються один на одного побічно, через об'єкт-посередник. В паттерне Observer зв'язок між відправником та одержувачем виходить слабкою, при цьому число одержувачів може конфигурироваться під час виконання.
Mediator і Observer є конкуруючими патернами. Якщо Observer розподіляє взаємодія c допомогою об'єктів "спостерігач" і "суб'єкт", то Mediator використовує об'єкт-посередник для інкапсуляції взаємодії між іншими об'єктами. Ми виявили, що легше зробити повторно використовуваними Спостерігачів і Суб'єктів, ніж Посередників.
Mediator може використовувати Observer для динамічної реєстрації колег та їх взаємодії з посередником.
Реалізація патерна Observer
Реалізація патерна Observer по кроках
Змоделюйте "незалежну" функціональність за допомогою абстракції "суб'єкт".
Змоделюйте "залежну" функціональність за допомогою ієрархії "спостерігач".
Клас Subject пов'язаний тільки c базовим класом Observer.
Спостерігачі реєструються у суб'єкта.
Суб'єкт сповіщає всіх зареєстрованих спостерігачів.
Спостерігачі "витягують" необхідну їм інформацію від об'єкта Subject.
Клієнт налаштовує кількість і типи спостерігачів.
#include <iostream> #include <vector> using namespace std;
// 1. "Независимая" функциональность class Subject { // 3. Связь только базовым классом Observer vector < class Observer * > views; int value; public: void attach(Observer *obs) { views.push_back(obs); } void setVal(int val) { value = val; notify(); } int getVal() { return value; } void notify(); };
// 2. "Зависимая" функциональность class Observer { Subject *model; int denom; public: Observer(Subject *mod, int div) { model = mod; denom = div; // 4. Наблюдатели регистрируются у субъекта model->attach(this); } virtual void update() = 0; protected: Subject *getSubject() { return model; } int getDivisor() { return denom; } };
void Subject::notify() { // 5. Извещение наблюдателей for (int i = 0; i < views.size(); i++) views[i]->update(); }
class DivObserver: public Observer { public: DivObserver(Subject *mod, int div): Observer(mod, div){} void update() { // 6. "Вытягивание" интересующей информации int v = getSubject()->getVal(), d = getDivisor(); cout << v << " div " << d << " is " << v/d << '\n'; } };
class ModObserver: public Observer { public: ModObserver(Subject *mod, int div): Observer(mod, div){} void update() { int v = getSubject()->getVal(), d = getDivisor(); cout << v << " mod " << d << " is " << v%d << '\n'; } };
int main() { Subject subj; DivObserver divObs1(&subj, 4); // 7. Клиент настраивает число DivObserver divObs2(&subj, 3); // и типы наблюдателей ModObserver modObs3(&subj, 3); subj.setVal(14); } |
Вивід програми:
14 div 4 is 3 14 div 3 is 4 14 mod 3 is 2