Методи об'єктно-орієнтованого програмування 2007 Бублик В. В. Кафедра мультимедійних систем, кімн. 204/1


НазваМетоди об'єктно-орієнтованого програмування 2007 Бублик В. В. Кафедра мультимедійних систем, кімн. 204/1
Дата конвертації05.05.2013
Розмір445 b.
ТипЛекція


МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007

  • Бублик В.В.

  • Кафедра мультимедійних систем, кімн. 204/1

  • Консультації: вівторок, середа 15-16 год.

  • http://emerecu.ukma.kiev.ua/efolio


Лекція 11. Проектні взірці

  • Проектний взірець − придумайте кращий переклад для design pattern!

  • Взірець передбачає творчість, зразок для наслідування; шаблон − тупе копіювання



Рекурентні співідношення

  • x0 = a;

  • xk = f(xk-1), k=1,2,…

  • xn ?

  • Програмний взірець:

  • x := a;

  • повторювати n разів

  • x := f(x);



Звідки беруться взірці?

  • «Проза — один із двох основних типів літературної творчості» Вікіпедіа

  • Журден: «Я і не підозрював, що вже більше сорока років розмовляю прозою» Мольєр, Міщанин у дворянстві

  • Надійне і якісне програмування, досягнуте за допомогою гнучкого проектування, кристалізується у взірцях для наслідування



Гнучке проектування

  • Гнучке проектування покликане забезпечити створення програмних систем, які будуть легко адаптуватися до зміни умов їх застосування

  • Мета гнучкого проектування − уникнути необхідності повторної розробки програмної системи



Причини перепроектування

  • Залежність від програмної або технічної платформи

  • Залежність від конкретної реалізації

  • Залежність від закладених в систему алгоритмів

  • Сильна спряженість класів

  • Створення об'єкту жорстко фіксованого типу

  • Розширення функціональності за рахунок створення похідних класів



Інструменти розробки

  • Бібліотеки підпрограм або класів: викликаються клієнтським кодом

  • Каркаси програмних систем (software framework): приймають в себе клієнтський код і управляють ним

  • Проектні взірці (design pattern) описують спосіб вирішення цілого класу абстрактних проблем



Типи проектних взірців

  • Базові (fundamental)

  • Патерни породження

  • Структурні

  • Патерни поведінки

  • Паралелізму та конкурентності

  • інші



Interface: cтабільний невіртуальний інтерфейс

  • class SomeInterface {

  • public:

  • void something(){do_smthng();}

  • virtual ~SomeInterface() {};

  • private:

  • virtual void do_smthng() = 0;

  • };

  • class AnyActualiser: public SomeInterface {

  • private:

  • virtual void do_smthng();

  • };



Delegate: делегування поведінки

  • Заміна відкритого успадкування вкладенням (агрегацією)



Delegate: просте делегування

  • class Window //: public Rectangle,Square, Circle {

  • private:

  • Frame* _frame; // Delegee

  • public:

  • Window() : _frame( new Rectangle ) {}

  • virtual ~Window();

  • int area() { return _frame->area();}

  • int perimeter() {return _frame->perimeter();}

  • void doCircle() {

  • delete _frame;_frame = new Circle();}

  • void doRectangle(){…}

  • void doSquare(){…}

  • };



Delegate: розумне делегування

  • class Window //: public Rectangle,Square, Circle {

  • private:

  • Frame* _frame; // Delegee

  • public:

  • Window() : _frame( new Rectangle ) {}

  • virtual ~Window();

  • Frame* operator->() {return _frame;}

  • void doCircle() {

  • delete _frame;_frame = new Circle();}

  • void doRectangle(){…}

  • void doSquare(){…}

  • };



Adapter: пристосування(обгортка) класу

  • Перетворює інтерфейс класу в інтерфейс, зрозумілий клієнту



Adapter: клієнт

  • // Програма обробки даних

  • void client(Container & cont)

  • {

  • cont.put('a');

  • cont.get();

  • cont.discard();

  • return;

  • }



