КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Стандартні потоки і потокові класи
Література Операції класу У третій згори секції прямокутника записуються операції або методи класу. Операція (operation) є деяким сервісом, що надається кожним екземпляром класу на певну вимогу. Сукупність операцій характеризує функціональний аспект поведінки класу. Кожній операції класу відповідає окремий рядок: <квантор видимості><ім 'я операції>(список параметрів): <вираження типу повертаного значення>{рядок- властивість} Для квантора видимості і імені операції справедливо вусі те ж що і для квантора видимості атрибуту і імені атрибуту. Список параметрів є переліком розділених комою формальних параметрів, кожен з яких може бути представлень в наступному виді: <вид параметра><ім 'я параметра>:<вираження типу>=<значення параметра за умовчанням>. Тут вид параметра - одне з ключових слів in, out або inout зі значенням in за умовчанням. Ім 'я параметра це ідентифікатор відповідного формального параметра. Вираження типу є покладом від конкретної мови програмування специфікацією типу повертаного значення. Вид значення за умовчанням залежить від конкретної мови програмування. Ті ж торкається і типу повертаного значення. Двокрапка і вираження типу повертаного значення можуть бути опущені, якщо операція не повертає ніякого значення. Операція із зоною дії на обвішай клас показується підкресленням імені і рядка вираження типу. За умовчанням під областю операції розуміється об' єкт класу. Операція, яка не може змінювати стан системи і, відповідно, не має ніякого побічного ефекту, позначається рядком- властивістю "{запитий}" ("{query}"). У осоружному випадку, операція може змінювати стан системи, хоча немає ніяких гарантій, що вона це робитиме. 67. Катаев М.Ю. Объектно-ориентированное программирование: Учебное пособие. - Томск: Томский межвузовский центр дистанционного образования, 2000. - 145 с. 68. Кент Рейсдорф и Кен Хендерсон BORLAND C++BUILDER. ОСВОЙ САМОСТОЯТЕЛЬНО 69. Лафоре Р. Обьектно–ориентированное программирование в С++. 4-е изд.: – СПб: Питер, 2004 – 902 с. 70. Львов М.С., Співаковський О.В. Вступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл. 71. М.С. Львов. О.В. СпіваковськийВступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл. 72. Шилдт Герберт. Искусство программирования на С++. Санкт-Питербург, 2005.-496 с., ил. 73. Шилдт, Герберт. C++: руководство для начинающих, 2-е издание.: Пер. с англ. — М.: Издатель- ский дом "Вильяме", 2005. — 672 с.: ил. — Парал. тит. англ. 74. Эккель Брюс. Философия С++. Введение в стандартный С++ (2-е издание). - СПб: Питер, 2004 – 573 с. 75. Эккель Брюс. Философия С++. Практическое программирование (2-е издание). - СПб: Питер, 2004 – 610 с., ил. 76. Юркова Т. А., Ушаков Д. М., Паскаль для школьников. — СПб.: Питер, 2010. — 256 с.: ил. 77. Visual Studio 2010 и введение в.NET 4.0 и для профессионалов. Макки, Алекс: Пер. с англ. — М.: ООО И. Д. Вильямс". 2010. — 416 с.: ил. — Парал, тит. англ.
Потоки не є характеристикою С++, а були введені ще в ANSI C. У С++ мезанізм потоків оновлено і змінено. Проте загальний механізм під'єднання потоків залишився. Потік (введенню/виводу) - є абстрактним поняттям, яку відноситься до будь-якого перенесення даних між прибудовами видавання та приймання інформації. Читання даних з потоку називається операцією витягування даних з потоку (extracting, getting orfetching data). Реалізовується оператором ви-тягуваня з потоку operator>>*. Розміщення даних в потік називаєтться операцією вставки даних в потік (inserting, putting or storing data). Реалізовується оператором вставки в потік operator<<*. Потік визначається як послідовність байтів і не залежить від конкретного прибудую, з яким відбувається обмін інформацією. Пере-да-вання даних здійснюється через спеціально виділену пам'ять, яка нази-ва- ється буфером. Фактичне передавання даних відбувається при виовді після заповнення буфера, а при вводі - якщо буфер є порожнім. За напрямком обміну інформацією потоки можні розділити на вхідні (дані вводяться в пам'ять), вихідні (дані вибераютьяс з пам' яті) і двонаправленні. Потоки пов' язані з фізичним пристроєм за допомогою низько- рівневого інтерфейсу введенню/виводу С++. Оскільки усі потоки введенню/виводу (у/в) діють однаково, то система в/в представляє собою єдиний зручний ін -терфейс, незважаючи на ті, що програмісту доводитися працювати з аб-со-лютно різними за природою об' єк -тами. Іншою перевагою потоків є контроль типів, та здатність до розширення, тобто здатність працювати з типами, оголошеними користувачем. Основним недоліком потоків є зменшення швидкодії програми, яку в залежності від реалізації компілятора може бути значним. За типом пристроів, з якими працюють потоки, їх умовно можна по- ділити на потоки стандартні, файлові і рядковіі. Стандартні потоки ви-користовуються для виведення інформації на еркан та зчитування її з кла- віатури. Файлові потоки забезпечують файловий ввід/вивід. Рядкові потоки використовуються для роботи з масивами символьних рядків в оперативні пам' яті. Під година вико-нання програми (за умови підмикання основного пото-ко-вого інтерфейсного файлу iostream.h) автоматичний від -кри-ва-ються чотири по-то-ки С++, які вико-ристовуються для зв'язку з прис--троєм по замовчуванню. У таблиці.1 наведено список стан-дартних потоків. У випадку необхідності потоки можуть бути перена- правлені на інші пристрої. Структура потокової системи введенню/виводу Потоки С++ повністю реалізовані через класи (ієрархії класів). З метою використання потокових операцій в програмі треба під'єднати хоча б один інтерфейсний файл заголовків ФЗ. Основним серед них є iostream.h. У цьому файлі визначені набори ієрархій класів, які забезпечують ввід та вивід. З іншого боку, підмикання ФЗ fstream.h чи sstream.h* автоматичний підмикає і файл iostream.h, оскільки він для них є базовим. Основою цих ієрархій є ієрархії класів - шаблонів. У них оголошуються лише форми класів без задання даних, з якими сморід працюють. Лише після означення класу-шаблону з' являється можливість створювати окремі екземпляри класів. Система потоків С++ базується на двох зв'язаних, проте різних, ієрархіях шаблонів. Деручи з них є ієрархією від базового класу-шаблону base_streambuf. Данії клас (реально екземпляр цього класу streambuf) забезпечує операції в/в нижнього рівня. Верхній рівень забез-пе- чується ієрархією від класу-шаб-лону base_ios. У свою чергу клас-шаблон base_ios є базовим для класів base_istream, base_os - tre - am і base_iostream. Влас-не останні класи-шаблони викорис-товуються для створення кла- сів, які у свою чергу забез-пе-чу-ють ство-рен-ня потоків в/в**. В таблиці.2 наве-дено відповідності класів - шаблонів і породжуваних ними потокових класів. Потокові класи утворюють дві зв' язані ієрахії класів. На рис.1- 2 наведені ієрархії потокової системи в/у в реалізації Borlаnd C++. Список потокових класів визначених стан-дартом ISO/ІЕС 1882 наведень у таблиці.3. У кінцевому результаті користувач отримує дві основні взаємозв'язані ієрархії, що забезпечують систему потокового в/в С++.
Фабричний метод (Factory method) - визначає інтерфейс для створення об' єкту, але дозволяє підкласам вирішувати, які саме екземпляри класів створювати. Фабричний метод дозволяє класу перекласти інстанціювання (створення екземплярів) на підкласи. Прототип (Prototype) - вказує відіа об' єктів для створення з допомогою прототипу (прототипного екземпляру) і створює нові об' єкти копіюванням цього прототипу. Одинак (Singleton) - гарантує, що клас має лише єдиний екземпляр та надає глобальну точку доступу до нього. Розвитком цієї ідеї є шаблон Multiton (інша назва - Registry of singletons), який гарантує, що клас має лиші поіменовані екземпляри, та забезпечує глобальну точку доступ до них, тобто забезпечує єдиність існування не одного екземпляру (як Singleton), а єдиність існування екземпляру, що відповідає заданому ключу у визначеній єдиній (глобальній) множині. До другої групи (Structural Patterns) належать такі шаблони: Адаптер (Adapter) - перетворює інтерфейс класу до іншого інтерфейсу, якого очікують клієнти. Адаптер дозволяє працювати разом класам, які через несумісність інтерфейсів інакше не змогли б. Інша назва цього шаблону -"Обгортка" (Wrapper). Міст (Bridge) - відокремлює абстракцію від її реалізації, що дозволяє обом (абстракції і реалізації) змінюватися незалежно. Використовується у ситуаціях, коли потрібно створити клас, який буде змінюватися сам по собі і будуть змінюватися дії, які він повинний виконувати. Компонувальник (Composite) - поєднує об' єкти у деревовидні структури для пердставлення ієрархії типу "частина-ціле". Дозволяє клієнтам звертатися до окремих об' єктів і їх композицій однаково. Декоратор (Decorator) - динамічно долучає до об' єкта додаткові обов'язки, залишаючи інтерфейс незмінним. Декоратори забезпечують гнучку альтернативу створенню підкласів для розширення функціональності. Фасад (Facade) - забезпечує уніфікований інтерфейс для набору інтерфейсів у підсистемі. Визначає інтерфейс більш високого рівня, що робить підсистему легшою у використанні. Цей шаблон дозволяє приховати складність системи шляхом приведення усіх можливих зовнішніх викликів до одного об'кту (фасаду), який делегує ці виклики відповідним об' єктам системи. Фасадний об' єкт надає простіший або легшений у роботі інтерфейс. Для порівняння "Адаптер" забезпечує точно визначений інтерфейс із підтримкою поліморфної поведінки. Водночас, навідміну від шаблону "Замісник", який працює непомітно (є прозорим) для клієнта, "Фасад" акцентовано перебирає на собі усі повноваження по взаємодії із прихованими за ним підсистемами. Легковаговик (Flyweight) - використовує розподілене використання ресурсу (пам' яті) для ефективної підтримки великої кількості дрібних об' єктів. Шаблон корисний у ситуаціях, коли значна кількість простих повторюваних представлень може використати надмірно (неприйнятно) великі обсяги пам' яті. Наприклад, коли потрібно у текстовому процесорі зберігати різноманітну інформацію (форматування і т.п.) щодо шкірного символу тексту, то наявність пов'язаних із кожним символом об' єктів призведе до неймовірно великих і невиправданих витрат пам' яті. Натомість, застосовуючи шаблон "Легковаговик" можна встановити для однакових символів лише посилання на відповідний об'кт їх представлення і тоді додатково достатньо лише зберігати позицію символу у тексті. Іншими словами, цей шаблон дозволяє багатократно представити об' єкт як унікальний екземпляр у різних частинах програми, хоча насправді він ним не буде, оскільки поділяє спільну сутність із іншими такими ж об' єктами. Цей шаблон також інколи називають "Пристосуванець". Замісник (Proxy) - забезпечує сурогатний або замінюючий об' єкт для іншого об'кту з метою конролю доступу до останнього. У найбільш загальному розумінні цей шаблон лише надає інтерфейс до чогось іншого. Фактично це клас з інтерфейсом ідентичним до інтерфейсу сутності, якові він повинний заміщати або контролювати. Таким чином, використання об' єкта - замісника для клієнта є ідентичним до використання об' єкту - оригіналу, але дозволяє спростити, покращити чи захистити доступ до цього оригіналу. Застосування цього шаблону може бути корисним, коли оригінальний об' єкт є дуже складним чи його створення вимагає значних витрат ресурсів. До третьої групи (Behavioral Patterns) належать такі шаблони: Ланцюг відповідальності (Chain of responsibility) - уникає поєднання відправника запиту із його одержувачем шляхом надання більш ніж одному об' єкту можливості обробити запитий. З об' єктів, що можуть обробити запитий формується ланцюг, вздовж якого запитий передається до тихий пір, поки не буде успішно оброблений. Насправді, якщо серед об' єктів - обробників запиту передбачити об' єкти, які будуть самостійно вирішувати куди далі передавати обробку одержаного запиту, то ланцюг може бути перетворений у дерево чи будь-яку іншу структуру, згідно з якою відбуватиметься розподіл та делегування повноважень на обробку запитів. Команда (Command) - інкапсулює запитий (команду) у вигляді об' єкту, дозволяючи тим самим параметризувати клієнтів з різними запитами, побудувати чергу чи реєстр запитів та організувати підтримку зворотніх дій (скасування операцій). Застосування цього шаблону удосконалює взаємодію між відправником і одержувачем запиту (повідомлення чи команди), дозволяючи, наприклад, відокремити дію від її ініціатора та виконавця через створення об' єкту, що містить усю необхідну інформацію (параметри і т.п.) для виконання запиту (дії, команди). Перекладач (Interpreter) - враховуючи мову, визначає представлення для її граматики та одночасно перекладача, що використовує це представлення для перекладу речень мови. Це специфічний шаблон проектування, пов'язаний із необхідністю розбору спеціалізованих комп'ютерних мов: мови для роботи з базами даних (наприклад, SQL), спеціалізовані мови для опису комунікаційних протоколів, мови опису регулярних виразів (використовуються для розбору і пошуку фрагментів у інших виразах), мови інтерпретації обчислюваних виразів ((наприклад, обернений польський запис) худе. Шаблон вказує як саме здійснювати розбір речень мови. Основна ідея шаблону полягає у наявності окремого класу для шкірного символу (термінального чи нетермінального) спеціалізованої комп' ютерної мови. Для створення синтаксичного дерева розбору цьому шаблону допомагає шаблон "Компонувальник" (Composite), який допомагає у розборі (перекладі) речення. Ітератор (Iterator) - забезпечує спосіб доступу до елементів складеного об' єкту послідовно, але не розкриваючи внутрішнього влаштування цього об' єкту. Складений об' єкт тут виступає у ролі контейнера для елементів, які він містить, причому суть внутрішньої організації (впорядкування) елементів у контейнері приховується від клієнта. Водночас, щоб забезпечити послідовний доступ до (всіх по черзі) елементів контейнеру, потрібен ітератор. Цей шаблон відокремлює алгоритми доступу від контейнерів, хоча у деяких випадках алгоритми доступу є специфічними для контейнера і їх неможливо відокремити. Інколи шаблон "Ітератор" ще називають "Курсор" (Cursor). Посередник (Mediator) - визначає об' єкт, що інкапсулює спосби взаємодії між об' єктами. Посередник сприяє слабкому зв'язуванню об' єктів, утримуючи їх від явного посилання один на одного, і дозволяє варіювати їх взаємодії самостійно (незалежно). Фактично цей шаблон надає уніфікований інтерфейс для набору інтерфейсів у деякій підсистемі. Застосування шаблону корисне у випадках, коли у програмі створюється значна кількість різних класів і взаємодія між об'ктами може бути досить доладною. Водночас, необхідність з часом вносити зміни і доповнювати програму новими класами суттєво ускладнює взаємодії між різнми об' єктами, що може унеможливити подальшу розробку і вдосконалення програми. Посередник дозволяє, уникнувши прямих зв' язків між об' єктами, зменшити ваємну залежність і вирішити проблему ефективної взаємодії між об' єктами. Хранитель (Memento) - без порушення інкапсуляції захоплює і надає втілення внутрішньому стану об' єкту, що дозволяє згодом відновити цей стан. Фактично ця можливість відновлювати попередній стан об' єкту є чимось на зразок скасування дій шляхом відкату. Методологія роботи шаблону грунтується на тому, що у взаємодії деякого об' єкту і суб' єкту, що може здійснювати зміни цього об' єкту, передбачається створення об' єктом свого хранителя (memento) - спеціалізованого об' єкту, який зберігає інформацію про поточний стан свого породжуючого об' єкту. Перед качаном модифікації суб' єкт дає запитий об' єкту про створення хранителя, якого об' єкт повертає суб' єкту у відповідь на запитий. Передбачається, що хранитель є непрозорим об'ктом, тобто суб' єкт не може (або, принаймні, не повинний) його змінювати. Після ж здійснення суб' єктом дій над об' єктом, у разі необхідності відновити попередній стан об' єкту (іншими словами, виконати відкат змін), суб' єкт повинний повернути об'кту хранителя. При цьому важливо не забувати, що хранитель (згідно визначення шаблону) зберігає інформацію лише про один об' єкт, тому потрібно окремо підтата про коректність відкату у ситуації, коли у процесі змін об' єкту цей об' єкт може змінювати інші об' єкти чи ресурси. Спостерігач (Observer) - визначає залежність між об' єктами типу "один до багатьох", де зміна стану одного об' єкту (спостережуваного - observable) автоматичний викликає повідомлення і здійснення відповідних змін (оновлення) в усіх решта залежних об' єктів (спостерігачів - observers). Суть взаємодії між спостережуваним об' єктом і його спостерігачами у тому, що спостерігачі реєструються у спостережуваного об' єкту (як спостерігачі), а спостережуваний об' єкт зобов'язаний повідомляти спостерігачів про будь- які свої зміни стану. Далі спостерігача самостійно повинні вирішувати, що робити із одержаною інформацією чи як реагувати на отримане повідомлення. Інша назва цього шаблону "Видавець/передплатник" (Publish/subscribe), можливо, більш яскраво розкриває його суть: передплатники реєструються у видавця і очікують на видання, яку видавець розсилає усім передплатникам. Стан (State) - дозволяє об' єкту змінювати свою поведінку, коли змінюється його внутрішній стан. Виглядатиме це як зміна класу об' єкта. Цей шаблон також ще називають "Об' єкти для станів" (Objects for states). Принципове призначення шаблону - представляти стан об' єкту. І цей шаблон надає допустимий шлях для об' єкту частково змінити свій тип під година роботи програми (at runtime). Стратегія (Strategy) - визначає сімейство алгоритмів, інкапсулює кожен із них та дозволяє зробити їх взаємозамінними. Шаблон передбачає можливість змінювати алгоритм незалежно від клієнтів, що ним користуються. Фактично це особливий шаблон, який дозволяє обирати алгоритм під година роботи програми (at runtime) поклад від ситуації яка складається. Наприклад, від типу покладу даних, які потрібно обробити, алгоритми обробки можуть радикально відрізнятися. Але про ті, які конкретно дані прийдуть на обробку, програма дізнається вже лише у процесі роботи. Тому потрібен механізм для вибору адекватного алгоритму і шаблон "Стратегія" визначає цей механізм. Шаблонний метод (Template method) - визначає скелет алгоритму у операції, відкладаючи деякі крокі для визначення у підкласах. Цей шаблон дозволяє підкласам перевизначити окремі крокі алгоритму, не змінюючи загальну структуру цього алгоритму. Принцип реалізації шаблону доволі простий і грунтується на перевантаженні (overriding) методів у класах-нащадках. Фактично, деякий базовий клас визначає "шаблонний метод" у термінах окремих операцій (методів класу, що можуть бути навіть чисто віртуальними). Нащадки цього базового класу, перевизначивши відповідні операції, вже як власні методи, додають власну специфіку і забезпечують виконання вусі того ж глобально визначеного алгоритму. Відвідувач (Visitor) - представляє операцію, яка повинна бути виконана на елементах структури об' ктів. Шаблон дозволяє визначити нову операцію без зміни класів елементів, на яких вона працює. Цее шлях для відокремлення алгоритму від структури об' єктів, на якій цей алгоритм працює. Практичний результат такого відокремлення полягає у здатності додавати нові операції до існуючої структури об' ктів без внесення змін у цю структру. Це один із шляхів дотримуватися відкрито -закритого принципу (open/closed principle - OCP). По суті, шаблон "Відвідувач" дозволяє додавати нові віртуальні функції у сімейство класів, не змінюючи самих класів. Замість цього створюється клас- відвідувач, який реалізує усі відповідні спеціалізації віртуальної функції. Клас- відвідувач приймає на вхід посилання на екземпляр і реалізує цілі через механізм "Подвійної відправки" (механізм, що передбачає відправку виклику функції до різних конкретних функцій поклад від типів парі об' єктів, задіяних у виклику під година виконання програми). Серед корисних шаблонів, які часто доводитися зустрічати, але які не належать до визначених GoF шаблонів проектування (design patterns), відмітимо шаблон "Відкладена ініціалізація" (Lazy Initialisation) - тактика відтермінування створення об' єкту, обчислення значення, чи будь-якого іншого витратного (доладного, ресурсоємного, тривалого, худо) процесу до моменту годині, коли це справді буде необхідним. Цей шаблон належить до групи породжуючи шаблонів. (Цей шаблон не належить до Design Patternsвизначених GoF.) Загальні вхідні дані для курсу лабораторних зайняти Курс лабораторних робіт розрахований на 64 аудиторних години та складається з 8 лабораторних робіт. Завдання передбачають виконання усіх лабораторних робіт на мові C++ у середовищі Microsoft Visual Studio.
Дата добавления: 2013-12-14; Просмотров: 2382; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |