Файл: Основные понятия объектно-ориентированного программирования (Появление объектно-ориентированного программирования).pdf
Добавлен: 28.03.2023
Просмотров: 249
Скачиваний: 9
4. C++
5. Cyclone
6. D
7. Delphi
8. Dylan
9. Eiffel
10. F#
11. Io
12. Java
13. JavaScript
14. JScript .NET
15. Object Pascal
16. Objective-C
17. Perl
18. PHP
19. PowerBuilder
20. Python
21. Ruby
22. Scala
23. Simula
24. Smalltalk
25. Swift
26. Vala
27. VB.NET
28. Visual DataFlex
29. Xbase++
30. X++
Кроме ОО-языков общего назначения существуют и узкоспециализированные ОО-языки.
Ада — язык программирования, созданный в 1979—1980 годах в ходе проекта Министерством обороны США с целью разработать единый язык программирования для встроенных систем (то есть систем управления автоматизированными комплексами, функционирующими в реальном времени). Имелись в виду прежде всего бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.). Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области. Язык назван в честь Ады Лавлейс. [2, c.672]
C# — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота как язык разработки приложений для платформы Microsoft.NET Framework. Впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.
Объектно-ориентированное программирование (ООП) [1] является результатом развития процедурного программирования, однако предлагает другой подход к разработке программ. В ООП данные и методы объединяются в классы, то есть между ними устанавливается связь. На основе классов создаются объекты – главные элементы программы. В процессе выполнения программы объекты взаимодействуют между собой, т.е. обмениваются информацией. ООП позволяет также преодолеть трудности при создании сложных программ.
Буч Г. [5] дает следующее определение предмета курсовой работы: «Объектно-ориентированное программирование – это метод программирования, основанный на представлении программы в виде совокупности взаимодействующих объектов, каждый из которых является экземпляром определенного класса, а классы являются членами определенной иерархии наследования».[3, с. 69] Он подчеркивает, что программа будет объектно-ориентированной, если соответствует трем условиям: использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы; каждый объект является экземпляром определенного класса; классы образуют иерархии.[3, с. 69]
Основную понятийную роль играют абстрактные сущности, являющиеся умозрительными конструкциями. Вопрос о том, включать абстрактные сущности в состав объективной реальности или нет, оставим философам. Заметим лишь, что абстрактные сущности не имеют места во времени и пространстве.
Примеры абстрактных сущностей: число 7г; прямой угол; точка плоскости с координатами (—1,2). Математика — это язык описания абстрактных сущностей. Математическая модель — конструкция, приближенно отражающая часть реального мира, опираясь на абстрактные сущности. Занимаясь программированием, разработчики вынуждены строить математические модели. Для описания конкретных сущностей вводятся атрибуты — соответствия с абстрактными сущностями, позволяющие «закодировать» качества конкретных сущностей и встроить их в математическую модель (что и составляет суть абстракции, так как «за бортом» такого описания остается множество малозначимых или вовсе неизвестных деталей). Примерами атрибутов могут служить физические величины, цвета, количества составляющих частей.[10]
В математике абстрактные сущности организованы в абстрактные виды. Абстрактные виды могут быть определены путем ввода наборов аксиом. Примеры абстрактных видов: двоичное дерево, абелева группа, натуральное число, цвет (в рамках некоторой цветовой модели). Наборы атрибутов позволяют выделить конкретные виды. Абстрагируясь от видов, можно вводить роды сходных видов. Примеры абстрактных родов: линейное пространство, число, множество, граф.[10] Примеры конкретных родов: участник дорожного движения, неподвижный объект, предмет посуды. Сущность принадлежит одному виду, но может быть отнесена к нескольким родам. При этом не существует единственно правильного членения сущностей на виды и роды, все зависит от конкретики строимой модели и решаемых задач. В объектно-ориентированном программировании мы имеем значения, которые представляют абстрактные сущности. Можно считать, что значения как таковые неизменны (число 3 всегда и везде одно и то же). В разное время одно и то же имя просто «привязано» к тому или иному значению, либо (в процедурном программировании) значение может храниться в переменной (которая играет роль места размещения представления значения). Типы значений отвечают абстрактным видам (в языках с автоматическим выводом типов явно указанные «типы» могут на деле отвечать абстрактным родам). [21] Как правило, типы описываются как абстрактные типы данных. Пример: целые числа и арифметические операции.
Множество значений может быть формально бесконечным и не существовать физически. В рамках обобщенного программирования абстрактные роды (и иногда виды, если им не отвечают имеющиеся в распоряжении типы) называют концепциями (англ. concept). Типы, вкладывающиеся в некоторую концепцию, называются моделями этой концепции. В объектно-ориентированном программировании объекты отвечают конкретным сущностям. Множества объектов всегда конечны и разбиваются на классы, определяющие полный (в рамках нашей модели) набор атрибутов некоторого конкретного вида. [25] Класс можно считать «чертежом», по которому можно создать объект нужного вида и по которому же ненужный более объект можно корректно удалить. В свою очередь, абстрагируясь от конкретики создания, существования (физического представления) и удаления объектов, только на основе ограниченного набора атрибутов можно определить интерфейс — отражение конкретного рода в объектно-ориентированном проектировании. Класс может служить реализацией набора интерфейсов.
В свою очередь, объекты также кодируются конечными последовательностями бит. [10] Свойство идентичности объектов выполняется благодаря уникальным адресам, по которым их представления расположены в компьютерной памяти. Поэтому, даже если есть два одинаковых представления, но они расположены по разным адресам, они отвечают двум разным объектам (представляют две разные конкретные сущности). [11] Копирование объекта создает новый объект. Более того, исходный объект и копия могут иметь различные представления, так как объект может состоять из других объектов, которые могут находиться в отдельной части памяти и представляться своими адресами. У объекта-копии будут копии этих объектов-частей, занимающие другие адреса. Вследствие свойства идентичности даже объекты, лишенные состояния (например, объекты типа s tr u c t А {> не имеют состояния), в C++ занимают отдельную память (проверьте sizeof(A) и sizeof (В), где s tru c t В { А а, Ъ; }). [23] Понятие равенства разных объектов друг другу приравнивается к отношению «являться копией». Равные объекты находятся в одинаковом состоянии и имеют равные атрибуты. Отклонение от этого принципа обычно влечет ошибки. Формирование специального представления объекта, позволяющего создать эквивалентный объект уже в другом адресном пространстве (другой памяти), называется сериализацией. [22]
Воссоздание объекта по сериализованному представлению называется десериализацией. Сериализация требуется, когда необходимо передать объект по сети или сохранить на носителе данных. Необходимо отметить, что компьютер является реальным физическим устройством, поэтому представления значений и объектов в памяти реального компьютера можно считать конкретными сущностями, возможно, моделирующими сущности абстрактные. Соответственно типы значений в языках программирования могут быть более ограничены, чем предполагается для соответствующих абстрактных видов. Например, в языке C++ нет встроенного типа «целое число», зато есть тип int, множество значений которого конечно.
Ограниченность реальных представлений ведет к тому, что концепции в C++ могут отвечать как абстрактным родам, так и видам, например, может быть введена концепция «целое число», моделью которой является любой тип, предоставляющий необходимый набор действий над своими значениями и предназначенный для представления (подмножества) целых чисел, в то время как, строго говоря, абстрактным родом вида «целое число» является, например, «кольцо». [20]
Итак, в начале 1960 годов стали появляться новые слова, которые составили основу ООП, появилась новая компьютерная эра, возникли новые специальности, в которых нужны были люди, способные разбираться в новом, называемом искусственным интеллектом.
Согласно определениям ученых, исследовавших ООП, это метод программирования, основанный на представлении программы в виде совокупности взаимодействующих объектов, каждый из которых является экземпляром определенного класса, а классы являются членами определенной иерархии наследования.
Кроме этого, под объектно-ориентированным программированием (ООП) понимается программирование, оперирующее конкретными сущностями (объектами) и конкретными видами и родами (классами, абстрактными классами, интерфейсами). Математически интерфейсы можно представлять как наборы функций, отображающих объект и необязательный кортеж параметров в некоторое множество результатов. Эти функции называют методами. Можно считать, что значения кодируются с помощью конечных последовательностей бит, которые называются представлениями значений. Из равенства представлений следует равенство значений (хотя, строго говоря, не всегда это означает равенство исходных абстрактных сущностей, потому что представления иногда могут быть неоднозначными2). Из равенства значений следует равенство представлений, если каждой абстрактной сущности этого вида (типа) соответствует единственное представление. Таким образом, копирование представления возвращает нам значение, отвечающее той же самой абстрактной сущности, что и исходное.
Глава 2. Принципы объектно-ориентированного программирования
2.1 Инкапсуляция
В 80-х годах XX века появилась такая парадигма программирования как ООП. Как известно, в процедурных языках программирования данные и инструкции по их обработке существуют отдельно, а в ООП эта информация объединяется в единую сущность. Объектно-ориентированное программирование – это стиль программирования, где программа состоит из компонентов, которые соответствуют объектам реального мира. [1]
На сегодняшний день ООП является востребованным по ряду причин. Одной из них является облегчение установления связи между объектом реального мира и программой так, как это ожидается. Подобное развитие можно заметить по мере того, как множество объектов взаимодействуют друг с другом, а приложение в свою очередь улучшается. Данный подход распределяет ответственность внутри объективного мира, тем самым, позволяя сфокусироваться на осмыслении приложения. Другой важной причиной является классификация объектов. Поскольку мир как реальный, так и виртуальный полон объектов, ими невозможно управлять по отдельности. Потому появляется необходимость в классификации этих объектов (то есть разделение их на классы). Этот способ способствует объединению различных объектов и их свойств. [6]
Объектно-программное программирование имеет свои постулаты. Наследование, полиморфизм и инкапсуляция – главные из них. Основы программирования на языках ООП заключаются в использовании объектов и классов. Инкапсуляция – это способ скрытия внутренних деталей при предоставлении открытого интерфейса к определяемому пользователем типу. [2] То есть пользователь имеет доступ только к интерфейсу объекта. Взаимодействие может происходить непосредственно через этот интерфейс, реализуемый ключевым словом: public. Закрытые данные и методы, реализующиеся посредством ключевых слов: private, protected, internal, пользователю использовать запрещается. Принцип инкапсуляции обеспечивает безопасность данных и методов их реализации от внешних воздействий. Внешними воздействиями могут являться воздействия со стороны других классов, которые не относятся к этому объекту. Данные надежно защищены от несанкционированного доступа извне, при том, что внутри сущности они успешно взаимодействуют друг с другом (рисунок 1).
Рисунок 1 - Пример инкапсуляции
Зачастую сокрытие реализации применяют при [3]:
предельной локализации изменений (в случае необходимости);
прогнозируемости изменений (какие изменения необходимо сделать в коде, для заданного изменения функциональности) и прогнозируемости последствий изменений.
2.2 Наследование
Вторым принципом ООП является наследование. Наследование – это способ использования одним классом методов другого класса без повторения их фактической реализации. [4] Иными словами, использование наследования даёт возможность описания нового класса на основе уже существующего (базового) (рисунок 2). Это помогает избавиться от избыточности исходного кода.
Рисунок 2 - Пример наследования
Наследование в Java достигается с помощью ключевых слов «extends» и «implements» (рисунок 3).
Рисунок 3 - Листинг – наследование в Java
Некоторые языки программирования различают два вида наследования: простое и множественное. Простое наследование – наследование, в котором производный класс имеет одного предка. Множественным называют наследование, в котором производный класс может иметь более одного родителя. При множественном наследовании класс наследует методы всех предков. Достоинством данного подхода является большая гибкость.