Generalized FUNCTORS В рамках курсу Актуальні проблеми програмної інженерії, 2009 р. Лозинський Ігор, Фін-3.

Презентация:



Advertisements
Похожие презентации
Класи пам'яті даних. Клас пам'яті, час існування та видимість об'єкта Кожен обєкт програми (змінна, функція,...) має свій тип і клас памяті. Тип визначає.
Advertisements

Цикли в мові С++ Цикл - це процес виконання певного набору команд деяку кількість разів.
Вказівники Вказівник (або покажчик) – особливий тип даних, значенням якого є адреса певного байта оперативної памяті. Значення покажчика - це беззнакове.
Опрацювання структур у функціях Оскільки мова С інтерпретує структури як звичайні змінні, а не вказівники, можна передавати значення структури у функцію.
8 Практична робота 11 Налагодження готової програми За новою програмою Урок 38.
Тема 6 Потоки введення- виведення. Робота з файлами.
Урок 25 6 клас ПОНЯТТЯ ПОДІЇ. ВИДИ ПОДІЙ. ПРОГРАМНЕ ОПРАЦЮВАННЯ ПОДІЇ .
7 Поняття змінної та її значення За навчальною програмою 2017 року Урок 19.
Урок 24 5 клас СЕРЕДОВИЩЕ ОПИСУ SCRATCH Й ВИКОНАННЯ АЛГОРИТМІВ .

Урок 22 6 клас. ПОНЯТТЯ ПРО ОБ`ЄКТ У ПРОГРАМУВАННІ. ВЛАСТИВОСТІ ОБ`ЄКТА
Урок 3 5 клас. ПК ЯК ПРИСТРІЙ ОПРАЦЮВАННЯ ДАНИХ. РІЗНОВИДИ ПК.
Viber
Ізяславський НВК 2, Гульчак інна Василівна Оператор. Виведення даних. Змінна. Типи даних. Оператор надання значень. Константи. Введення даних.
Підготувала: вчитель інформатики Золотоніської гімназії ім С.Д. Скляренка Мірошніченко Т. І.
1 Підпрограми- процедури (Turbo Pascal 7.0) Підпрограми- процедури (Turbo Pascal 7.0)

Бублик Володимир Васильович Програмування - 2 Лекція 3. Об'єктне програмування. Права доступу Лекції для студентів 2 курсу.
База даних (БД) це структурована сукупність взаємопов'язаних даних певної предметної області (реальних об'єктів, процесів, явищ тощо). це структурована.
Поняття об єкта у програмуванні. Властивості об єкта. Елементи інтерфейсу користувача як об єкти.
Транксрипт:

Generalized FUNCTORS В рамках курсу Актуальні проблеми програмної інженерії, 2009 р. Лозинський Ігор, Фін-3

Ги-ги… Додаткова інформація: В презентації 32 сторінки Наперед перепрошую за всі лажі та недопрацювання.

Майже гасло Особливо розумні технології призначені для досягнення простоти. (original: Clever techniques should be applied for the benefit of simplicity. )

Актуальні проблеми прогамної інженерії :: generalized functors 4 Що воно таке? Узагальнений функтор – це будь-який виклик процедури, що дозволений в С++ та інкапсульований в об'єкт першого класу, який гарантує типову безпеку generalized functor is any processing invocation that C++ allows, encapsulated as a typesafe first-class object

Актуальні проблеми прогамної інженерії :: generalized functors 5 Для чого? Узагальнені функтори дозволяють зберігати виклики процедур у вигляді значень, передавати їх в якості параметрів, і виконувати іх далеко від місця створення. Суттєвою відмінністю між вказівниками на функції та узагальненими функторами в тому, що останні можуть зберігати стан об'єкта та викликати його методи.

Актуальні проблеми прогамної інженерії :: generalized functors 6 The Command Design Pattern Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides Design Patterns: Elements of Reusable Object-Oriented Software.

Актуальні проблеми прогамної інженерії :: generalized functors 7 Що це дає? Модуль, що здійснює виклик не тільки не знає як виконується робота, а й не має уявлення для якого виду роботи призначений клас Command

Актуальні проблеми прогамної інженерії :: generalized functors 8 Застосування // Resize the window window.Resize(0, 0, 200, 100); Command resizeCmd( window, // Object &Window::Resize, // Member function 0, 0, 200, 100); // Arguments // Later on... resizeCmd.Execute(); // Resize the window

Актуальні проблеми прогамної інженерії :: generalized functors 9 В реальному житті Розробка інтерфейсів користувача окремо від самих програм (skinnable) Оболонки не мають архітектури, вони лише надають місця для об'єктів класу Command

