Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++

Б. Страуструп - Язык программирования С++ (1119446), страница 95

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

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

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

Интерфейс, по своей сути, обязан показать какие измененияоказались существенными в данном контексте. Интерфейс более высокого уровня оставляет большесвободы для изменения реализации, но может ухудшить характеристики программы. Более того,хорошая реализация зависит только от минимального числа действительно существенных классов.Любой из этих классов можно использовать без накладных расходов, возникающих на этапе трансляцииили выполнения, и вызванных приспособлением к другим, "сходным" классам программы. Подводяитог, можно указать такие условия, которым должен удовлетворять конкретный тип:[1]полностью отражать данное понятие и метод его реализации;[2]с помощью подстановок и операций, полностью использующих полезные свойства понятия иего реализации, обеспечивать эффективность по скорости и памяти, сравнимую с "ручнымипрограммами";[3]иметь минимальную зависимость от других классов;[4]быть понятным и полезным даже изолированно.Все это должно привести к тесной связи между пользователем и программой, реализующей конкретныйтип.

Если в реализации произошли изменения, программу пользователя придется перетранслировать,336Бьерн Страуструп.Язык программирования С++поскольку в ней наверняка содержатся вызовы функций, реализуемые подстановкой, а такжелокальные переменные конкретного типа.Для некоторых областей приложения конкретные типы обеспечивают основные типы, прямо непредставленные в С++, например: комплексные числа, вектора, списки, матрицы, даты, ассоциативныемассивы, строки символов и символы, из другого (не английского) алфавита.

В мире, состоящем изконкретных понятий, на самом деле нет такой вещи как список. Вместо этого есть множество списочныхклассов, каждый из которых специализируется на представлении какой-то версии понятия список.Существует дюжина списочных классов, в том числе: список с односторонней связью; список сдвусторонней связью; список с односторонней связью, в котором поле связи не принадлежит объекту;список с двусторонней связью, в котором поля связи не принадлежат объекту; список с одностороннейсвязью, для которого можно просто и эффективно определить входит ли в него данный объект; список сдвусторонней связью, для которого можно просто и эффективно определить входит ли в него данныйобъект и т.д.Название "конкретный тип" (CDT - concrete data type, т.е.

конкретный тип данных) , было выбрано поконтрасту с термином "абстрактный тип" (ADT - abstract data type, т.е. абстрактный тип данных).Отношения между CDT и ADT обсуждаются в $$13.3.Существенно, что конкретные типы не предназначены для явного выражения некоторой общности. Так,типы slist и vector можно использовать в качестве альтернативной реализации понятия множества, но вязыке это явно не отражается. Поэтому, если программист хочет работать с множеством, используетконкретные типы и не имеет определения класса множество, то он должен выбирать между типами slistи vector.

