Главная » Просмотр файлов » Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++

Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 23

Файл №1158635 Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++) 23 страницаГради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635) страница 232019-09-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Источником множества ошибок вобъектно-ориентированном программировании является неумение отличатьимя объекта от самого объекта.Примеры. Начнем с определения точки на плоскости.struct Point {int x;int у;Point() : x(0), у(0) {}Point(int xValue, int yValue) : x(xValue), y(yValue) {)};Мы определили point как структуру, а не как полноценный класс.Правило, на основании которого мы так поступили, очень просто. Еслиабстракция представляет собой собрание других объектов без какого-либособственного поведения, мы делаем ее структурой. Однако, когда нашаабстракция подразумевает более сложное поведение, чем простой доступ кполям структуры, то нужно определять класс.

В данном случае абстракцияpoint - это просто пара координат (х,у). Для удобства предусмотрено дваконструктора: один инициализирует точку нулевыми значениями координат, адругой - некоторыми заданными значениями.Теперь определим экранный объект (Displayltem). Это абстракциядовольно обычна для систем с графическим интерфейсом (GUI) - она являетсябазовым классом для всех объектов, которые можно отображать в окне.

Мыхотим сделать его чем-то большим, чем просто совокупностью точек. Надо,чтобы клиенты могли рисовать, выбирать объекты и перемещать их по экрану,а также запрашивать их положение и состояние. Мы записываем нашуабстракцию в виде следующего объявления на C++:class Displayltem {public:Displayltem();Displayltem(const Point& location);virtual ~Displayltem();virtual void draw();virtual void erase();virtual void select();virtual void unselect();virtual void move(const Point& location);int isSelected() const;Point location() const;int isUnder(const Point& location) const;protected:…};В этом объявлении мы намеренно опустили конструкторы, а такжеоператоры для копирования, присваивания и проверки на равенство. Их мыоставим до следующего раздела.Мы ожидаем, что у этого класса будет много наследников, поэтомудеструктор и все модификаторы объявлены виртуальными.

В особенности этоотносится к draw. Напротив, селекторы скорее всего не будутпереопределяться в подклассах. Заметьте, что один из них, isUnder, долженвычислять, накрывает ли объект данную точку, а не просто возвращатьзначение какого-то свойства.Объявим экземпляры указанных классов:DisplayItem item1;Displayltem* item2 = new DisplayItem(Point(75, 75));Displayltem* item3 = new Displayltem(Point(100, 100));Displayltem* item4 = 0;Рис.

3-1 а показывает, что при выполнении этих операторов возникаютчетыре имени и три разных объекта. Конкретно, в памяти будут отведенычетыре места под имена item1, item2, item3, item4. При этом iteml будетименем объекта класса Displayltem, а три других будут указателями. Крометого, лишь item2 и item3 будут на самом деле указывать на объекты классаDisplayltem. У объектов, на которые указывают item2 и item3, к тому же нетимен, хотя на них можно ссылаться "разыменовывая" соответствующиеуказатели: например, *item2.

Поэтому мы можем сказать, что item2указывает на отдельный объект класса Displayltem, наРис. 3-1. Идентичность объектовимя которого мы можем косвенно ссылаться через *item2. Уникальнаяидентичность (но не обязательно имя) каждого объекта сохраняется на всевремя его существования, даже если его внутреннее состояние изменилось.Эта ситуация напоминает парадокс Зенона о реке: может ли река быть той жесамый, если в ней каждый день течет разная вода?Рассмотрим результат выполнения следующих операторов (рис. 3-1 б):item1.move(item2->location());item4 = item3;item4->move(Point(38, 100));Объект iteml и объект, на который указывает item2, теперьотносятся к одной и той же точке экрана.

Указатель item4 стал указывать натот же объект, что и item3. Кстати, заметьте разницу между выражениями"объект item2" и "объект, на который указывает item2". Второе выражениеболее точно, хотя для краткости мы часто будем использовать их каксинонимы.Хотя объект item1 и объект, на который указывает item2, имеютодинаковое состояние, они остаются разными объектами.

Кроме того, мыизменили состояние объекта *item3, использовав его новое косвенное имяitem4. Эта ситуация, которую мы называем структурной зависимостью,подразумевая под этим ситуацию, когда объект именуется более чем однимспособом несколькими синонимичными именами. Структурная зависимостьпорождает в объектно-ориентированном программировании много проблем.Трудность распознания побочных эффектов при действиях с синонимичнымиобъектами часто приводит к "утечкам памяти", неправильному доступу кпамяти, и, хуже того, непрогнозируемому изменению состояния.

Например,если мы уничтожим объект через указатель item3, то значение указателяitem4 окажется бессмысленным; эта ситуация называется повисшей ссылкой.На рис. 3-1в иллюстрируется результат выполнения следующих действий:item2 = &item1;item4->move(item2->location());В первой строке создается синоним: item2 указывает на тот жеобъект, что и iteml.

Во второй доступ к состоянию iteml получен через этотновый синоним. К сожалению, при этом произошла утечка памяти, - объект,на который первоначально указывала ссылка item2, никак не именуется нипрямо, ни косвенно, и его идентичность потеряна. В Smalltalk и CLOS память,отведенная под объекты, будет вновь возвращена системе сборщиком мусора.В языках типа C++ такая память не освобождается, пока не завершитсяпрограмма, создавшая объект. Такие утечки памяти могут вызвать и простонеудобство, и крупные сбои, особенно, если программа должна непрерывноработать длительное время.5Копирование, присваивание и равенство.

Структурная зависимостьимеет место, когда объект имеет несколько имен. В наиболее интересныхприложениях объектно-ориентированного подхода использование синонимовпросто неизбежно. Например, рассмотрим следующие две функции:void highLight(DisplayItem& i);void drag(DisplayItem i); // ОпасноЕсли вызвать первую функцию с параметром iteml, будет созданпсевдоним:формальный параметр i означает указатель на фактический параметр,и следовательно iteml и i именуют один и тот же объект во времявыполнения функции.

При вызове второй функции с аргументом iteml ейпередается новый объект, являющийся копией iteml: i обозначаетсовершенно другой объект, хотя и с тем же состоянием, что и iteml. В C++различается передача параметров по ссылке и по значению. Надо следить заэтим, иначе можно нечаянно изменить копию объекта, желая изменить самобъект.6 Как мы увидим в следующем разделе, передача объектов по ссылке вC++ необходима для программирования полиморфного поведения.

В общемслучае, передача объектов по ссылке крайне желательна для достаточносложных объектов, поскольку при этом копируется ссылка, а не состояние, иследовательно, достигается большая эффективность (за исключением техслучаев, когда передаваемое значение очень простое).В некоторых обстоятельствах, однако, подразумевается именнокопирование. В языках типа C++ семантику копирования можноконтролировать. В частности, мы можем ввести копирующий конструктор вопределение класса, как в следующем фрагменте кода, который можно былобы включить в описание класса Displayitem:Displayltem(const Displayltem&);В C++ копирующий конструктор может быть вызван явно (как частьописания объекта) или неявно (с передачей объекта по значению). Отсутствиеэтого специального конструктора вызывает копирующий конструктор,5Представьте себе утечку памяти в программе управления спутником или сердечнымстимулятором.

Перезапуск компьютера на спутнике в нескольких миллионахкилометров от Земли очень неудобен. Аналогично, непредсказуемая сборка мусора впрограмме, управляющей стимулятором, может оказаться смертельным для пациента.В таких случаях разработчики систем реального времени предпочитаютвоздерживаться от динамического распределения памяти.6В Smalltalk семантика передачи объектов методам в качестве аргументов является посвоему духу эквивалентом передачи параметра по ссылке в C++.действующий по умолчанию, который копирует объект поэлементно. Однако,когда объект содержит ссылки или указатели на другие объекты, такаяоперация приводит к созданию синонимов указателей на объекты, что делаетпоэлементное копирование опасным. Мы предлагаем эмпирическое правило:разрешать неявное размножение путем копирования только для объектов,содержащих исключительно примитивные значения, и делать его явным дляболее сложных объектов.Это правило поясняет то, что некоторые языки называют"поверхностным" и "глубоким" копированием.

Чтобы копировать объект, вязыке Smalltalk введены методы shallowCopy (метод копирует только объект,а состояние является разделяемым) и deepCopy (метод копирует объект исостояние, если нужно - рекурсивно). Переопределяя эти методы для классов сагрегацией, можно добиваться эффекта "глубокого" копирования для однихчастей объекта, и "поверхностного" копирования остальных частей.Присваивание - это, вообще говоря, копирование.

В C++ его смыслтоже можно изменять. Например, мы могли бы добавить в определение классаDisplayItem следующую строку:virtual DisplayItem& operator=(const Displayltem&);Этот оператор намеренно сделан виртуальным, так как ожидается, чтоподклассы будут его переопределять. Как и в случае копирующегоконструктора, копирование можно сделать "глубоким" и "поверхностным".Если оператор присваивания не переопределен явно, то по умолчанию объекткопируется поэлементно.С вопросом присваивания тесно связан вопрос равенства. Хотя вопроскажется простым, равенство можно понимать двумя способами.

Во-первых,два имени могут обозначать один и тот же объект. Во-вторых, это может бытьравенство состояний у двух разных объектов. В примере на рис. 3-1в обаварианта тождественности будут справедливы для iteml и item2. Однако дляitem2 и item3 истинным будет только второй вариант.В C++ нет предопределенного оператора равенства, поэтому мыдолжны определить равенство и неравенство, объявив эти операторы приописании:virtual int operator=(const Displayltem&) const;int operator!=(const Displayltem&) const;Мы предлагаем описывать оператор равенства как виртуальный (таккак ожидаем, что подклассы могут переопределять его поведение), иописывать оператор неравенства как невиртуальный (так как хотим, чтобы онвсегда был логическим отрицанием равенства: подклассам не следуетпереопределять это).Аналогичным образом мы можем создавать операторы сравненияобъектов типа >= и <=.Время жизни объектов.

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

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

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