Adapter: клієнтський інтерфейс

  • template

  • class Container

  • {

  • public:

  • const T& get() const{return doGet();}

  • void put(const T& x){doPut(x);}

  • void discard() {doDiscard();}

  • virtual ~Container(){};

  • private:

  • virtual const T& doGet() const=0;

  • virtual void doPut(const T& x)=0;

  • virtual void doDiscard() =0;

  • };



Adapter: власне адаптер

  • template

  • class Adapter: public Container {

  • private:

  • Stack _adaptee;

  • virtual const T& doGet()const{

  • return _adaptee.top();

  • }

  • virtual void doPut(const T& x) {

  • _adaptee.push(x);}

  • virtual void doDiscard(){

  • _adaptee.pop();

  • }

  • };



Bridge: відокремлення абстракції від реалізації(й)

  • Відокремлення абстракції від реалізації з метою відособленої розробки



Proxy: замінник (сурогат) об'єкту

  • Служить сурогатом іншого об'єкту і управляє доступом до нього



Proxy: інтерфейс класу

  • class Calculator {

  • public:

  • double& x();

  • double& y();

  • double add();

  • double sub();

  • double mul();

  • double div();

  • double root();

  • virtual ~Calculator();

  • };



Proxy: справжній об'єкт

  • class RealCalculator: public Calculator {

  • double add(){return _x=_x + _y;}

  • double sub(){return _x=_x - _y;}

  • double mul(){return _x=_x * _y;}

  • double div(){return _x=_x / _y;}

  • double root(){ return _x = real_root(_x);}

  • double& x(){return _x;}

  • double& y(){return _y;}

  • double _x;

  • double _y;

  • };



Proxy: замінник об'єкту

  • class CalculatorProxy: public Calculator {

  • double add(){return _x=_x + _y;}

  • …………………………………………….

  • double root(){

  • if (_realCalculator == 0)

  • _realCalculator =

  • new RealCalculator(_x,_y);

  • _x =_realCalculator-> root();

  • return _x;

  • }

  • RealCalculator * _realCalculator;

  • double _x;

  • double _y;

  • };



Proxy: клієнт

  • // Початок роботи з проксі

  • CalculatorProxy calc;

  • calc.x()=10;

  • calc.y()=26;

  • calc.add();

  • // виклик, що приводить до звернення

  • // до справжнього об'єкту

  • calc.root();

  • cout<



Proxy: замінник (сурогат) об'єкту

  • Діаграма об'єктів часу виконання



Singleton: одинак

  • Гарантує унікальність екземпляру класу і надає точку доступу до нього



Singleton: небезпечний щодо видалення

  • class Singleton {

  • private:

  • static Singleton * _self;

  • protected:

  • ~Singleton(){};

  • public:

  • static Singleton * instance(){

  • if (_self==0)

  • _self = new Singleton;

  • return _self;

  • }

  • void free(){ delete _self;}

  • };



Singleton: проблема видалення

  • Singleton * s, *t;

  • s=Singleton::instance();

  • t=Singleton::instance();

  • s->free();

  • // t->free();



Singleton: безпечніший щодо видалення

  • class SingleBase

  • {

  • protected:

  • static SingleBase* _self;

  • static int _refcount;

  • SingleBase(){};

  • virtual ~SingleBase(){};

  • public:

  • void free();

  • static SingleBase* instance();

  • };



Singleton: підрахунок посилань

  • void SingleBase :: free()

  • {

  • --_refcount;

  • if(_refcount==0)

  • {

  • delete _self;

  • _self=NULL;

  • }

  • }



Singleton: похідний клас

  • class SingleThing: public SingleBase {

  • protected:

  • SingleThing(){}

  • ~SingleThing();

  • public:

  • static SingleBase* instance() {

  • if(_self==0)

  • _self = new SingleThing();

  • ++_refcount;

  • return _self;

  • }

  • };