Тогда программа записывается в терминах выбранного класса, скажем, slist, и если потомпредпочтут использовать другой класс, программу придется переписывать.Это потенциальное неудобство компенсируется наличием всех "естественных" для данного классаопераций, например таких, как индексация для массива и удаление элемента для списка. Эти операциипредставлены в оптимальном варианте, без "неестественных" операций типа индексации списка илиудаления массива, что могло бы вызвать путаницу. Приведем пример:void my(slist& sl){for (T* p = sl.first(); p; p = sl.next()){// мой код}// ...}void your(vector& v){for (int i = 0; i<v.size(); i++){// ваш код}// ...}Существование таких "естественных" для выбранного метода реализации операций обеспечиваетэффективность программы и значительно облегчает ее написание.

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

Обычно, вообще, невозможно свести сходныефрагменты программы в один.Пользователь, обращающийся к некоторой функции, должен точно указать тип объекта, с которымработает функция, например:337Бьерн Страуструп.Язык программирования С++void user(){slist sl;vector v(100);my(sl);your(v);my(v);your(sl);}// ошибка: несоответствие типа// ошибка: несоответствие типаЧтобы компенсировать жесткость этого требования, разработчик некоторой полезной функции долженпредоставить несколько ее версий, чтобы у пользователя был выбор:void my(slist&);void my(vector&);void your(slist&);void your(vector&);void user(){slist sl;vector v(100);my(sl);your(v);my(v);your(sl);}// теперь нормально: вызов my(vector&)// теперь нормально: вызов your(slist&)Поскольку тело функции существенно зависит от типа ее параметра, надо написать каждую версиюфункций my() и your() независимо друг от друга, что может быть хлопотно.С учетом всего изложенного конкретный тип, можно сказать, походит на встроенные типы.Положительной стороной этого является тесная связь между пользователем типа и его создателем, атакже между пользователями, которые создают объекты данного типа, и пользователями, которыепишут функции, работающие с этими объектами.

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

Большую помощь здесь оказывают функции-подстановки.Если сделать открытыми переменные, являющиеся членами, с помощью описания public, илинепосредственно работать с ними с помощью функций, которые устанавливают и получают значенияэтих переменных, то почти всегда это приводит к плохому результату. Конкретные типы должны бытьвсе-таки настоящими типами, а не просто программной кучей с нескольким функциями, добавленнымиради удобства.13.3 Абстрактные типыСамый простой способ ослабить связь между пользователем класса и его создателем, а также междупрограммами, в которых объекты создаются, и программами, в которых они используются, состоит ввведении понятия абстрактных базовых классов.

Эти классы представляют интерфейс со множествомреализаций одного понятия. Рассмотрим класс set, содержащий множество объектов типа T:class set {public:virtual void insert(T*) = 0;virtual void remove(T*) = 0;338Бьерн Страуструп.virtualvirtualvirtualvirtualЯзык программирования С++int is_member(T*) = 0;T* first() = 0;T* next() = 0;~set() { }};Этот класс определяет интерфейс с произвольным множеством (set), опираясь на встроенное понятиеитерации по элементам множества.

Здесь типично отсутствие конструктора и наличие виртуальногодеструктора, см. также $$6.7. Рассмотрим пример:class slist_set : public set, private slist {slink* current_elem;public:void insert(T*);void remove(T*);int is_member(T*);virtual T* first();virtual T* next();slist_set() : slist(), current_elem(0) { }};class vector_set : public set, private vector {int current_index;public:void insert(T*);void remove(T*);int is_member(T*);T* first() { current_index = 0; return next(); }T* next();vector_set(int initial_size): array(initial_size), current_index(0) { }};Реализация конкретного типа используется как частный базовый класс, а не член класса. Это сделано идля удобства записи, и потому, что некоторые конкретные типы могут иметь защищенный интерфейс сцелью предоставить более прямой доступ к своим членам из производных классов. Кроме того,подобным образом в реализации могут использоваться некоторые классы, которые имеют виртуальныефункции и не являются конкретными типами.

Только с помощью образования производных классовможно в новом классе изящно переопределить (подавить) виртуальную функцию класса реализации.Интерфейс определяется абстрактным классом.Теперь пользователь может записать свои функции из $$13.2 таким образом:void my(set& s){for (T* p = s.first(); p; p = s.next()){// мой код}// ...}void your(set& s){for (T* p = s.first(); p; p = s.next()){// ваш код}// ...}Стало очевидным сходство между двумя функциями, и теперь достаточно иметь только одну версию339Бьерн Страуструп.Язык программирования С++для каждой из функций my() или your(), поскольку для общения с slist_set и vector_set обе версиииспользуют интерфейс, определяемый классом set:void user(){slist_set sl;vector_set v(100);my(sl);your(v);my(v);your(sl);}Более того, создатели функций my() и your() не обязаны знать описаний классов slist_set и vector_set, ифункции my() и your() никоим образом не зависят от этих описаний. Их не надо перетранслировать иликак-то изменять, ни если изменились классы slist_set или vector_set ни даже, если предложена новаяреализация этих классов.

Изменения отражаются лишь на функциях, которые непосредственноиспользуют эти классы, допустим vector_set. В частности, можно воспользоваться традиционнымприменением заголовочных файлов и включить в программы с функциями my() или your() файлопределений set.h, а не файлы slist_set.h или vector_set.h.В обычной ситуации операции абстрактного класса задаются как чистые виртуальные функции, и такойкласс не имеет членов, представляющих данные (не считая скрытого указателя на таблицувиртуальных функций).

Это объясняется тем, что добавление невиртуальной функции или члена,представляющего данные, потребует определенных допущений о классе, которые будут ограничиватьвозможные реализации. Изложенный здесь подход к абстрактным классам близок по духутрадиционным методам, основанным на строгом разделении интерфейса и его реализаций.Абстрактный тип служит в качестве интерфейса, а конкретные типы представляют его реализации.Такое разделение интерфейса и его реализаций предполагает недоступность операций, являющихся"естественными" для какой-то одной реализации, но не достаточно общими, чтобы войти в интерфейс.Например, поскольку в произвольном множестве нет упорядоченности, в интерфейс set нельзявключать операцию индексирования, даже если для реализации конкретного множества используетсямассив.

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

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

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