мета-данные страницы
Это старая версия документа!
Базовая информация о объектно-ориентированном программировании
Процедурные языки
Чтобы понять что такое объектно-ориентированное программирование (ООП) нужно сначала понять что оно заменяет. Ранние языки были процедурными: программисту требовалось описать конкретный набор процедур которые выполнял компьютер.
To understand what an object-oriented programming language is, you need to understand what it replaced. Early programming languages were procedural—so-called because the programmer would define a very specific set of procedures that the computer would undertake.
В те времена процедуры записывались на перфокартах. На каждом шаге данные читались, обрабатывались и сохранялись. Этот подход хорошо работал тогда, да и сейчас в общем-то свою функцию выполняет. Однако, когда нам требуется написать программу, которая сложнее чем набор простых шагов - то в этом случае решение с помощью процедурного подход становится сложным для работы. Одним из вариантов преодоления результирующей сложности программы является ООП.
Объектно-ориентированное программирование
В первом ООП языке (Simula) была введена идея объекта. Объекты это наборы информации, воспринимаемые как целое. Туманно, но разберем позже на примерах, пока же поговорим о классах. В контексте ООП это можно сказать «предобъекты». Они содержат список свойств, которые после определения становятся объектом.
Рассмотрим пример с шахматами. Предположим что нам требуется написать шахматную игру. Вероятно нам захочется использовать класс Фигура. Каждая Фигура имеет следующий набор свойств:
- Цвет
- Высота
- Форма
- Как ходит
Объект определяет конкретного представителя, принадлежащего классу. Положим что мы хотим объект с названием БелаяКоролева. У этого объекта будут следующие определения для свойств (белый, высокий, цилиндрический с зубцами, в любом направлении на любое расстояние). Так же объект может содержать функции, которые в ООП принято называть методами.
Чем ОО подход лучше процедурного? Если кратко, то ООП языки позволяют аккуратнее организовать данные и код так, что в больших проектах работа с ними происходит более гибко. Познакомимся со основными столпами ООП.
Абстракция
К нашему счастью, чтобы пользоваться чем-то не обязательно знать как оно работает. Автомобиль это сложная инженерная система, но чтобы ехать на нем не обязательно знать в подробностях как функционирует каждая его часть. 1)
Тоже самое можно сказать и о объектах в ООП. Вернемся к шахматам, вероятно у фигуры есть метод move(), для эта функция может использовать множество данных или другие методы: начальная и конечная позиция, методы для определения того, не стоит ли какая-нибудь фигура на пути следования, метод взятия фигуры и т.д. Но нам не требуется знать всех этих тонкостей, мы пишем move() и фигура двигается. Это и есть абстракция.
Инкапсуляция или сокрытие
В ООП это метод с помощью которого в ООП реализуется абстракция. Каждый объект это набор данных, рассматриваемый как единая сущность. К данным относятся как переменные, так и методы.
Обычно переменные считаются скрытыми, приватными. Это означает, что другие объекты и их методы к ним доступа не имеют. Значения переменных меняются только собственными методами объекта.
Шахматная фигура Слон может, например, переменную с названием position - текущая позиция. Значение этой переменной необходимо для метода move(). Естественно Слону приписан еще и цвет.
Когда программист делает переменную приватной а метод move() общественным (публичным) он защищает ее значение от изменения каким-нибудь внешним действием. Аналогично, если цвет это приватная переменная, никто не сможет его изменить, если в объекте не существует метода которы бы это сделал.
Все эти переменные и методы хранятся в пределах объекта Слон. Так как они сокрыты, программист может менять структуру и содержимое объекта не беспокоясь о его интерфейсе: наборе публичных методов.
Наследование
В дополнение к классам, в ООП языках еще есть подклассы. Они содержат все атрибуты родительского класса, но могут иметь и дополнительные свои. В наших шахматах пешка должна иметь метод transformPiece(), который превратит ее в другую фигуру, когда она дойдет до конца доски. Однако, этот метод нужен только пешке, и нет никакого смысла иметь его в других фигурах. Поэтому создадим для класса Фигура подкласс Пешка. Так как он подкласс Фигуры, он будет содержать все ее параметры, иными словами объект класса Пешка включает цвет, высоту, форму и набор перемещений. А еще он имеет метод transformPiece() которого нет у других. И нам не нужно будет беспокоиться, если случайно попытаемся вызвать этот метод у Ладьи, это сразу приведет к ошибке.
Создание подклассов позволяет экономить время. Вместо создания новых классов для всего программист создает базовый класс и затем расширяет его новыми подклассами по мере необходимости.