Во многих языках программирования есть средства для того, чтобы составлять из данных сложные агрегаты и при желании давать им имена. В Perl кроме встроенных сложных конструкций (простых и ассоциативных массивов) при помощи ссылок можно организовать структуру любой сложности. К примеру, окружность на координатной плоскости вполне задана координатами своего центра и радиусом. На Perl объект «окружность» можно сконструировать так:
Perl$circle= { center=>{x=>210, y=>297}, radius=>53, };
Если предполагается рисовать окружности на экране разными цветами, то к перечню свойств фигуры можно добавить и цвет:
Perl$circle->{color}='Orange';
Таким образом, окружность выступает как самостоятельная единица, а не как груда
переменных, хранящих все её свойства. Доступ ко всем свойствам такой окружности
осуществляется через единственную скалярную переменную
$circle
. Если же в программе участвуют многие окружности,
было бы весьма затруднительно придумывать имена для координат их центров, для
радиусов и цветов, если бы не такой подход.
Для треугольников набор данных, определяющий положение и вид на экране, выглядел бы так:
Perl$triangle= { a=>{x=>17, y=>11}, b=>{x=>8, y=>56}, c=>{x=>23, y=>4}, color=>'Green', };
Допустим, что мы пишем программу, которая должна рисовать на экране различные фигуры, в том числе окружности и треугольники, и двигать их.
Конечно, эти действия должны производиться процедурами. Одна функция для
рисования окружности, другая — для рисования треугольника. Для каждого вида
фигур своя процедура, хотя назначение у них одно и то же — рисовать. Придётся
выдумывать для каждой рисующей процедуры своё название, которое говорило бы,
во-первых, о её предназначении, и во-вторых, о виде фигуры, с которой она умеет
работать, скажем, drawCircle
,
drawTriangle
. Разумеется, эти процедуры должны получать
объект «фигура» в виде ссылок как параметр.
Такой подход долгое время был единственно возможным, да и сейчас он достаточно широко распространён. С другой стороны, алгоритмические языки совершенствовались, и сейчас в нашем распоряжении есть другая возможность — объединять свойства объекта с его умениями.
Для этого нужно расширить понятие объекта, взглянуть на него с более общей точки зрения как на агрегат, включающий в себя как свойства, так и методы, использующие эти свойства. Например, окружность — это нечто, имеющее центр, заданный двумя координатами, радиус и цвет, а также умеющее показаться на экране. А треугольник, хоть и описывается несколько другим набором данных, также имеет цвет и тоже способен нарисоваться. Это позволяет включить класс окружностей и класс треугольников в более общий класс фигур — и у тех, и у других есть общее.
Такой взгляд на программирование называется объектно-ориентированным, в противоположность традиционному процедурному. На переднем плане — объекты; программа — поле деятельности объектов. При процедурном программировании главные действующие лица в программе — процедуры.
Само собой, алгоритмические языки, позволяющие объектно-ориентированное программирование (ООП), упрощают номенклатуру процедур, предназначенных для выполнения похожих действий. Например, вместо
PerldrawCircle($circle); drawTriangle($triangle);
можно написать проще:
Perl$circle->draw; $triangle->draw;
Для этого нужно определить должным образом процедуры draw
для классов окружностей и треугольников. Приведённая запись подчёркивает, что
процедура draw
является неотъемлемой частью фигуры, наряду
с её свойствами. Об устройстве этих процедур мы говорить не будем. Фигуры можно
рисовать на текстовом экране, на графическом, в окошке, либо выводить на
принтер. А может быть, записывать изображение в графический файл. Реализация
будет зависеть от наших нужд. И хотя это процедуры и называются одинаково, они
относятся к разным классам. Программа сама решит, какую именно процедуру
вызвать, в зависимости от вида фигуры:
Perl$figure=$circle; $figure->draw; рисуется окружность $figure=$triangle; $figure->draw; рисуется треугольник