Главная » Просмотр файлов » А. Александреску - Современное проектирование на C++

А. Александреску - Современное проектирование на C++ (1119444), страница 9

Файл №1119444 А. Александреску - Современное проектирование на C++ (А. Александреску - Современное проектирование на C++) 9 страницаА. Александреску - Современное проектирование на C++ (1119444) страница 92019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 9)

1.11. Совместимые и несовместимые стратегии Допустим, нам нужны две конкретизации класса 5вагтятг: РазтМддетятг, указатель без проверки, и 5аУеМс)детРтг, указатель с проверкой перед разыменованием. 39 Глава 1. Разработка классов на основе стратегий Возникает интересный вопрос: нужно ли присваивать объекты класса газсЫбдесясг объектам класса 5а(еЫбцесрсг? Следует ли присваивать объекты этих классов другим переменным? Если такие преобразования необходимьк как их реализовать? Отталкиваясь от той точки зрения, что указатели типа 5атеи1бцесясг накладывают больше ограничений, чем указатели типа газси1бцесясг, естественно допустить преобразование типа газСЫ1бцеСЯСг в тип 5асеи1бдесясг. Причина этого заключается в том, что язык С++ уже поддерживает неявные преобразования, увеличиваюшие ограничения, например, переменных неконстантных типов — в константные.

С другой стороны, свободное преобразование обьектов класса 5а(езг1бдесясг в объекты класса яазси1бцесясг опасно, поскольку в приложениях основная масса кода может использовать указатели типа 5а1еь?1бцесясг, и только небольшое ядро, для которого скорость выполнения является крайне важной, может работать с указателями типа ГазСИ1бдесгтг. Разрешая только явные, контролируемые преобразования в тип газсЫбцесясг, можно свести к минимуму использование указателей этого типа. Наилучшим и наиболее масштабируемым способом взаимного преобразования стратегий является инициализация и копирование объектов класса 5вагсасг сирии~егия за стригиегией (ройсу Ьу ройсу), как показано ниже.

(Для простоты рассмотрена только одна стратегия — сйеск1пц.) семр1асе с1ааа т, семр1асе <с1аьа> с1аьв сйесИ пцяо11су с1аьа 5магсрсг : рцЬ11с сйеск1пдяо11су<т> семр1асе < с1аьа Т1, сеар1асе <с1аьа> с1ааз ся1 > 5магсясг(сопзс 5магсрсг<т1, срз>э осйег) розпсее (осЬег.розпсее ), сйеск1пцро11су«т>(осйег) ( ) ); Класс 5магсрсг реализует шаблонную копию конструктора, получаюшую другую конкрепзззацию класса 5вагтртг.

Код, вылеленный полужирным шрифтом, инициализирует компоненты класса 5вагсрсг компонентами яр)того класса 5магсрсг<т1, ся1>, полученными в виде аргументов. Вот как работает этот способ. (Проследим за выполнением кода конструктора.) Допустим, у нас есть класс вхсепбебь?1бцес, производный от класса я1бцес. Если объект ююсса 5яагсрсг<я1бцес, ноСЬесК1пц> проинициализировать объектом класса 5еагсясг<яхсепбеби1бцес, носйесК1пц>, компилятор попытается проинициализировать указатель и1бдес* указателем ахсепбеби1бдес* (что вполне допустимо), а объект класса носйеск1пц — объектом класса 5вагсясгвхсепбеб<дхсепбебтг1бцес, носйес1с1пц>.

