Что такое классы и объекты в ООП?
- Эпоха динозавров без классов и объектов
- Основная идея классов, объектов и ООП в целом
- Объектно ориентированное «программирование» в жизни
До появления объектно-ориентированного подхода, когда программисты работали на каменных клавиатурах, во многих языках программирования давно уже возникла потребность в несколько более расширенных типах данных, чем простые целые и вещественные числа, логические «истина-ложь» и текстовые строки. Попросту говоря, при большом количестве атрибутов какой-либо сущности работать с несколькими массивами весьма затруднительно.
Эпоха динозавров без классов и объектов
Ладно, это была шутка, предыдущее предложение не было простым к пониманию «с нуля» и вы, уважаемый начинающий чайник, не совсем полный даун. Следите за пальцами, разъясняю сначала пользу от классов и объектов.
Есть, к примеру, в базе некоторое количество автомобилей, у которых куча общих параметров. Пытаясь чего-то напрограммировать с этими данными, очень неудобно заводить на каждый параметр (количество дверей, объём движка, марка и т.д.) свою отдельную ветвь переменных. Поэтому прямые ручки почесали умные головы и выдали комбинированный тип данных: «структуры» или «записи».
В разных языках и пособиях можно встретить оба названия, но смысл один: собрать под одной крышей данные, характеризующие что-то общее.
Тип данных: Колесо { переменная резина: Резина; переменная диск: Диск; } Тип данных: Автомобиль { переменная число_дверей: Целое_число; переменная объем_двигателя: Вещественное_число; переменная марка: Строка; переменная модель: Строка; переменная колесо: Колесо; ... }
Из псевдокода выше можно заметить, что структура может в себя включать как простые поля, так и другие, ранее определённые, структуры, что очень удобно. К тому же создав переменную (или массив переменных) «авто» типа «Автомобиль» мы получаем все параметры в одном флаконе и можем писать под это дело функционал, которому на вход подается только одно «авто», а не куча разрозненных данных, связь между которыми существует только в головах разработчиков (а к последним компьютер прямого доступа пока не имеет, и слава богу!).
Основная идея классов, объектов и ООП в целом
Но и этого оказалось мало лентяям от проектирования и разработки ПО. Изрядно задолбавшись воротить гору процедур, функций и модулей, а потом, при случайно упущенном параметре, вводить его в структуру и перелопачивать весь ранее написанный код обработки данных заново, программисты опять почесали свои умные головы (а кто не хотел — тому почесали клавиатурой сознательные коллеги).
Одновременное почёсывание большого числа лохматых голов дало нехилый заряд статического электричества и у кого-то проскочила дельная искра: добавить в структуры поведенческий аспект. То есть, создать такую концепцию, при которой структурный тип не только содержал бы в себе все свои данные, но и сам бы с ними работал: загружал, сохранял, изменял и т.д.
Класс: Автомобиль { ... переменная марка: Строка; переменная модель: Строка; ... функция заголовокДляПрайсЛиста() { вернуть марка + " " + модель; } }
И это уже можно назвать классом, хотя это, по сути, новый тип данных. Получается, класс — это некий шаблон, описание не только самой структуры данных (чего там может или должно быть), но и поведения, функциональных возможностей объектов этого класса. Применительно к программированию, объект класса — это переменная этого класса, которая содержит конкретные данные и работает в соответствии с описанной в классе функциональностью.
Возьмём на вооружение ещё пару терминов. В классе описываются свойства будущих объектов — поля, содержащие данные, и методы — функции для каких-либо взаимодействий (с этими данными, с другими объектами, с окружением, с операционной системой и т.д.).
Объектно ориентированное «программирование» в жизни
В умных книжках вас наверняка напугали «интуитивно понятной» фразой «объект — это экземпляр класса». Давайте возьмем что-то менее интуитивное, но более понятное — из жизни.
И так, класс = шаблон. В реальной жизни можно взять в качестве примера чертёж какой-нибудь важной детали. Пусть в жизни и не так всё просто, и вместо одного чертежа, проект детали обычно является ворохом документации весом поболее, чем сама деталь из утяжелённого ураном чугуния, но мы всё же пока представим просто чертёж. Это и есть «класс» детали в программерском смысле. Инженеру и работягам на производстве достаточно иметь один чертёж, чтобы изготовить кучу таких деталей — физических и конкретных воплощений класса (чертежа), объектов. Которые потом можно привинтить в нужное место и наслаждаться исправно работающим блоком реактора АЭС (если производство не накосячило).
Если в реальности любую гениальную мысль инженера может испортить нетрезвый слесарь, срезав лишний миллиметр и выдав брак, то в программировании объекты ведут себя строго в соответствии с прописанной в их классе функциональностью (даже если она неправильная и с ошибками). Изменив что-либо в классе (функционал, структуру данных), мы автоматически получаем изменения во всех объектах этого класса, которые будут созданы при запуске нашей программы.
Разумеется, с точки зрения низкоуровневого (системного) программирования, создание объектов не является простой задачей. Поэтому во всех языках для этого существуют отдельные операторы. Но во всем остальном, с объектом можно обращаться как с обычной переменной, хоть и с некоторыми ограничениями, которые легко обходятся за счет функциональности, которой этот объект обладает, или за счет возможностей языка (в частности: перегрузка операторов в C++). То есть, сложить, например, два объекта — матрицы чисел оператором «+», как обычные числа, скорее всего сразу не получится. Но можно в классе написать соответствующий функционал (которым объекты сразу овладеют) и вызвать его.
результат = матрица_один->суммировать(матрица_два);
14.07.2010 | 15:36
