Лекция
Привет, сегодня поговорим про объект в программировании, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое объект в программировании, объект в ооп, объект в объектно-ориентированном программировании, семантическая сеть, объект в семантической сети , настоятельно рекомендую прочитать все из категории Объектно-ориентированное программирование ООП.
Объект в программировании — некоторая сущность в цифровом пространстве, обладающая определенным состоянием и поведением, имеющая определенные свойства (атрибуты) и операции над ними (методы) . Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые определяют поведение (являются моделью) объекта. Термины «экземпляр класса» и «объект» взаимозаменяемы.
Объект, наряду с понятием класс, является важным понятием объектно-ориентированного подхода. Объекты обладают свойствами наследования, инкапсуляции и полиморфизма .
Термин объект в программном обеспечении впервые был введен в языке Simula и применялся для моделирования реальности .
Любые программные системы предназначены для моделирования реальных систем, поэтому очень важно в каких терминах мы пытаемся описать эти реальные системы. Описание в виде последовательности действий (процедурный подход к программированию) оказался довольно сложным. Объектно-ориентированный подход предлагает описывать системы в виде взаимодействия объектов.
Предположим что нам нужно разработать систему автоматизации банка. Эта система могла быть осуществлена следующим образом:
В операции снятия денег через банкомат участвуют 3 объекта: «клиент Иванов», «банкомат на Тверской» и «счет № 66579801″, который открыт в данном банке для Иванова. Подойдя к банкомату и засунув свою карточку, объект «клиент Иванов» посылает банкомату сообщение «Начать работу». Получив такое сообщение, банкомат выводит на экран какую-нибудь информацию и запрашивает код доступа, т.е объект «банкомат на Тверской» посылает сообщение объекту «клиент Иванов» — «Сообщить идентификационный код». Если идентификация прошла успешно, «клиент Иванов» просит выдать ему 1000 рублей. Он посылает сообщение об этом банкомату, а тот в свою очередь объекту «счет № 66579801″. Приняв это сообщение объект «счет № 66579801″ проверяет есть ли у него 1000 рублей, и, если есть, пересылает разрешение на снятие денег, одновременно уменьшая свой баланс на соответствующую сумму. Банкомат передает деньги и на этом процедура заканчивается.
Объекты выполняют необходимые действия передавая друг другу сообщения.
Описание в виде объектов позволяет определить различные компоненты системы. Те же самые объекты — «счет № 66579801″ и «клиент Иванов» — будут учавствовать в другой операции при которой клиент приходит в отделение банка для снятие или зачисления денег на свой счет.
Приведенная ситуация является ярким примером сущности понятия « объект в ооп «. Сложно дать четкое определение этому понятию, приведу цитату этого определения Ивара Якобсона:
Объект в ООП — это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния.
объект в объектно-ориентированном программировании — это модель или абстракция реальной сущности в программной системе. Предмет моделирования при построении объекта в ООП может быть различным. Например, могут существовать следующие типы абстракции, используемые при построении объекта:
Экземпляр класса (англ. instance) — это описание конкретного объекта в памяти. Класс описывает свойства и методы, которые будут доступны у объекта, построенного по описанию, заложенному в классе. Экземпляры используются для представления (моделирования) конкретных сущностей реального мира. Например, экземпляром класса стиральных машин может быть ваша стиральная машина, имеющая следующие свойства: компания-производитель «Вятка», наименование модели «Вятка-автомат», серийный номер изделия ВЯТ454647, емкость 20 л. В отличие от имени класса, имя экземпляра обычно начинается со строчной буквы.
Инстанцирование (англ. instantiation) — создание экземпляра класса. В отличие от слова «создание», применяется не к объекту, а к классу. То есть, говорят: (в виртуальной среде) создать экземпляр класса или, другими словами, инстанцировать класс. Порождающие шаблоны используют полиморфное инстанцирование.
Анонимный объект (англ. anonymous object) — это объект, который принадлежит некоторому классу, но не имеет имени.
Инициализация (англ. initialization) — присвоение начальных значений полям объекта.
Время жизни объекта — время с момента создания объекта (конструкция) до его уничтожения (деструкция).
Важным понятием для объектов является шаблон проектирования . Шаблон проектирования предоставляет шаблон многократного использования для решения общей проблемы. Следующие описания объектов являются примерами некоторых из наиболее распространенных шаблонов проектирования для объектов.
За исключением прототипно-ориентированных языков вроде Lua и JavaScript, где понятие «класс» не используется вовсе, в большинстве объектно-ориентированных языков программирования (таких как Java, C++ или C#), объекты являются экземплярами некоторого заранее описанного класса.
Объекты в таких языках создаются с помощью конструктора класса и уничтожаются либо с помощью деструктора класса (например, в C++), либо автоматически с использованием сборщика мусора (например, в Java и C#), либо используя внутренний счетчик ссылок на объект и сообщения («dealloc» в Objective-C). (C# поддерживает деструкторы, но они вызываются сборщиком мусора.) Объект хранится в виде данных всех его полей и ссылок на таблицу виртуальных методов и RTTI своего класса. Класс определяет набор функций и служебной информации для построения объекта, в том числе необходимый объем памяти для хранения объекта.
В языке Python все значения являются объектами, даже классы. В этом языке можно построить класс, экземплярами которого будут классы. Такие классы называются метаклассами.
// Определение класса объекта
class Person {
public :
Person ( string name , int age )
int getName () const ;
private :
string name ;
int age ;
};
// Определение объекта
Person anna("Anna" , 4 );
Пример создания нового объекта и работы с ним в языке программирования Java:
// Создание экземпляра класса ArrayList с именем list
ArrayList list = new ArrayList();
// Добавление экземпляров класса Integer в объект list
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
Подразумевается, что класс ArrayList
уже описан в программном коде и его описание содержит определение для конструктора класса и метода add
.
Каждый объект в ООП характеризуется своим состоянием. Состояние банковского счета — это сумма лежащих на нем денег. Состояние банкомата включает в себя состояние «включен» или «выключен», готов или не готов к принятию запроса, наличию денег в банкомате.
Состояние объекта характеризуется текущим значением его атрибутов. В нашем примере у счета есть атрибут -баланс. В простейшем случае он отражается числом — количеством рублей и копеек на счету. Операция снятия или зачисления на счет изменяет баланс и атрибут объекта «счет № 66579801″. У объекта «банкомат на Тверской» есть несколько атрибутов. Количество денег в банкомате может характеризоваться числом. Состояние «включен» или «выключен» и состояние «готов или не готов к принятию запроса» — логическим значением.
Стоит заметить, что атрибутами объекта в ООП могут быть не только простейшие значения (число, логическое значение и т.д.), но и сложные величины или другие объекты. Например, наш банк для целей контроля будет хранить историю всех транзакций. Транзакция — это объект, который имеет атрибуты (характеристики) тип транзакции, сумма переведенных денег, место совершения и имена контрагентов этой операции. У объекта «счет № 66579801″ появится новый атрибут — «история транзакций», который будет состоять из набора объектов-транзакций.
Иногда нужно идентифицировать объекты в ООП, т.е., если имеются два объекта, как можно определить что эти объекты разные. Например, такая процедура очень важна для идентификации банковского счета (объект «счет № 66579801″) клиента банка Иванова.
На самом деле существует два вопроса: равны ли два объекта или тождественны.
Обычно для идентификации применяются специальные атрибуты объектов — идентификаторы. Например, для объекта «счет № 66579801″ идентификатором является его атрибут «номер счета», который является уникальным (соблюдается требование предметной области).
В свою очередь, зная идентификаторы объектов можно точно определить являются ли они тождественными или нет.
Важнейшей характеристикой объекта в ООП является описание того, как он может взаимодействовать с окружающим миром. Это описание называетсяинтерфейсом объекта.
Объекты в ООП взаимодействуют между собой с помощью сообщений. Принимая сообщение, объект выполняет соответствующее действие. Эти действия обычно называются методами.
В нашем примере у объекта «счет № 66579801″ есть следующие методы — «снять деньги со счета» и «положить деньги на счет». Эти два метода и составляют интерфейс объекта. У объекта «клиент Иванов» имеется метод «Сообщить свой код». А у объекта «банкомат на Тверской » есть методы «начать работу», «принять деньги», «выдать деньги».
У объекта «счет № 66579801″ есть еще один атрибут «баланс». Является ли он частью интерфейса объекта? Интерфейс — это внешнее описание объекта. При разработке банковской системы и, в частности, объекта «счет», мы решаем вопрос: является ли баланс необходимой информацией для других объектов? Очевидно, что является. Тогда нам нужно ответить на еще один вопрос: что именно нужно другим объектам? Остаток денег на счете. В таком случае необходимо добавить еще один метод «сообщить остаток денег на счете» к объекту «счет» , и его интерфейс будет теперь состоять из трех методов.
Таким образом, атрибут баланс не является непосредственно частью интерфейса. Другие объекты могут обратиться к этому атрибуту только опосредственно, с помощью метода «сообщить остаток на счете» (тем самым они не могут непосредственно менять значение этого атрибута).
Наряду с методами и атрибутами, входящими в интерфейс и доступными другим объектам, у объекта могут быть атрибуты предназначенные для внутреннего использования (к ним может обращаться только сам объект). Например, у банкомата очень сложная внутренняя структура, т.е. он имеет огромное количество атрибутов. Но для банковской системы они не важны, и ни клиент, ни объект «счет» не могут к ним обратиться. Они не входят в интерфейс объекта «банкомат».
В любой системе объекты создаются, функционируют и уничтожаются. В программировании существуют два способа уничтожения объектов:
Но в тоже время могут существовать объекты, для которых необходимо восстанавливать их предыдущее состояние при новом запуске программы. Для работы с такими объектами применяется метод сериализации, когда значения всех атрибутов записываются, и, при необходимости восстановления объекта, считываются. Схема данного метода представлена ниже.
Существуют, также, и постоянные объекты, которые не уничтожаются при завершении программы и не создаются заново при ее запуске (объекты объектно-ориентированной базы данных). Программа и при первом и при втором запуске обращается к одному и тому же объекту, хранящемуся в постоянной памяти.
Со временем жизни и идентификации объектов тесно связано еще одно понятие — понятие объектов первого и второго сорта или равноправия объектов в системе.
Объект считается самостоятельным или первого сорта, в том случае, если он обладает всеми признаками идентификации объектов, принятыми в данной объектной среде, и время его жизни не связано со временем жизни породившего его объекта.
Объект может состоять из других объектов. Например, банкомат содержит большое количество узлов (атрибутов), т.е он включает в свой состав другие объекты. При этом, банкомат может непосредственно включать в себя другие объекты или же только ссылаться на них.
Semantic Web , по существу , основа распределенных объектов. Две ключевые технологии в семантической сети - это язык веб-онтологий (OWL) и структура описания ресурсов (RDF). RDF предоставляет возможность определять основные объекты - имена, свойства, атрибуты, отношения, - которые доступны через Интернет. OWL добавляет более богатую объектную модель, основанную на теории множеств, которая обеспечивает дополнительные возможности моделирования, такие как множественное наследование.
Объекты OWL не похожи на стандартные крупномасштабные распределенные объекты, доступ к которым осуществляется через язык определения интерфейсов. Такой подход не подходит для Интернета, потому что Интернет постоянно развивается и стандартизации одного набора интерфейсов достичь трудно. Объекты OWL, как правило, похожи на типы объектов, используемые для определения моделей предметной области в языках программирования, таких как Java и C ++ .
Однако есть важные различия между объектами OWL и объектами традиционного объектно-ориентированного программирования. Традиционные объекты компилируются в статические иерархии обычно с единичным наследованием, но объекты OWL являются динамическими. Объект OWL может изменять свою структуру во время выполнения и может стать экземпляром новых или других классов.
Еще одно важное отличие заключается в том, как модель обрабатывает информацию, которой в настоящее время нет в системе. Объекты программирования и большинство систем баз данных используют « предположение о замкнутом мире ». Если факт неизвестен системе, этот факт считается ложным. Объекты семантической паутины используют предположение об открытом мире , утверждение считается ложным только в том случае, если есть актуальная релевантная информация о том, что оно ложно, в противном случае оно считается неизвестным, ни истинным, ни ложным.
Объекты OWL на самом деле больше всего похожи на объекты в фреймовых языках искусственного интеллекта, таких как KL-ONE и Loom.
В следующей таблице традиционные объекты объектно-ориентированных языков программирования, таких как Java или C ++, противопоставляются объектам семантической сети:
Объекты ООП | Объекты семантической сети |
---|---|
Классы рассматриваются как типы для экземпляров. | Классы рассматриваются как наборы индивидов. |
Экземпляры не могут изменять свой тип во время выполнения. | Членство в классе может измениться во время выполнения. |
Список классов полностью известен во время компиляции и не может быть изменен после этого. | Классы можно создавать и изменять во время выполнения. |
Компиляторы используются во время сборки. Ошибки времени компиляции указывают на проблемы. | Reasoners можно использовать для классификации и проверки согласованности во время выполнения или сборки. |
Классы кодируют большую часть своего значения и поведения с помощью императивных функций и методов. | Классы делают свое значение явным в терминах операторов OWL. Никакой императивный код не может быть добавлен. |
Экземпляры анонимны постольку, поскольку к ним нельзя легко обратиться извне выполняющейся программы. | Все именованные ресурсы RDF и OWL имеют уникальный URI, по которому на них можно ссылаться. |
Закрытый мир: если недостаточно информации, чтобы доказать истинность утверждения, то оно считается ложным. | Открытый мир: если информации недостаточно, чтобы доказать истинность утверждения, оно может быть истинным или ложным. |
Надеюсь, эта статья про объект в программировании, была вам полезна, счастья и удачи в ваших начинаниях! Надеюсь, что теперь ты понял что такое объект в программировании, объект в ооп, объект в объектно-ориентированном программировании, семантическая сеть, объект в семантической сети и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Объектно-ориентированное программирование ООП
Комментарии
Оставить комментарий
Объектно-ориентированное программирование ООП
Термины: Объектно-ориентированное программирование ООП