Актуальні проблеми прогамної інженерії :: generalized functors 10 Generalized callback void Foo(); void Bar(); int main() { void (*pF)() = &Foo; Foo(); // Call Foo directly Bar(); // Call Bar directly (*pF)(); // Call Foo via pF void (*pF2)() = pF; // Create a copy of pF pF = &Bar; // Change pF to point to Bar (*pF)(); // Now call Bar via pF (*pF2)(); // Call Foo via pF2 }

Актуальні проблеми прогамної інженерії :: generalized functors 11 Ті, що підтримують operator() (callable) Функції Вказівники на функції Відсилки на функції (константні вказівники) Функтори (об'єкти, в яких визначений operator() ) Результати застосування операторів.* та ->* до указників на функції-члени.

Актуальні проблеми прогамної інженерії :: generalized functors 12 Скелет Functorа Клас Functor має поліморфну реалізацію, але це сховано всередині нього. Реалізація базового класу - FunctorImpl

Актуальні проблеми прогамної інженерії :: generalized functors 13 Починаємо реалізовувати Перша реалізація – перша проблема class Functor { public: void operator()(); // other member functions private: // implementation goes here };

Актуальні проблеми прогамної інженерії :: generalized functors 14 Виходить без шаблонів ніяк? template class Functor { public: ResultType operator()(); // other member functions private: // implementation };

Актуальні проблеми прогамної інженерії :: generalized functors 15 Ну а де аргументи? Ми не маємо морального права накладати обмеження на кількість аргументів operator()а та на їх тип. Крім того змінних шаблонів в С++ немає. А еліпси (ellipsis) типу printf – це не красиво, та ще й небезпечно. Що робити?

Актуальні проблеми прогамної інженерії :: generalized functors 16 Так теж не годиться // Functor with no arguments template class Functor {... }; // Functor with one argument template class Functor {... };

Актуальні проблеми прогамної інженерії :: generalized functors 17 Списки типів class Functor {... }; Functor myFunctor;

Актуальні проблеми прогамної інженерії :: generalized functors 18 Але й списки не ідеальні template class FunctorImpl { public:virtual R operator()() = 0; virtual FunctorImpl* Clone() const = 0; virtual ~FunctorImpl() {} }; template class FunctorImpl { public: virtual R operator()(P1) = 0; virtual FunctorImpl* Clone() const = 0; virtual ~FunctorImpl() {} };

Актуальні проблеми прогамної інженерії :: generalized functors 19 Сам пан Functor template class Functor { public: Functor(); Functor(const Functor&); Functor& operator=(const Functor&); explicit Functor(std::auto_ptr spImpl);... private: FunctorImpl Impl; std::auto_ptr spImpl_; };

Актуальні проблеми прогамної інженерії :: generalized functors 20 Маленька хитрість template class Functor { typedef TList ParmList; typedef typename TypeAtNonStrict ::Result Parm1; typedef typename TypeAtNonStrict ::Result Parm2;... as above... }; Доступаємось до типу, знаючи його номер (дивно, але працює )

Актуальні проблеми прогамної інженерії :: generalized functors 21 Реалізація operator()а template class Functor {... as above... public: R operator()() { return (*spImpl_)(); } R operator()(Parm1 p1) { return (*spImpl_)(p1); } R operator()(Parm1 p1, Parm2 p2) { return (*spImpl_)(p1, p2); } };

Актуальні проблеми прогамної інженерії :: generalized functors 22 В чому фокус? Functor myFunctor; double result = myFunctor(4, 5.6); // Wrong invocation. double result = myFunctor();

Актуальні проблеми прогамної інженерії :: generalized functors 23 Робота з функторами template class Functor {... as above... public: template Functor(const Fun& fun); }; Таким чином ми доступатимемось до інших функторів

Актуальні проблеми прогамної інженерії :: generalized functors 24 Так багато коду для одного конструктора template class FunctorHandler : public FunctorImpl < typename ParentFunctor::ResultType, typename ParentFunctor::ParmList > { public: typedef typename ParentFunctor::ResultType ResultType; …

Актуальні проблеми прогамної інженерії :: generalized functors 25 … готуємо конструктор FunctorHandler(const Fun& fun) : fun_(fun) {} FunctorHandler* Clone() const { return new FunctorHandler(*this); } ResultType operator()() { return fun_(); } ResultType operator()(typename ParentFunctor::Parm1 p1) { return fun_(p1); } ResultType operator()(typename ParentFunctor::Parm1 p1, typename ParentFunctor::Parm2 p2){ return fun_(p1, p2); } private: Fun fun_; };

Актуальні проблеми прогамної інженерії :: generalized functors 26 Нарешті вимучили наш конструктор template Functor ::Functor(const Fun& fun) : spImpl_(new FunctorHandler (fun)); { } Ще один трюк – шаблонне визначення члена поза межами класу ("out-of-class member template definition." )

Актуальні проблеми прогамної інженерії :: generalized functors 27 Тестуємо – все красиво #include Functor.h #include struct TestFunctor { void operator()(int i, double d) { cout

Актуальні проблеми прогамної інженерії :: generalized functors 28 Не просто красиво – дуже красиво Працюємо з функторами Працюємо з функціями Автоматично зводимо типи аргументів та результатів (все й справді чесно) (приклад: char* -> string)

Актуальні проблеми прогамної інженерії :: generalized functors 29 Вказівники на методи об'єктів Є певні нюанси (але вони дещо виходять за межі нашого обговорення, та й для чого ускладнювати?) Реалізується тим же шляхом що й FunctorHandler

Актуальні проблеми прогамної інженерії :: generalized functors 30 Бонуси Зв'язування певних атрибутів (до початку виклику ми не тільки вкажемо на виконавця, але й задамо атрибути виконання, тобто певне описання середовища, в якому відбувається робота ). Ланцюжок – (MacroCommand, з Gamma et al*, 1995) - дозволяє створювати пакет виконання команд. Всі команди на момент запаковування повинні бути зв'язаними. Проте пізніше однією командою можна запустити цілу програму, створену на етапі виконання. * Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides Design Patterns: Elements of Reusable Object-Oriented Software. Reading, MA: Addison-Wesley.

Актуальні проблеми прогамної інженерії :: generalized functors 31 Де це знайти? loki Посилання: Для презентації використовувалась версія 0.1.7

Актуальні проблеми прогамної інженерії :: generalized functors 32 Ніби кінець… Спасибі за увагу Буду вдячний, якщо питання Ви не задаватимете.