Инкапсуляция, полиморфизм и наследование
Классы и объекты
Язык программирования Java является особым в силу нескольких причин. Понятно, что для успешной работы в Java необходимо, как минимум, неплохо знать синтаксис языка, но все же не это самое главное. Успешное использование Java на практике невозможно без глубокого понимания принципов объектно-ориентированного программирования (сокращенно ООП). Основные идеи, заложенные в ООП, далее объясняются на простых примерах из повседневной жизни.
Знакомство с ООП
Язык программирования Java является полностью объектно-ориентированным. Это означает, что программа, написанная на языке Java, должна строго соответствовать парадигме объектно-ориентированного программирования (ООП). Следует понимать, что принципы ООП не просто определяют структуру программы. Это некий фундаментальный подход, если угодно, философия программирования, на которой имеет смысл остановиться подробнее перед непосредственным изучением основ языка Java.
Принципы, на которых базируется ООП, во многом объясняются причинами, приведшими к появлению ООП как такового. Не вдаваясь в детали, отметим лишь, что в свое время в развитии принципов программирования и программных языков наступил момент, когда сложность прикладных программ достигла уровня, критического для понимания программистами. Традиционный подход который получил название процедурного программирования, неприменим для составления больших и сложных программ. Любая программа связана с данными и методами обработки этих данных. Если данных и методов много, в рамках одной программы достаточно сложно разумно структурировать программный код. Такие коды на профессиональном сленге называют «спагетти»-кодами, поскольку отдельные ветви алгоритма программы переплетаются, образуя нечто наподобие запутанного клубка, в котором крайне сложно разобраться. Проблема была принципиальной. Из такой критической ситуации необходимо было искать принципиальный выход, и такой выход был найден в рамках нового подхода, который получил название объектно-ориентированного программирования. Объектно-ориентированный подход в программировании основан на нескольких принципах, достаточно простых и прагматичных. Обычно выделяют три фундаментальных принципа, которые, как три слона, поддерживающие в представлении древних землю на своих спинах, составляют основу ООП: инкапсуляция, полиморфизм и наследование. Кроме этих принципов, вводятся также два важных понятия — это понятия класса и объекта. Именно с класса и объекта мы и начнем.
Классы и объекты
Чтобы решить проблему упорядочивания программного кода, было принято решение ввести четкое разграничение данных и методов обработки этих данных. Более того, данные и соответствующие им методы объединили в одну структуру, которая в ООП называется объектом.
Такой на первый взгляд искусственный прием позволяет четко разграничить область применимости методов. Вся программа при этом имеет блочную структуру, что существенно упрощает анализ программного кода. Но даже в таком подходе было бы мало пользы, если бы каждый объект был абсолютно уникальным. Практика же такова, что каждый объект определяется некоторым общим шаблоном, который называется классом. В рамках класса задается общий шаблон, то есть структура, на основе которой затем создаются объекты. Данные, относящиеся к классу, называются полями класса, а программный код для их обработки — методами класса.
В классе описывается, какого типа данные относятся к классу (данные называются полями класса), а также то, какие методы применяются к этим данным. Затем в программе на основе того или иного класса создается экземпляр класса (объект), в котором указываются конкретные значения полей и выполняются необходимые действия над ними. Различие между классом и объектом поясним на простом примере, не имеющем никакого отношения к программированию. Поговорим о домашних животных, таких как коты и собаки. Проводя аналогию с программированием, можем определить класс Кот и класс Собака. Определение класса производится через указание полей (данных) и методов класса. Для класса Кот в качестве полей укажем имя (кличку кота) и окрас (цвет). Для класса Собака задаем поля имя (кличка собаки), окрас и породу. Помимо полей, определим методы для этих классов. По большому счету метод — это то, что может делать объект соответствующего класса (или что можно делать с объектом). Коты будут мяукать и ловить мышей, а собаки — лаять и вилять хвостом. Отсюда методами класса Кот являются мяукать и ловить мышей, а класса Собака — лаять и вилять хвостом. Таким образом, мы определили шаблоны, на основании которых впоследствии будут создаваться экземпляры классов или объекты. Разница между классом и объектом такая же, как между абстрактным понятием и реальным объектом. При создании объекта класса задаем конкретные значения для полей. Когда мы говорим о собаке вообще, как понятии, мы имеем в виду домашнее животное, у которого есть имя, окрас, порода и которое умеет лаять и вилять хвостом. Точно так же, понятие кот означает, что он мяукает и ловит мышей, к нему можно обратиться по имени, и шубка у него может быть какого-то цвета. Это — абстрактные понятия, которые соответствуют классу. А вот если речь идет о конкретном Шарике или Мурзике, то это уже объекты, экземпляры класса.
Представим, что во дворе живут три собаки и два кота: Шарик (дворняжка коричневого окраса), Джек (рыжий спаниель), Ричард (черная немецкая овчарка), Мурзик (белый и пушистый кот) и Барсик (черный кот с белой манишкой). Каждый из пяти этих друзей представляет собой объект. В то же время они относятся к двум классам: Шарик, Джек и Ричард являются объектами класса Собака, а Мурзик и Барсик — объектами класса Кот. Каждый объект в пределах класса характеризуется одинаковым набором полей и методов. Одновременно с этим каждый объект уникален. Хотя Шарик, Джек и Ричард являются объектами одного класса, они уникальны, поскольку у них разные имена, породы и окрасы. Лают и виляют хвостом они тоже по-разному. Но даже если бы мы смогли клонировать, например, Шарика и назвать пса тем же именем, у нас, несмотря на полную тождественность обеих Шариков, было бы два объекта класса Собака. Каждый из них уникален, причем не в силу каких-то физических различий, а по причине того, что один пес существует независимо от другого.
Инкапсуляция, полиморфизм и наследование
Концепция процедурного программирования могла бы быть сформулирована как система составления программного кода, действующего на данные. В этом случае приоритет остается за программным кодом. В ООП предпочтение отдается данным. Именно данные управляют доступом к программному коду. В зависимости от того, какие данные обрабатываются, определяются методы для их обработки. В объектно-ориентированных языках программирования эта концепция реализуется через уже упоминавшиеся механизмы инкапсуляции, полиморфизма и наследования.
Инкапсуляция позволяет объединить данные и код обработки этих данных в одно целое. В результате получаем нечто наподобие «черного ящика», в котором содержатся все необходимые данные и код. Указанным способом создаются обсуждавшиеся уже объекты. Объект является именно той конструкцией, которая поддерживает и через которую реализуется механизм инкапсуляции.
Забегая наперед, отметим, что данные и код внутри объекта могут быть открытыми, доступными вне объекта, и закрытыми. В последнем случае доступ к данным и коду может осуществляться только в рамках объекта.
С точки зрения указанного подхода класс является базовой единицей инкапсуляции. Класс задает формат объекта, определяя тем самым новый тип данных в широком смысле этого термина, включая и методы, то есть программный код для обработки данных. Через концепцию класса данные связываются с программным кодом. В пределах класса данные представляются в виде переменных, а программный код — в виде функций (подпрограмм). Функции и переменные класса называются членами класса (соответственно, методами и полями).
Полиморфизм позволяет использовать один и тот же интерфейс для выполнения различных действий. Здесь действует принцип «Один интерфейс — много методов». Благодаря полиморфизму программы становятся менее сложными, так как для определения и выполнения однотипных действий служит единый интерфейс. Такой единый интерфейс применяется пользователем или программистом к объектам разного типа, а выбор конкретного метода для реализации соответствующей команды осуществляется компьютером в соответствии с типом объекта, для которого выполняется команда.
Важнейшим механизмом в ООП является наследование. Именно наследование позволяет усовершенствовать эволюционным способом программный код, сохраняя при этом на приемлемом уровне сложность программы. Наследование — это механизм, с помощью которого один объект может получить свойства другого объекта, что позволяет создавать на основе уже существующих объектов новые объекты с новыми свойствами, сохраняя при этом свойства старых объектов. Например, если мы решим создать новый класс Породистая собака, который от класса Собака отличается наличием поля награды на выставках, то в общем случае пришлось бы заново создавать класс, описывая в явном виде все его поля и методы. В рамках ООП с помощью механизма наследования можно создать новый класс Породистая собака на основе уже существующего класса Собака, добавив в описании класса только новые свойства — старые наследуются автоматически. Наследование — удобный и полезный механизм, который детально описан в следующих главах книги.
Преимущества ООП
Применение концепции ООП позволило существенно упростить процесс написания программ и расширило возможности в составлении сложных программных кодов. Среди основных преимуществ ООП выделим следующие.
В ООП благодаря механизму наследования можно многократно использовать созданный единожды программный код. Это позволяет существенно экономить время на создание нового кода.
Все ООП-программы достаточно хорошо структурированы, что улучшает их читабельность, да и работать с таким структурированным программным кодом намного приятнее.
ООП-программы легко редактировать и тестировать, поскольку работа может выполняться с отдельными блоками программы.
ООП-программы в случае необходимости легко дорабатываются и расширяются. Данная особенность крайне важна при создании больших проектов.
Несмотря на все это, следует четко понимать, что концепция ООП эффективна лишь в том случае, когда речь идет о больших и сложных программах. Для создания простых программ лучше использовать простые приемы.
Дата добавления: 2016-06-13; просмотров: 1939;