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

Основные понятия ООП

Мы уже затрагивали некоторые понятия ООП в предыдущих разделах. Теперь пришло время систематизировать эти знания и освоить современный способ разработки программного обеспечения.

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

Класс можно рассматривать с двух позиций:

1) с точки зрения предметной области класс соответствует определённому характерному объекту этой области.

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

Данные класса называются полями (по аналогии с типом struct), а функции – методами. Поля и методы являются элементами (членами) класса.

 
  основы объектно-ориентированного программирования - student2.ru

Рисунок 3.1 Поля и методы класса

Выделение классов в заданной предметной области выполняется на этапе объектно-ориентированного анализа – это, пожалуй, самый сложный и ответственный этап объектно-ориентированной разработки. Принципы выделения классов, как и принципы выделения функций при процедурно-ориентированном подходе, базируются на обеспечении возможности многократного использования классов. Исходя из этого, основным принципом при выделении классов является абстрагирование. Например, в процессе разработки компьютерной игры можно выделить классы Игровое поле, Главный персонаж, Враг и т.д. Если в этом процессе нам удастся абстрагироваться от несущественных деталей, скорее всего, мы сможем использовать реализованные классы в нескольких различных игровых приложениях.

Класс в ООП обладает тремя важными свойствами:

1) Инкапсуляция

2) Наследование

3) Полиморфизм

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

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

Наследование – это свойство классов порождать своих потомков и наследовать свойства (поля и методы) своих родителей. Класс-потомок может содержать свои новые поля и методы, также в нём могут быть переопределены некоторые методы родительского класса. Например, класс Графическая фигура является родительским классом по отношению к классам конкретных графических фигур (Прямоугольник, Круг, Квадрат и т.д.). С помощью наследования можно организовать иерархии классов.

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

Далее все эти свойства классов, которые иногда называют основными принципами ООП, будут рассмотрены достаточно подробно.

Теперь рассмотрим понятие объекта:

1) с точки зрения предметной области – каждая отдельная сущность этой предметной области.

2) с точки зрения программиста – переменная, имеющая тип определённого класса. Или, по-другому, объект – экземпляр класса.

Объекты создаются так же, как и переменные других типов. При этом память для полей выделяется отдельно для каждой переменной (исключение составляют статические поля, которые будут рассмотрены далее). Код методов класса хранятся в памяти в одном экземпляре.

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

3.2 Классы в С++

Описание класса

В С++ для описания класса введён новый составной тип class. Кроме того, понятие структуры (struct) и объединения (union) расширено до поддержки концепции ООП. Таким образом, при описании класса можно пользоваться всеми тремя типами. Далее мы будем употреблять термин "класс", вне зависимости от того, каким способом выполнено его описание.

Заметим, что ключевое слово union используется в ООП достаточно редко и для специфических применений. А class и struct можно рассматривать как очень близкие языковые понятия. Небольшая синтаксическая разница между class и struct все-таки есть, чуть позже мы ее поясним. Итак, в общем виде описание (определение) класса выглядит так:

class | struct | union {тело класса};

В теле класса указываются все составляющие его элементы. Для полей указываются имена, типы и возможные спецификаторы. Для методов можно указать их прототипы или полные определения. Рекомендуется в теле класса размещать определения только для очень коротких методов, а большинство методов реализовывать за пределами класса. Определения классов обычно размещаются в файлах с расширением .h, а реализация методов – в файлах с расширением .cpp. Такой подход имеет сразу два преимущества:

· определение класса имеет лаконичный и удобный для восприятия вид, особенно при удачно подобранных названиях элементов класса;

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

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

Наши рекомендации