воскресенье, 21 октября 2012 г.

[Теория программирования] Объектно-ориентированное программирование на каше

После написания чернового варианта данной статьи меня посетила мысль: «А что с ней делать?» То, что её надо доработать до окончательного варианта — это понятно, а что потом — уже вопрос. Сначала была идея опубликовать её в каком либо журнале, причем шанс того, что её примут, довольно большой, но в этом случае аудитория читающих сильно сократится, и не все желающие получат нужную им информацию. Именно из-за этого было решено выложить данную статью в открытом доступе. Поэтому желаю вам приятного чтения и добро пожаловать под кат.

Мне регулярно приходится объяснять принципы объектно-ориентированного программирования (ООП), и именно из-за этого было решено написать данную статью. Также эта статья является черновым вариантом методических материалов к разрабатываемой мной системе обучения программированию. Все примеры приведены на языке программирования С++. В процессе написания статьи использовался компилятор gcc 4.7.1 и операционная система GNU/Linux Debian Wheezy x64.
Как следует из названия, всё ООП строится на описании свойств и функций каких-либо объектов. Основными терминами ООП являются:
  • Класс — набор полей, методов и функций. 
  • Объект — некоторая сущность в виртуальном пространстве, обладающая определенным состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов).
  • Поле — параметр объекта, задающий его состояние.
  • Метод — процедура или функция, связанная с классом.
Также следует упомянуть основные принципы ООП:
  • Наследование — механизм ООП, позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. 
  • Полиморфизм — возможность объектов с одинаковой спецификацией иметь различную реализацию.
  • Инкапсуляция :
    • Языковой механизм ограничения доступа к определенным компонентам объекта.
    • Языковая конструкция, способствующая объединению данных с методами (или другими функциями), обрабатывающими эти данные.
  • Абстракция — придание объекту характеристик, которые чётко определяют его концептуальные границы, отличая от всех других объектов.
Проблема в понимании у начинающих программистов ООП заключается не в том, что это какой-то сложный аспект, а в том, что чаще всего теория подается в плохо понятной форме и с немного сумбурными примерами. В данной статье я попытаюсь исправить данную ситуацию.
Давайте на время забудем про те традиционные определения терминов, которые были приведены в начале статьи и посмотрим на них немного иначе.
Представим всем знакомый продукт — кашу. Каша имеет свои характеристики и со стороны ООП является классом. В то же время какая-то конкретная тарелка с кашей является объектом этого класса.
Все мы знаем, что каша может быть сладкой и соленой (логические типы переменных). Каша обязательно имеет какой-то объем (одна тарелка или один литр) и вес (один килограмм) — это целочисленные или дробные типы переменных. Всё, что здесь перечислено, является свойствами конкретного объекта класса, т. е. в данном случае тарелки каши, и называется полями класса.
Не будем забывать то, что кашу можно сварить, съесть или выкинуть (какое извращение...). Сейчас мы перечислили те действия, которые можно сделать с конкретной кастрюлей или тарелкой каши, т. е. объектом класса. Эти действия называются методами класса.
Теперь, когда мы знаем и понимаем основные термины, мы можем перейти к основным принципам ООП.
У нас есть каша, которая, как мы определили выше, может быть сладкой, соленой, у неё есть определенный вес и объем. А теперь начинаем думать, какие есть каши. Возьмём, например, гречневую кашу. Это будет новый класс, который возьмет все свойства родительского класса (каша), но при этом мы добавим ещё одно поле в класс — рассыпчатость. Собственно передача этих свойств (поля) и действий (методы) от родительского класса к дочернему называется наследованием.
Не смотря на то, что в классе «гречневая каша» мы явно не определили другие поля и методы, имеющиеся в классе «каша», они будут доступны, благодаря наследованию.
Теперь давайте укажем, что просто кашу мы едим ложкой, а вот гречневую кашу надо обязательно есть вилкой.
Как видно, метод с одним и тем же названием в родительском и дочернем классах различается в реализации. Это свойство называется полиморфизмом.
Давайте представим, что наша каша была сварена без соблюдения каких-либо санитарных норм. Вполне логично, что мы не хотим никому об этом рассказывать.
Теперь метод cook не будет доступен дочерним классам. Это свойство называется инкапсуляцией.
Как было показано выше, мы можем есть кашу как вилкой, так и ложкой. Точно определить столовый прибор мы сможем только тогда, когда будем знать какая именно каша находится перед нами. Исходя из сказанного возникает вопрос: «А надо-ли нам всегда определять действия в методах?» Я вам скажу: «Нет!». Мы может просто указать то, что кашу можно приготовить и съесть, а как именно это сделать мы укажем конкретно для каждой каши.
Свойство ООП, когда мы в родительском классе только объявляем метод, а определяем его уже в дочерних классах, называется абстракцией.
Всё таки в рамках одной статьи такую обширную тему, как ООП не рассмотреть, поэтому, благодаря этой статье, вы получили основы, а продолжение вам дадут различные статьи и учебники, которые будут восприниматься уже с пониманием темы.

Комментариев нет:

Отправить комментарий