Введение в объектно-ориентированное программирование

12:18 16 окт. 2015

Введение в объектно-ориентированное программированиеС развитием персональных компьютеров увеличился спрос на программное обеспечение. На сегодняшний день профессия программиста является одной из наиболее оплачиваемых, при этом число хороших программистов не так уж и высоко. Одно из главных требований к программистам - умение работать в команде, и не важно на каком языке вы пишите. Как показала практика, процедурное программирование не очень удобно при построении больших приложений и командной работе. Именно поэтому большой популярностью среди профессионалов пользуется Объектно-ориентированный стиль программирования. Вы наверняка слышали такие языки, как  Java, C++, Object Pascal (Delphi), PHP, Python, все они поддерживают ООП, и если вы решили постичь искусство программирования, то без ООП не обойтись. Данная статья предназначена для людей, которые уже освоили основы того или иного языка (хотя бы понимают операторы языка программирования), и теперь хотят расширить свои знания. Все примеры приводятся на языке PHP, но это не значит, что они будут работать при использовании других языков.

В основе ООП лежат три понятия: инкапсуляция, полиморфизм и наследование. Разберем их по порядку.

Инкапсуляция

Инкапсуляция - механизм позволяющие разбить программу на отдельные блоки (классы) и спрятать в них необходимые функции и переменные. Разберем пример как инкапсуляция реализовывается на практике. Для этого (сугубо в учебных целях) создадим класс  Calc, в котором реализуем две функции: поднесение к степени (pow) и нахождение суммы массива (array_sum).

<?php

class Calc

{

      public function array_sum($x=array())

      {

            $c = count($x);

            for($i=0;$i<$c;$i++)

           {

                  $sum +=$x[$i];

            }

            return $sum;

      }

      public function pow($x,$y)

      {

            while($y>0)

            {

                  $x*=$x;

                  $y--;

            }

            return $x

      }

}

?>

Имена функций выбирались не случайно, так как в PHP pow является стандартной функцией, то подобный пример показывает, что конфликт в именований функций в данном случае не возникнет, поскольку наша функция скрыта в классе Calc. Это и называется инкапсуляцией. В примере обратится к нашим функциям можно следующим образом:

<?php

Calc::array_sum(array(1,2,3,4,5));

Calc::pow(2,10);

?>

Подобный способ обращения подразумевает использование класса, как пространства имен. Но парадигма называется Объектно-ориентированная. Поэтому на данном этапе нужно рассказать о том, что принято называть объектами. Чтобы продемонстрировать в чем отличие объекта от пространства имен создадим новый класс, который будет описывать капчу.

<?php

public class Captcha

{

      public $text;

      public $bg_color;

      public $fg_color;

      public void draw()

      {

            ...

            // код рисующий капчу, на основе значений $text, $bg_color, $fg_color.

            ...

      }

}

?>

В подобном примере вызов Captcha::draw() приведет к ошибке, так как неизвестно как не заданы параметры $text, $bg_color, $fg_color. Для работы с этим классом необходимо создать объект, делается это при помощи оператора new.

<?php

$cap = new Captcha(); // создаем обькт класса Captcha

$cap->text = rand(0,999999); //Задаем выводимый текст

$cap->bg_color = 0xdddddd; // Цвет фона

$cap->bg_color = 0x444444; // Цвет текста

$cap->draw(); // Вызываем метод, который рисует

?>

Теперь наш код заработает, так как все необходимые параметры мы указали до вызова метода рисования, при чем они сохраняются внутри класса, поэтому можно их использовать в любом методе.

Наследование

Еще одной важной составляющей ООП является возможность наследования классов. В нашем классе капчи код для отрисовки картинки нужно реализовать самостоятельно, но предположим, что рисование картинки мы уже реализовывали в другом классе, поэтому более логичнее будет расширить класс рисования изображения, добавив к нему новые свойства и методы. Пусть класс рисования имеет следующую структуру.

<?php

public class ImageDraw

{

      public function draw()

      {         

            ...

            // код рисующий картинку из текста

            ...

      }

}

?>

Теперь расширим наш класс капчи

<?php

class Captcha extents ImageDraw

{

      public $text;

      public $bg_color;

      public $fg_color;

}

?>

Таким образом можно пользоваться методом draw() из класса Captcha, как будто он прописан в самом классе. Если же прописать метод draw() еще и в классе Captcha, то последний перекроет первый, и таким образом можно не только расширять классы, но и переопределять их свойства и методы.

Полиморфизм.

Последнее ключевое понятие ООП - полиморфизм. Чтобы понять что это такое представим ситуацию, что у нас имеются некоторый набор текстовой информации и нам нужно работать с ней в трех форматах: xml, JSON и csv. Для всех трех форматов можно выделить общие операции (создание, изменение и вывод) и поместить их в отдельный интерфейс, при этом алгоритм обработки каждого формата будет индивидуальным.

Рассмотрим все вышеописанное на примере:

<?php

//Создаем абстрактный класс для работы с текстом

abstract class Text

{

      abstract public function create(); // абстрактный метод «Создаем файл»

      abstract public function edit(); // абстрактный метод «Вносим правки»

      abstract public function show(); // абстрактный метод «выводим файл»

}

// Теперь создадим два класса которые реализуют наш интерфейс

class XMLText extends Text

{

      public function create()

      {

            //реализуем создание формата

      }

      public function edit()

      {

            //реализуем редактирование

      }

      public function show()

      {

            //реализуем вывод

      }

}

 

class JSONText extends Text

{

      public function create()

      {

            //реализуем создание формата

      }    

      public function edit()

      {

            //реализуем редактирование

      }

      public function show()

      {

            //реализуем вывод

      }

}

?>

Теперь можно упростить работу с текстом различных форматов воспользоваться следующей конструкцией:

<?php

function showText($txt)

{

      if($txt instanceof Text)

      {

            $txt->show(); //Здесь мы не знаем из какого класса будет вызван метод show()

      } else {

            echo 'Неизвестный формат';

      }

}

 

$xml = new XMLText;

$xml = new JSONText;

 

showText($xml);

showText($json);

?>


Теги: ООП php
Категория Программирование   |   0 комм.
Нет результатов.