Возможно, это выглядит подозрительно, но не забывайте, что класс 5аагСРСг является производным от своих стратегий, так что, по сушеству, компилятор может легко распознать, что мы инициализируем объект класса НоейесК1пц другим объектом того же класса. Таким образом, процесс инициализации выполняется без проблем. Часть!. Методы Перейдем теперь к более интересной части. Допустим. ндм нужно инициализировать объект клвссз 5вдгтртг<ит одет, впУогсенотьщ11> объектом класса 5вагтртг<дхтепоеоизодет, нос(зесктпд>. Как и раньше, указатель типа дхтепоеои(одет" без проблегя преобрвзовыввется в указатель типа итодет".

Зятем компилятор попытается сравнить конструкторы классов 5вагтртг<ехтепдедЫйдет, носбесктпд> и епбогсеногнц11. Если клаас впУогсеногкц1'1 реализует конструктор, получвюший объект ноСпес1с1пд, то компилятор проверяет этот конструктор. Если класс носоесктпд ревлизуст оператор преобразования в тип дпСогсенц11, вызывается функция, реализующая это преобразование. В остальных случаях возниквст сшибка компиляции. Очевидно, что при реализации преобразований стратегий друг в друга возникает удвоенная гибкость: преобразование можно реализовать квк с помощью конструктора, твк и с помощью операторе.

По сложности это напоминает оператор присваивания, однвко, к счастью, Вццег (2000) описал очень остроумный способ, позволяющий реализовать оператор присваивания с помощью конструктора копирования. (Он настолько остроумен, что о нем обязательно следует прочитать. Этот способ был применен при реализации класса 5вагтртг в библиотеке (.оЫ.) Несмотря нв то что преобразования объектов классов носпеск)пд в объекты класса апГогсенотнц11 и даже наоборот имеют довольно ясный смысл, некоторые преобрвзоввния совершенно бессмысленны. Представьте себе преобрдзоввние указателя, подсчитывающего ссылки, в указатель, поддерживающий другую стратегию владения (очпегзп)р ройсу), например, уничтожение после копирования (демгцсйче сору) наподобие зтд::авто ртг, Твкое преобразование семантически неверно.

Определение укззвтеля, подсчитывающего ссылки, состоит в следующем: все указатели нв один и тот же объект считвются известными и отслеживаются с помощью слинственного счетчика. При попытке применить другую стрвтсгию происходит нарушение инваривнта, гарантирующего правильную работу указателя, полсчитываюшсго ссылки.

В заключение звмегим, что неявные преобразования, изменяющие стратегию владения, применять не следует и обрвгцвться с ними нужно с максимальной осторожностью. Лучше всего изменять стратегию владения указателем, подсчитывающим ссылки, явно вызывая соответствукзшую функцию. Эта функция будет успешно рвботвть, только если счетчик ссылок исходного указателя рдвец 1. 1.12. Разложение классов на стратегии При проектировании, основанном нв применении стратегий, самое трудное .

правильно разложить функционътьные возможности класса нв стратегии. Основное правило заклк>чается в следующем: нужно идснтифицировдть и назвать проектные решения, определяющие режим работы клвсса. Все, что можно оделять несколькими способами, должно идентифицироваться и передаваться от класса к стратегии. Не забудьте; проектные решения, замурованные в клаас, подобны константам, "зашитым" в код. Рассмотрим, например, класс изддетмападег. Если внутри клвссв итддетмвпадег создается новый объект класса н1бдет, процссс созлзння объекта нужно передать стратегиям.

Если класс Мддетмападег хранит коллекцию объектов класса изыдет, имеет смысл выразить этот способ хранения в виде стратегии, если при этом кзкой-то специфический механизм хранения не имеет особого приоритета. а1 Глава 1. Разработка классов на основе стратегий В идеале главный класс полностью описывается с помощью отдельных внутренних стратегий. Он делегирует все проектные решения и ограничения стратегиям. Такой класс представляет собой оболочку коллекции стратегий и только дирижирует стра- тегиями, добиваясь нужного режима работы. Недостаток обобщенного главного класса, чрезмерно перегруженного стратегиями, заключается в слишком большом количестве шаблонных параметров.

На практике, если количество параметров больше четырех, с классом становится трудно работать. Тем не менее они оправлывают свое существование, если главный класс обеспечивает сложные и полезные функциональные возможности. Определение класса с помощью оператора суредег представляет собой важный инструмент, позволяющий использовать классы, основанные на стратегиях.

Приме- нение этого оператора — - не просто вопрос удобства. Ои гарантирует упорядоченное использование класса и его легкое сопровождение. Например, рассмотрим следующее определение типа, суредег ввагсясг < итддес, яе~соопсед„ носпескед и!ддесясг; В программе было бы довольно затруднительно использовать длинную специализацию класса звагсясг вместо класса и!ддесясг. Однако утомительность программирования ничего не значит по сравнению с главными проблемами, заключающимися в лоиимпнаи и солроволсдеиии программы. В процессе проектирования опрелеление класса и!ддес может измениться - — например, может применяться стратегия проверки, отличающаяся от стратегии носпескед.

Очень важно, что класс и1ддесясг использует вся программа, а не только жестко закодированная конкретизация класса ввагсясг. Это напоминает различие между вызываемыми и подставляемыми ()и!)пе) функциями. С технической точки зрения подставляемая функция решает ту же задачу, однако создать абстракцию на ее основе невозможно, Раскладывая класс на стратегии, важно найти ореогональяое разложение (оп)зояопа! десопзроз)г)оп). Возникающие при этом стратегии совершенно не зависят друг от друга. Распознать неортогональное разложение очень легко — в нем разные стратегии нуждаются в информации друг о друге. Например, представим себе стратегию дггау в интеллектуальном указателе. Эта стратегия очень проста — она диктует, ссылается интеллектуальный указатель на массив или нет.

Можно определить стратегию лггау так, чтобы она содержала функцию- член тй в1евепслс(т' рсг, цпз!дпед !пс зпдех), а также аналогичную версию для типа сопзс т. В стратегиях, не работающих с массивами, функция е1евепсдс просто не определяется, поэтому попытка ее использовать приведет к ошибке во время компиляции, Функция в1евепслс, в соответствии с определением, данным в разделе !.6, представляет собой факультативную расширенную функциональную возлюжность.

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6480
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее