Что такое поведение объекта

Урок 13
Информационное моделирование на компьютере

Содержание урока

Объектно-информационные модели. Что такое объект

Объектно-информационные модели
Что такое объект

Основные темы:

что такое объект;
— свойства объекта;
— состояние объекта;
— поведение объекта;
— классы объектов;
— наследование;
— иерархические системы классов.

Что такое объект

А сейчас рассмотрим еще один подход к информационному моделированию, который называется объектно-ориентированным подходом. Главным понятием здесь является понятие «объект».

Объект — это некоторая часть окружающей нас действительности, воспринимаемая как единое целое.

С точки зрения восприятия человеком объекты можно разделить на следующие группы:

• осязаемые или видимые объекты (например: кресло, автомобиль, мост);
• образы, созданные мышлением (например: стихотворение, музыкальное произведение, математическая теорема).

Свойства объекта

Объектно-информационная модель должна отражать некоторый набор свойств, присущих объекту моделирования.

Свойства объекта отличают его от других объектов.

Рассмотрим примеры объектов и их свойств (табл. 2.6).

У каждого конкретного объекта свойства имеют определенные значения. В нашем примере добавим значения свойств объектов (табл. 2.7).

Состояние объекта

Состояние объекта характеризуется перечнем всех возможных его свойств и текущими значениями каждого из этих свойств.

Изменение состояния объекта отражается в объектно-информационной модели изменением значений его свойств. Как правило, объекты не остаются неизменными. Например, растет стаж работы учителя И. И. Иванова; на жестком диске изменяется объем занятой памяти; документ может быть перенесен на другой диск, в другую папку и пр. Все эти процессы в объектно-информационной модели отражаются изменениями значений свойств.

Поведение объекта

В объектно-информационной модели отражаются не только свойства, но и поведение объекта.

Поведение объекта — действия, которые могут выполняться над объектом или которые может выполнять сам объект.

Опишем поведение объектов из нашего примера (табл. 2.8).

Классы объектов

А сейчас введем еще одно очень важное понятие для объектно-информационного моделирования — понятие класса.

Класс объектов определяет множество объектов, обладающих одинаковыми свойствами и поведением.

Говорят, что объект является экземпляром какого-либо класса. Все преподаватели обладают одним и тем же набором свойств (имя, стаж работы, читаемый курс) и поэтому образуют класс. Присвоим этому классу имя «Преподаватель». Каждый конкретный преподаватель — экземпляр этого класса (или объект). Следовательно, «Мой преподаватель» — экземпляр класса «Преподаватель». Аналогично можно ввести класс «Жесткий диск», объединив в нем все жесткие диски. Тогда «Мой жесткий диск» — экземпляр класса «Жесткий диск». Если принять во внимание, что класс «Документ» описывает свойства и поведение всех документов, то «Важный документ» — экземпляр класса «Документ».

Таким образом, экземпляр класса (объект) — это конкретный предмет или образ, а класс определяет множество объектов с одинаковыми свойствами и поведением. Класс может порождать произвольное число объектов, однако любой объект относится к строго фиксированному классу.

Объектно-информационные модели имеют иерархическую структуру (дерево). Иерархичность проявляется в том, что некоторый класс сам может быть подмножеством другого, более широкого класса. Вот пример иерархической классификации из биологии: вид «Насекомые» включает в себя два отряда: «Крылатые» и «Бескрылые»; в свою очередь «Крылатые» насекомые делятся на следующие подотряды: «Мотыльки», «Бабочки», «Мухи» и т. д. (рис. 2.14).

Следующая страница Объектно-информационные модели. Наследование

Источник

Лекция 02. Основы объектного подхода¶

Объектное проектирование (по Г.Бучу)¶

Основные методы проектирования¶

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

В течение нескольких десятков лет существования компьютеров было разработано множество подходов к решению задач декомпозиции, абстракции и иерархии

Абстракция¶

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

Шоу: ‘’Абстракция – упрощенное описание системы, при котором одни детали выделяются, а другие опускаются. Хорошей является абстракция, которая выделяет существенные для рассмотрения и использования детали, а несущественные опускает.’‘

Принцип наименьшего удивления: абстракция должна охватывать все

поведение объекта, но не больше и не меньше, не привносить сюрпризов или

побочных эффектов, лежащих вне ее сферы применимости.

Главная задача ОО проектирования – выбор правильного набора абстракций для заданной предметной области.

Инкапсуляция¶

В то время как абстракция описывает внешний интерфейс класса, инкапсуляция занимается его внутренним устройством.

Принцип разделения интерфейса и реализации: в интерфейсной части собрано все, что касается взаимодействия данного объекта с любыми другими объектами; реализация скрывает детали, не имеющие отношения к этому процессу взаимодействия объектов.

Интерфейс объекта не должен зависеть от реализации.

Инкапсуляция – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение.

Инкапсуляция служит для изоляции контрактных обязательств абстракции от их реализации.

Принцип отделения интерфейса от реализации может быть проиллюстрирован следующей

Модульность¶

В Java существуют следующие виды модулей:

Правильное разделение на модули является почти такой же сложной задачей, как и выбор правильного набора абстракций.

Для большинства программ лучшим решением будет сгруппировать логически связанные классы и объекты по отдельным модулям.

В больших системах иногда применяются также другие способы размещения кода по модулям исходя из критерия минимизации времени компиляции.

Читайте также:  Что такое популяция приведите примеры

Иерархия¶

Обычно число абстракций в системе намного превышает умственные способности. Инкапсуляции и модульности оказывается недостаточно.

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

Иерархия – это упорядочение абстракций, расположение их по уровням.

В ОО программировании основными видами сложных систем являются структура классов (is-a, наследование) и структура объектов (part of, агрегация).

Типизация¶

Типизация – это способ защититься от использования объектов одного типа вместо другого (или управлять таким использованием).

Java является строго типизированным языком. Необходимо максимально использовать его возможности проверки типов.

Аналог: разъемы спроектированы так, чтобы части соединялись только правильным образом. Немало изобретательности потрачено на то, чтобы разные части аппаратуры не вставлялись одна в другую

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

Иерархия¶

Типизация¶

Точно определенные и строго типизированные интерфейсы являются фундаментальным инструментом проектирования.

Типизация позволяет находить некоторые ошибки уже на этапе компиляции. Она тем полезнее, чем больше проект.

Строго типизированный интерфейс гарантирует, что компилируются и компонуются только совместимые части программ: эти части могут делать сильные предположения относительно друг друга, при этом выполнение этих предположений гарантируется системой типов

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

Повторное использование¶

Повторное использование предполагает использование уже написанного кода для построения других приложений, т.о. уменьшая время разработки и увеличивая качество этих приложений.

Конечная цель повторного использования – серийное производство ПО путем стыковки готовых компонентов.

Технические сложности повторного использования:

Объекты и отношения¶

Введение¶

Объект моделирует часть окружающей действительности:

Объект проявляет четко выделяемое поведение.

Смит и Токи: ‘’Объект представляет собой конкретный опознаваемый предмет, единицу или сущность (реальную или абстрактную), имеющую четко определенное функциональное назначение в данной предметной области’‘

Более общее определение: Объект – это нечто, имеющее четко очерченные границы.

Примеры объектов¶

Каждый осязаемый предмет может рассматриваться как объект:

Химический процесс – это тоже объект:

т.о. определены явные концептуальные границы, но объект неосязаем

Сфера и куб имеют обычно нерегулярное пересечение. Линия пересечения является объектом, хотя не существует отдельно от сферы и куба.

Объекты могут быть осязаемыми, но иметь размытые физические границы: реки, туман, толпы людей.

Определение объекта¶

Объект обладает состоянием, поведением и идентичностью (уникальностью).

Структура и поведение схожих объектов определяет общий для них класс.

Термины экземпляр класса и объект взаимозаменяемы.

Состояние объекта¶

Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств.

Тот факт, что объект имеет состояние, означает, что он занимает некоторое место в памяти компьютера.

Регистрационные записи о сотрудниках

Описание определяет не объект, а класс, т.к. он не определяет конкретных экземпляров.

Чтобы определить экземпляры, нужно написать следующее:

В памяти эти объекты не пересекаются и занимают каждый свое место.

На практике принято ограничивать доступ к состоянию объекта, а не делать его общедоступным.

Поведение объекта¶

Объекты не существуют изолированно, а подвергаются воздействию или сами воздействуют на другие объекты.

Поведение – это то, как объект действует и реагирует. Поведение выражается в терминах состояния объекта и передачи сообщений.

Операция – это определенное воздействие одного объекта на другой с целью вызвать соответствующую реакцию.

Пример: объект-очередь содержит следующие операции:

В Java операции над объектами называются методами или функциями-членами.

Поведение объекта задается типом операции и текущим состоянием объекта.

Операция – это услуга, которую класс может предоставить своим клиентам.

Наиболее распространенные типы операций:

Идентичность¶

Идентичность объекта¶

Идентичность – это такое свойство объекта, которое отличает его от всех других объектов.

Источником множества ошибок в ОО программировании является неумение отличать имя объекта от самого объекта.

Отношения¶

Сами по себе объекты не представляют никакого интереса: только в процессе их взаимодействия реализуется система.

ОО программа – это «сообщество хорошо воспитанных объектов, которые вежливо просят друг друга об услугах» (Ингалс).

Пример: самолет – это «совокупность элементов, каждый из которых по своей природе стремится упасть на землю, но за счет совместных усилий преодолевающих эту тенденцию» (Галл).

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

Два типа отношений:

Связи¶

Связь – это физическое или концептуальное соединение между объектами.

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

Связь между объектом-клиентом и объектом-сервером необходима для того, чтобы объект-клиент мог запросить услугу у объекта-сервера.

Связь может быть односторонней или двусторонней.

Пусть есть два объекта A и B и связь между ними. Чтобы A мог послать сообщение в B, нужно, чтобы B был видим для A.

На стадии анализа об этом можно не беспокоиться, но на стадии реализации мы должны обеспечить видимость связанных объектов

Четыре способа обеспечить видимость:

Какой из этих способов выбрать – зависит от тактики проектирования.

Читайте также:  Что такое нюк в доте

Агрегация¶

Агрегация описывает отношения целого и его части, приводящие к соответствующей иерархии объектов.

Идя от целого (агрегата), мы можем прийти к его частям (атрибутам). Но, зная указатель на часть, нельзя определить содержащий его объект (если только сведения о нем не являются частью состояния части).

Агрегация может означать физическое вхождение одного объекта в другой (самолет содержит крылья, двигатель и т.д.) или концептуальное (акционер владеет своими акциями, но они не входят в него).

Агрегация иногда предпочтительнее связи, т.к. позволяет скрыть части в целом. Связи иногда предпочтительнее, т.к. они слабее и менее ограничительны. Принимая решение, надо взвесить все.

Источник

NEWOBJ.ru → Введение в ООП с примерами на C# →

2.3. Поля и методы: состояние и поведение

2.3. Поля и методы: состояние и поведение

§ 15. Состояние и поведение. В настоящем разделе мы подробнее разберем особенности использования методов и полей классов. Начнем с определения [Буч 3]:

Состояние объекта (state) – перечень полей объекта (обычно статический) и текущих значений каждого из этих полей (обычно динамический).

Мы оговариваем, что перечень полей обычно статический, то есть зафиксированный в определении класса, так как в некоторых языках перечень полей может быть изменен после создания объекта.

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

В настоящей книге мы используем термин поле ( field ), так как оно используется в C#. При этом в других языках программирования для обозначения полей класса могут применяться и другие термины: переменная-член ( member variable, member ), свойство ( property ). Отметим, что термин свойство, в свою очередь, имеет в C# специфическое значение и будет рассмотрен ниже в настоящей главе.

Приведем определение поведения объекта аналогичное определению состояния объекта [3].

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

Мы оговариваем, что результаты вызова методов зависят от текущего состояния или, по-другому, определяются историей объекта (то есть историей изменения его состояния), так как один и тот же метод в общем случае может возвращать разные результаты в зависимости от состояния.

Сокрытие переменных можно назвать разновидностью более общего понятия – перегрузки – использования в одной и той же области видимости одного и того же имени для обозначения разных элементов языка. Если «элемент языка» – метод, то мы имеем дело с перегрузкой методов.

Перегрузка метода (overloading) – определение в одной и той же области видимости нескольких методов с одинаковым именем, но различающихся количеством или типами параметров.

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

Мы используем термин метод, так как он используется в C#, но в других языках и, в целом, в объектно-ориентированном программировании как синонимы также используются термины функция (function) и функция-член (member function). Исторически термин функция возник в процедурном программировании и обозначал функцию, не связанную ни с каким классом. В объектно-ориентированных языках чтобы различать функции, не связанные ни с каким классом, и функции класса, последние стали называть другими терминами, например, функциями-членами в C++ и методами в C# и Java, оставив термин функция для функций, объявленных вне классов. При этом во многих объектно-ориентированных языках вовсе нет возможности объявить функцию вне какого-либо класса.

§ 16. Неизменяемость. Изменение программистом значений переменных (состояния объектов) в ходе выполнения программы выглядит вполне естественной практикой. Однако существует множество ситуаций, когда желательно так или иначе ограничивать эту возможность.

Приведем еще пример:

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

Значения констант должны быть определены на момент компиляции приложения, поэтому мы не можем их использовать со ссылочными переменными – экземплярами классов 26 :

Этот пример демонстрирует несколько важных особенностей.

Во-первых, в C# неизменяемость ( immutability ) – это свойство класса, а не объекта: или мы объявляем класс как неизменяемый и все его экземпляры будут неизменяемыми. Или мы объявляем класс как изменяемый и все его экземпляры будут также изменяемыми. У нас нет возможности сделать неизменяемым только некоторые экземпляры этого класса. Для сравнения, отметим, что в C++ такая возможность есть: мы можем отметить ключевым слово const переменную или даже параметр метода и это будет значить, что указанную переменная или параметр метода невозможно изменить, но другие, не отмеченные этим словом экземпляры будут изменяемыми, а объект-параметр будет изменяемым вне соответствующего метода.

И последний момент, который мы разберем – особенность копирования неизменяемых объектов. В конструкторе для копирования объекта-центра мы используем копирование ссылки, так как уверены, что переданный объект уже не будет никогда изменен и вполне достаточно иметь всего один экземпляр объекта, на который будут ссылаться множество логически не связанных между собой переменных.

Читайте также:  Что такое номер абонента в личном кабинете уралэнергосбыт

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

Несмотря на широкое использование в ежедневной практике, для объектно-ориентированного программирования неизменяемость – это всегда ограничение, так как исходно переменные в ООП изменяемые ( mutable ). Более того, в теории языков программирования введение неизменяемости для всех объектов – это определение функциональной парадигмы программирования [Мартин 11].

§ 17. Сохраняемость. Иногда требуется сохранить состояние объекта между запусками программы или при перемещении объекта между приложениями. Конечно, строго говоря, при восстановлении сохраненного состояния, мы в действительности создаем новый объект в памяти и присваиваем его полям значения, соответствующе тем, которые были у другого объекта. Однако удобно представлять этот процесс на более высоком уровне абстракции, как сохранение и восстановление.

Сохраняемость – способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства. [Буч 3]

Для сохранения объекта в файл, передачи по сети или другому процессу, как правило, требуется привести значения полей объекта в формат, который будет понятен получателю и преобразовать их в непрерывную последовательность байт. Этот процесс называется сериализацией (от англ. serial – последовательный).

Сериализация (serialization) – преобразование состояния объекта в последовательность байт. Сериализация может быть двоичная, текстовая (JSON, XML) или какая-либо другая. Обратный процесс называется десериализацией.

На следующем рисунке предоставлен пример сериализации объекта в формат JSON.

ORM (object-relational mapping) – «объектно-реляционное сопоставление» – механизм (реализуемый не языком программирования, а сторонними библиотеками), позволяющий сохранять или восстанавливать состояние объекта в приложении в реляционную базу данных.

Следует отметить, что полноценное «зеркалирование» базы данных в объекты памяти помимо трудоемкости, а точнее рутинности этого процесса, сопряжено с множеством концептуальных проблем, прежде всего, связанных с транзакциями. Чтобы преодолеть эти ограничения некоторые базы данных заявляются как объектные, а не реляционные, в том смысле, что при работе с ними мы не транслируем объектную модель программы в реляционную модель БД с помощью ORM, а напрямую сохраняем в БД в объектной модели. Хотя эти направления динамично развиваются, однако пока остаются нишевыми.

§ 18. Свойства в C#. В заключение главы, коротко рассмотрим специальную синтаксическую разновидность методов в C# – свойства. В C# мы можем объявить метод, возвращающий значение заданного типа или принимающий один параметр заданного типа, используя следующий специальный синтаксис, позволяющий пользователям класса обращаться к этим методам, как к полям:

Отметим еще раз, что свойства – специфическая возможность C# и представляет лишь синтаксическое упрощение для объявления и вызова определенных методов, а термин «свойство» вне языка C# часто используется для обозначения обычных полей класса.

Вопросы и задания

1. Дайте определение следующим терминам и сопоставьте русские термины с английскими: состояние объекта, поле, переменная-член, свойство, поведение объекта, метод, перегрузка метода, функция, функция-член, сокрытие локальных переменных неизменяемость, константа; state, field, member variable, property, behavior, method, overloading, member function, immutability.

2. Имеет ли открытый ( public ) метод класса доступ к закрытым ( private ) полям того же класса (1) того же объекта, для которого этот метод был вызван; (2) для другого объекта того же класса, который был передан как параметр этого метода?

3. В чем отличие между классом без состояния ( stateless ) и неизменяемым классом ( immutable )?

4. Почему нельзя перегрузить методы с одинаковыми параметрами, но отличающимися типами возвращаемых значений?

6. Назовите преимущества и недостатки использования неизменяемых типов данных.

9. Является ли массив неизменяемым типом данных в C#?

10. Повышают ли производительность приложений использование const и readonly в C#? Является ли производительность фактором, который необходимо учитывать, применяя механизмы языка программирования по ограничению изменения состояния объектов?

11. Объясните утверждение, что в C# неизменяемость – свойство классов, а не объектов.

12.* Познакомьтесь с подходом «event sourcing» (к сожалению, устоявшегося перевода этого термина нет), в рамках которого мы храним список транзакций, то есть событий об изменении состояния, но не храним само состояние.

13.* Приведите аргументы в пользу следующего тезиса: «Чем большей памятью мы располагаем и чем быстрее становятся наши компьютеры, тем меньше мы нуждаемся в изменяемых состояниях.» [11]

24. Или – в C# – свойства, см. § 18.

25. Системы статического анализа кода не в счет, так как это внешние по отношению к языку программирования инструменты.

26. Строго говоря, структуры C# (struct) также не могут быть константами, хотя и являются значимыми типами.

27. Нередко этот способ сохранения объектов в реляционную БД подвергают критике. Подробный анализ этого вопроса приведен, например, в [Дейт 4]. Однако по факту, именно описанная модель сегодня является самой распространенной.

Источник

Информационный сайт