Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Парадигмы программирования



Объектно-ориентированное программирование.

ЕГО реализация в языке Java. КЛАССЫ И ИНТЕРФЕЙСЫ.

Парадигмы программирования

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

Следующей парадигмой стало структурное программирование, в котором на первое место поставлены вопросы более четкой и простой читаемости и понимаемости текстов программ (их структуры). Основными принципами структурного программирования являются следующие:

1) пошаговое программирование "сверху-вниз" (нисходящее программирование, при котором вначале, исходя из общих целей алгоритма, программируется и отлаживается"каркас" будущего программного приложения, а затем в него добавляются все детали);,

2) модульность (часто повторяющиеся или логически законченные фрагменты программ оформляют в виде отдельных модулей – функций или подпрограмм),

3) логическая структура любого алгоритма состоит из трёх типов базовых конструкций - последовательного выполнения, ветвления и повторения (цикла).

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

Полная автономность модулей позволяет создавать из них библиотеки, чтобы потом использовать их в качестве строительных блоков для программ. Для обеспечения максимальной независимости модулей друг от друга, надо четко отделять процедуры и данные, которые будут вызываться другими модулями,— открытые (public), от вспомогательных, которые используются только внутри модуля. Их называют закрытыми (private). Первые перечисляют в отдельной части модуля — интерфейсе (interface), вторые участвуют только в реализации (implementation) модуля. В разных языках программирования это деление процедур и данных производится по-разному. Например, в языке Turbo Pascal модуль специально делится на интерфейс и реализацию. В языке Java есть специальная конструкция для описания интерфейсов, которая так и называется — interface, но можно написать и абстрактные классы.

Скрытие данных и методов их обработки называют инкапсуляцией (incapsulation). Она имеет две основные цели. Первая — обеспечить безопасность использования модуля, вынести в интерфейс, сделать общедоступными только те методы обработки информации, которые не могут испортить или удалить исходные данные. Вторая цель — уменьшить сложность, скрыв от внешнего мира ненужные детали реализации.

Развитие модульности привело к появлению понятия объекта, под которым имеют в виду определенный набор взаимосвязанных данных и методов их обработки. Идея представления программы в виде совокупности взаимодействующих объектов дала начало современной парадигме программирования - объектно-ориентированному программированию (object-oriented programming), сокращенно ООП (OOP).

5.2. Принципы объектно-ориентированного программирования,
их реализация в Java

Рассмотрим основные принципы, положенные в основу ООП. Ключевыми для ООП являются понятия объекта и класса.

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

В ООП описание каждой модели выполняется в виде одного или нескольких классов (classes). Класс – это тип, описывающий устройство объектов путем указания всех членов класса, которые могут быть не только данными, но и методами. По технологии Java описания переменных и констант, характеризующих объект, называются полями класса (class fields). Процедуры, описывающие поведение объекта, называются методами класса (class methods). Внутри класса можно описать и вложенные классы (nested classes) и вложенные интерфейсы. Поля, методы и вложенные классы первого уровня являются членами класса (class members). В Java нет вложенных процедур и функций, в теле метода нельзя (в отличие от Pascal) описать другой метод. Класс подобен чертежу или шаблону, по которому можно создать бесконечное множество объектов, обладающих сходными свойствами. Класс имеет программное описание, но его данные не имеют реальных физических адресов в памяти ЭВМ.

Абстрактные методы и классы. При построении сложной иерархии зачастую возникает необходимость вводить такие методы в классы верхнего уровня, которые ещё не могут быть определены. Здесь можно было бы использовать пустые методы, но многие языки ООП предлагают такой специфический механизм, как определение абстрактных методов, т.е. методов без реализации (для них заданы параметры и тип возвращаемого значения, но нет тела). Абстрактный метод в Java определяется в классах-наследниках. Классы, имеющие хотя бы один абстрактный метод, также называют абстрактными классами. В Java и абстрактные методы, и абстрактные классы отмечаются ключевым словом abstract. Производные классы, которые не переопределяют все абстрактные методы, также должны быть отмечены как абстрактные. Как и в С++, в Java нельзя создавать объекты абстрактных классов.

Интерфейсы. Высшей степенью абстрактности в Java является интерфейс (interface). Все методы интерфейса абстрактны. Интерфейс не является классом. Класс может наследовать, или расширять (extends) другой класс или реализовывать (implements) интерфейс. Кроме того, интерфейс может наследовать, или расширять другой интерфейс. В Java класс не может наследовать более одного класса, зато может реализовывать сколько угодно интерфейсов. Множественное наследование интерфейсов не запрещено, то есть один интерфейс может наследоваться от нескольких. Интерфейсы можно передавать методам как параметры, но нельзя создавать объекты их типов.

В Java есть стандартные интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM. Это интерфейсы:

После того как описание класса закончено, можно создавать конкретные объекты, экземпляры (instances) описанного класса. Объект класса — это конкретная реализация класса. У него данные физически представлены в памяти ЭВМ.

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

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

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

Наследование (inheritance) - это процесс, посредством которого один класс может приобретать (наследовать) свойства другого и добавлять к ним свои данные и методы, характерные только для него.

Такая связь классов называется иерархией классов (hierarchical classification). Ее использование значительно упрощает управление большими потоками информации. Без использования иерархии классов, для каждого большого класса пришлось бы полностью задавать все характеристики, которые бы исчерпывающе его определяли.

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

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

Переопределение метода (англ. method overriding) в ООП — одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет его реализацию в суперклассе, если у него:

1) одинаковое название и модификаторы,

2) одинаковые параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса.

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

В Java переопределение методов дано в классическом варианте. Оно подобно использованию виртуальных методов в C++ при помощи ключевого слова Virtual для использования механизмов полиморфизма для позднего связывания. Все методы JAVA изначально виртуальные.

Нельзя переопределять метод в Java (защита от переопределения), если он помечен как final. Способность Java делать выбор метода, исходя из типа объекта во время выполнения, практически реализуется за счет того, что при вызове метода его поиск происходит сначала в данном классе, затем в суперклассе и т.д. до тех пор, пока метод не будет найден или не достигнут Object – суперкласс для всех классов.

Если в Java подкласс содержит метод, переопределяющий метод суперкласса, то он может помимо своего метода вызывать и метод суперкласса при помощи ключевого слова super.

This в Java(как и в C++) является указателем на текущий объект. Хотя в Java дескрипторы объектов и реализованы в виде указателей, в ней отсутствуют возможности работать непосредственно с указателями. Т.е. нет возможности выполнять над указателями арифметические операции, преобразовать целое число в указатель, а также обратиться к произвольному адресу памяти. Ссылку на объект разрешается передавать через параметр функции. Функция не в состоянии изменить полученную ей таким образом ссылку. Однако пользуясь ссылкой, она может вызвать метод объекта, изменяющий поля этого объекта. Передать функции ссылку на объект базового типа невозможно - такие переменные передаются только по значению. Соответственно, функция не может изменить содержимое переменной, значение которой она получила через свой параметр.





Дата публикования: 2015-07-22; Прочитано: 485 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...