Singleton: приклад використання

  • SingleBase *p =

  • SingleThing::instance();

  • SingleBase *q =

  • SingleThing::instance();

  • SingleBase *r =

  • AnotherSingleThing::instance();

  • p->free();

  • q->free();

  • r->free();



Singleton Мейерса: шаблон

  • template class AnySingle

  • {

  • public:

  • static T& instance()

  • {

  • static T theSingleInstance;

  • return theSingleInstance;

  • }

  • };



Singleton Мейерса: конкретизація

  • class OnlyOne : public AnySingle

  • {

  • friend class AnySingle;

  • private:

  • OnlyOne(){cout<<"OnlyOne is born\n";};

  • public:

  • ~OnlyOne(){cout<<"OnlyOne dies\n";}

  • void exist()

  • {

  • cout<<"OnlyOne exists: "<

  • }

  • };



Singleton Мейерса: застосування

  • OnlyOne & one=

  • AnySingle::instance();

  • OnlyOne & second=

  • AnySingle::instance();

  • one.exist();

  • // 004D21CE

  • second.exist();

  • // 004D21CE

  • AnotherOnlyOne & another=

  • AnySingle::instance();

  • another.exist();

  • // 004D21D4



Factory Method: фабричний метод

  • Породження класів



Factory Method: шаблон фабрики

  • template

  • class class_creator

  • {

  • public:

  • static Root* create()

  • {

  • return new T;

  • }

  • };



Factory Method: фабрика вікон

  • class Window //: public Rectangle,Square, Circle {

  • private:

  • Frame* _frame; // Delegee

  • public:

  • Window() : _frame

  • (class_creator

  • ::create()) {}

  • Frame* operator->() {return _frame;}

  • void doCircle() {

  • delete _frame;

  • _frame =

  • class_creator::create() ();}

  • };



Iterator: управління поведінкою

  • Послідовний доступ до всіх елементів складеного об'єкту (контейнера)



  • Верона (Італія). Арена, І ст.



Висновок

  • Програмуйте, спираючись на інтерфейси, а не реалізацію

  • Не забувайте про дятлів



Схожі:

Методи об\Лекція Принцип інкапсуляції Лекції для студентів 2 курсу
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина Об'єктне програмування. Лекція Принцип інкапсуляції
Методи об\Лекція Ієрархія об’єктів: композиція і агрегація Лекції для студентів 2 курсу
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина Об'єктне програмування. Лекція Ієрархія об’єктів: композиція...
Методи об\Твердо запам'ятайте це
Найважливіше правило об'єктно-орієнтованого програмування на С++ звучить так: відкрите успадкування означає, що один клас є різновидом...
Методи об\Відкритого успадкування
Поліморфізм ― це центральна тема об'єктно-орієнтованого програмування, але стосується вона лише такого відкритого успадкування
Методи об\Спадкування, похідні класи
Спадкування це один з основних принципів об'єктно-орієнтованого програмування, який дозволяє створювати об'єкти, що спадкують свої...
Методи об\Дослідження моделі фрагментів програмного коду на предмет плагіату Виконав: студент гр. Ік-53 Доля В. А. Мета роботи
При реалізації експериментальних досліджень розроблених алгоритмів був застосований ряд методів об'єктно-орієнтованого проектування...
Методи об\Кафедра Інформаційних систем і програмування Актуальність теми
Після того, як всі модулі програми запрограмовані, виробляється їх почергове тестування і відладка
Методи об\Навчально-виховний процес Навчально-виховний процес
Відділення обчислювальної техніки та програмування: секція мультимедійних систем, комп’ютерної графіки та ігрових програм. Фізико-математичне...
Методи об\Особливості технології візуального програмування в ObjectWindows – об'єктно-орієнтованому середовищі для Microsoft Windows

Методи об\Особливості роботи у середовищі візуального проектування і об’ктно-орієнтованого програмування Delphi


Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка