Видео: YouTube
Самым первым шагом к пониманию объектно-ориентированного программирования (ООП) являются структуры. Сейчас будет несколько технических подробностей, понимание которых облегчит освоение вопроса, позволит не наступить на очередные подложенные грабли. Рассмотреть вопрос подробно позволит низкоуровневый язык, где синтаксически не предусмотрена работа с объектами. Как вы уже догадались, это язык Си.
Императивный стиль программирования.
Императивный стиль написания исходного кода заключается в записи последовательности действий вычислителя. Данные, полученные при выполнении инструкций могут быть использованы последующими инструкциями. Этот стиль программирования, он же парадигма программирования, целиком продиктован архитектурой электронной вычислительной машины, построенной по принципам фон Неймана. Действительно, машинные инструкции последовательно выбираются из памяти и поступают на дешифратор команд, который, в свою очередь, занимается управлением потоками данных между узлами процессора.
Процедурный стиль программирования.
Исторически так складывается, что сложность программ увеличивается и с каждым разом все сложнее и сложнее в строчках кода видеть и контролировать сложную архитектуру всей программы. Мы уже рассмотрели полезность функций и технические вопросы их вызова. Они способны заменить большой участок кода с определенным смыслом на всего одну строчку вызова. Особенно хорошо, если участок кода повторяется много раз, пусть и с некоторыми отличиями. Тем самым в основном исходном коде все становится более упорядоченным и ничего не отвлекает от главной задачи. Разумеется, число функций в программе со временем может вырасти до сотен.
Объектно-ориентированный стиль программирования.
Для своего времени идея разделить функции с данными на отдельные структурные смысловые части оказалась во многом прорывной. Детали работы с данными и сами данные можно выделять в отдельную структурную единицу. Разделяя исходный код на структурные единицы, можно улучшить контроль за всем проектом. Уже не одно десятилетие уставшие от однообразного труда программисты рассматривают вопросы стиля написания кода. Эти рассмотрения уже переросли из математики в глубокую философию. Среди прочих, стиль выделения данных и методов их обработки прочно вошел в обиход разработчиков. Развивался он под названием объектно-ориентированное программирование.
Основу стиля и принципа составляет создание и использование объектов. Это структуры данных в памяти компьютера и функции для работы с ними. Объекты являются моделями предметов из жизни людей или чисто мысленные абстрактные понятия.
Также как глобус это модель земли, объект это модель предмета или понятия.
Объект описывает наиболее значимые свойства. Большое количество языков программирования своим синтаксисом поддерживает идею использования объектов. Концепция обросла многочисленными условностями вроде наследования и инкапсуляции. Они созданы для упрощения написания программ, но зачастую при неверном понимании для чего это и как работает, упрощение становится головной болью и источником мифов.
Перечисления и структуры.
Рассмотрим такую синтаксическую конструкцию, как перечисления. Несомненно, любая информация в памяти компьютера закодирована в числах, цвета не исключения. Программистам гораздо удобнее писать и читать исходный код в более удобном представлении.
На рисунке приведен пример перечисления. В фигурных скобках представлены возможные варианты состояния переменной. В переменной с будет храниться число, конкретно в этом примере компилятор разместит там единицу. Во втором примере также перечисление, однако программист принял участие в назначении названиям конкретных вариантов определенных чисел.
При таком значении переменной f там будет храниться число 7.
Первый шаг к объектно-ориентированному программированию это структуры. Синтаксическая конструкция языка, объединяющая в себе данные и в отличии от массивов они могут быть различных типов. Первый шаг к объектно-ориентированному программированию это структуры. Это синтаксическая конструкция языка, объединяющая в себе данные и в отличии от массивов данные эти могут быть различных типов. Синтаксически структуру можно описать несколькими способами. Один из них представлен тут.
Ничего сложного, ключевое слово struct, потом имя структуры и в фигурных скобках перечисляются все элементы, входящие в структуру. Считаем эту запись некоторым документом и не более. Всего лишь описание структуры. Чтобы создать конкретный экземпляр структуры, нужно как и в случае объявления переменной, объявить структуру. Здесь u1 конкретный экземпляр. Неудобство в том, что приходится приписывать ключевое слово struct при каждой попытке создать структуру в памяти. Есть способ получше.
Объявить структуру как новый тип данных. Теперь приписывать ключевое слово struct при объявлении конкретного экземпляра структуры не нужно. Да, конечно же главным достоинством структуры является синтаксическое удобство доступа к элементам структуры через точку и имя элемента. Компилятору совсем не сложно рассчитать смещение от начала структуры до любого из элементов. Это только потому, что описав структуру, мы ее задокументировали.
Примеры структур.
В качестве простой структуры рассмотрим игрового юнита рыцарь.
Структура это просто модель, описывающая наиболее важные свойства реального персонажа. А какие свойства главные? Разработчик игры решил, что это здоровье (health), сила удара (power), координаты юнита на игровой карте x, y. И еще куда направлено его изображение. Влево или вправо. Объявление структуры в памяти мы уже видели, с доступом к элементам вроде тоже все понятно. Введем еще одного юнита. Это король.
Состав его свойств точно такой же как у рыцаря, но содержимое свойств имеет отличие. Здоровья у короля поменьше, сила удара не такая большая. А так все то же самое. На модели памяти показано как размещены элементы структуры.
В зависимости от архитектуры процессора, размещение может быть и другим. Иногда процессору удобнее работать с переменными, выравненными по границам слов, которыми ведется запись данных в память. Программисту, пишущему на языке высокого уровня, как правило, знать подробности размещения не всегда необходимо. Доступ к данным происходит удобно через синтаксические конструкции. Компилятор сам посчитает все смещения данных внутри структуры. Поскольку структура может хранить в себе любой тип данных, то вполне логично размещать в ней ранее созданные структуры как новые типы. Таким образом, юнитов можно объединять в подразделения.
В этом подразделении один король и массив из четырех рыцарей. В следующих выпусках изучим указатели и особенно указатели на функции. Как мы знаем, инструкции и данные изначально разделены в памяти компьютера, даже если память для них общая. Вот как в объектах объединены данные и функции является весьма интересным техническим моментом.