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

16 октября 2015 12:00
1238
0

Введение в объектно-ориентированное программированиеС развитием персональных компьютеров увеличился спрос на программное обеспечение. На сегодняшний день профессия программиста является одной из наиболее оплачиваемых, при этом число хороших программистов не так уж и высоко. Одно из главных требований к программистам - умение работать в команде, и не важно на каком языке вы пишите. Как показала практика, процедурное программирование не очень удобно при построении больших приложений и командной работе. Именно поэтому большой популярностью среди профессионалов пользуется Объектно-ориентированный стиль программирования. Вы наверняка слышали такие языки, как 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);

?>

Похожие статьи