Заметки по языкам C и C++.
<  0  1  2  3  >  
Заметка номер 3 (об основах объектного программирования)
Что же такое этот C++
Язык C++ часто рассматривают как расширение языка C. В общем, это правильно. Разработчики взяли язык и дополнили его новыми возможностями, главными из которых являются управление объектами. Впрочем, потом языки C и C++ пошли своими дорогами – у каждого из них появились новые стандарты, которые, в конце концов, привели к тому, что современный язык C уже нельзя считать частью современного языка C++.
С другой стороны появление в C++ такого понятия как объект можно рассматривать как радикальное изменение парадигмы языка. Действительно, класс можно трактовать как тип данных, а представитель класса (объект) как переменную заданного типа. Но можно рассуждать и по-другому: простые типы данных, существовавшие в языке C (int, char, double и т.п.), теперь можно считать типами в смысле объектной парадигмы. Тогда определение переменной заданного типа (например, запись в функции int a;) будет означать создание объекта. Не случайно на место функциям malloc и free пришли операторы new и delete, которые можно применять как для создания обычных объектов, так и для создания переменных заданного типа. Все было бы хорошо, но из общей схемы выбиваются глобальные переменные. Впрочем, их можно рассматривать как аналог класса со статическими членами.
Конечно, описанная выше схема трактовки языка C++ несколько притянута за уши. Но согласитесь, что определенная аналогия имеет место быть. Тем более нам становится понятным, почему стали появляться и набирать популярность такие языка как Java и C# с их первородной объектностью.
Четыре слона
Да, слонов здесь не три, а четыре. Это: абстрагирование, инкапсуляция, наследование и полиморфизм. Объектный подход в программировании - это попытка приблизить программирование к предметной области. Сделать объектами программирования реальные объекты окружающего мира. Действительно, объект - это всегда свойства и возможность производить с ним некоторые действия. Например, топор имеет специфические для топора свойтсва: длина рукоятки (топорища), материал из которого она сделана, форма рукоятки, из чего сделан сам топор, его форма, вес. Все эти свойтсва несомненно являются важными характеристиками предмета, но кроме этого любой предмет это еще и действия, которые с ним можно произвести. Топором можно колоть дрова, можно обтесывать деревянные предметы. В старину были боевые топоры. которые использовались во время сражения.
Абстрагирование - это выделение существенного и отбрасывание не существенного в данной постановке задачи. Важно подчернуть, что речь идет именно о постановке задачи, а не вообще с точки зрения общих рассуждений. Рассмотрим например такой объект, как 'студент'. Правильнее бы было сказать 'класс объектов', но мы не будем пока заострять на этом внимание. Но произнеся слово студент, мы еще не знаем, какие конкретно его свойства нам понадобятся. Можно ведь рассматривать студента в разрезе учебного процесса факультета, а можно с точки зрения социальной группы в рамках социологических исследований. В первом случае нам надо знать успеваемость, специальность, группу, где учится студент, во-втором случае, скорее всего следует учитывать другие атрибуты, например обеспеченность общежитием, семейное положение, доход и т.п.
Инкапсуляция - это возможность объединить свойства и исполняемый код в единый объект (класс). По сути здесь и нечего добавить больше. Дальше идут детали. Мы можем скрывать или наоборот открывать члены класса другим классам, тем самым делая код более безопасным. Кроме этого объектный подход предполагает такие предопределенные методы, как конструктор и деструктор. Первый запускается автоматически при создании объекта, второй - при его разрушении. Зачем это надо? Чтобы придать свойствам объекта некоторые начальные значения, другими словами автоматизировать этот процесс. Деструктор напротив должен "убрать" за собой - удалить объекты, которые создавались в связи с работой данного объекта, внести изменения в базу данных и т.п.
Наследование это возможность создания классов на основе уже существующего или существующих классов. При этом члены класса все (или часть) наследуются. Новый класс называется потомком, класс(ы) от которого образован потомок, называется родительским классом или предком. Унаследовав члены от родительских классов, класс-потомок может быть дополнен новыми членами и таким образом более полно отразить описываемый объект предметной области. Принцип наследования отражает известный подход в изучении какого либо предмета или явления: от общего к частному. Например, от общего поняти телевизор можно перейти к телевизору конкретной фирмы, а затем к телевизору конкретной марки и т.д. На каждом этапе наследования происходит уточнение конкретных свойств и возможностей предмета.
Полиморфизм - наиболее сложная ипостась объектного программирования, которая имеет несколько возможных толкований. Но в простейшем случае все не так уж сложно. Всегда можно заменить метод, наследуемый от своего предка на свой метод, имеющий то же имя. В результате метод с одним и тем именем в разных объектах, связанных друг другом наследованием, будут выполнять разные операции, хотя и связанные общим смыслом. Например если мы образуем от класса "точка" класс "отрезок", то используя принцип полиморфизма, можно переписать метод предка set, который ставит точку, так чтобы, этот метод для объекта "отрезок" рисовал бы на экране отрезок.
Начала объектного программирования в C++
В объектном программировании нет ничего сложного. Во всякос случае в той его части, которую можно назвать "началами объектного программирования". Прежде чем что-то делать с объектом, он должен быть создан. Основной способ создания объектов в C++ это генерация его на основе заранее определенного шаблона. Этот шаблон в C++ называется классом. Класс интуитивно понятный термин. Всегда можно продолжить, сказав "класс объектов". Важно понимать, что класса не существует в памяти исполняемой программы, а есть только объекты. Вот объекты и создаются на основе своих классов.
Как и в случае с обычными переменными объект (на основе класса) может создаваться двумя способами: статическим и динамическим. Статический подход предполагет, что компилятор формирует код, который будет резервировать и заполнять область памяти, памяти, которая и будет нашим объектом при выполнении программы. Поскольку все в языке C++ существует в рамках некоторой функции, то компилятор должен также создать код, который будет удалять объект из памяти при выходе из функции. При динамическом подходе программист сам планирует в каком месте программы создавать нужный объект. Соответственно он (программист) должен предусмотреть, что в нужном месте объект из памяти будет удален.
Начнем со статического подхода. Приведу сразу пример простейшей программы.
#include <stdio.h>
class A {
private:
int a,b;
public:
int area(int x, int y){
a=x; b=y;
return x*y;
}
};
int main() {
A s;
printf("%d\n",s.area(10,12));
return 0;
}
С точки зрения функциональности программа довольно приметивна, но в ней есть ряд особенностей, демонстрирующих основные положения объектного программирования. Начнем с описания класса. Как мы видим, имя объявленного класса A. Наш класс содержит два свойства a и b и метод area. Методы и свойства можно назвать одним словом - это члены класса. Мы видим, слены расположены в разных разделах: private (закрытый) и public (открытый). Закрытые члены доступны только из методов самого класса (есть исключения, но о них позже). Другими словами имея экземпляр объекта мы не сможем получить доступ к закрытым членам. А вот из метода area мы такой доступ имеем. Сам метод находится в открытом разделе класса, поэтому он доступен через экземпляр класса, т.е. созданный объект. Как мы видим, объект создается обычным объявлением, как мы это делаем для обычных переменных. После объявления, объект становится доступным, также как его члены, находящиеся в открытом разделе класса. Доступ к членам осуществляется посредством оператора "точка". Вот, пока все. Если кому-то до сих пор была не ясна идея объектного программирования, то теперь, я думаю, такой проблемы нет. По сути все остальное в объектном программировании вытекает из того, что мы уже сказали, путем простых логических рассуждений.

<  0  1  2  3  >  
 Письмо      Сайт      Заметки      Страница-портал      Журнал
Пирогов Владислав Юрьевич, Copyright (c), 2013-2015