ООП против процедурного подхода.
![ООП против процедурного подхода.](/images/articles/oop-vs-procedure-style.png)
Недавно у меня спросили, чем ООП лучше процедурного подхода. Я подумал, что этот вопрос волнует большинство начинающих разработчиков, и решил написать статью на эту тему. Приятного прочтения.
Введение
В начале следует запомнить: нет лучшего или худшего стиля программирования. Все, что можно написать на ООП, можно написать и в процедурном стиле и наоборот. Однако, ООП обладает некоторыми преимуществами, о которых мы и поговорим в этой статье.
Процедурный стиль программирования - это функции. Да-да, обычные функции, которые вы ежедневно используете в своем коде. У вас есть какие-то данные в каком-то типе, например, число. Вы загружаете эти данные в функцию, и она возвращает результат.
В ООП вы создаете единую сущность - ОБЪЕКТ! В нем есть нужные свойства и методы, необходимые для манипулирования данными. Вы загружаете данные в объект, делаете что-то и получаете результат.
ООП легче для понимая в том плане, что оно приближено к реальности. Например, на форуме есть участники, верно? Ну так создайте объект member, который будет обслуживать сущность "участник". Там будут храниться все их данные: имена, фамилии, пароли, методы регистрации, авторизации и многое другое.
Еще один плюс ООП - модульность. Вы можете разбить свой код на отдельные модули и, следовательно, его будет легче поддерживать и улучшать.
Но самый большой плюс ООП - наследование.
Наследование
К примеру, вы можете создать объект User, который, как понятно из названия(еще один плюс ООП), будет отвечать за пользователей. Он будет содержать примерно такие свойства и методы:
<?php
class User {
public $username;
private $login = false;
public function isLogin() {
if($this->login === false) {
return 'Пользователь вне сети';
} else {
return 'Пользователь в сети';
}
}
public function login() {
if($this->login === false) {
$this->login = true;
} else {
$this->login = false;
}
}
}
?>
У нас есть объект с полями, содержащими логин пользователя и полем, которое показывает, авторизован пользователь или нет. Также у нас есть метод, проверяющий это поле и возвращающий результат, и метод, который авторизует или деавторизует пользователя.
Теперь мы решили создать администратора. Но он ведь тоже обычный пользователь, верно? Да, с чуть большими правами, но все же он просто пользователь. Зачем все это переписывать? Просто унаследуем.
<?php
class Administrator extends User {
public function ban($username) {
// баним пользователя
}
}
?>
Теперь администратор может также авторизоваться как пользователь, у него есть свой ник, но также есть дополнительный метод, позволяющий банить других пользователей.
Главный принцип ООП - DRY(Dont't Repeat Yourself) - не дублируй код. И его следует соблюдать.
Тоже самое можно сказать и про перегрузку методов. Вам не нужно менять ВСЁ, вам нужно лишь поменять часть кода.
Надеюсь, это понятно. Еще один существенный плюс - типизация.
Типизация
Вы можете явно указать какой объект должен быть, и никакой другой не пройдет.
<?php
// ...
public function __construct(User $user) {
// ...
}
// ...
?>
Мы явно указали, что в конструктор должен быть передан пользователь, а не что-то другое.
<?php
$user = new User();
$something = new Something();
$a = new Obj($something);
?>
Здесь мы передаем something вместо пользователя и получим ошибку.
Следующий плюс ООП - исключения. Вы можете создать те исключения, которые вам нужны и которые будут делать то, что вам нужно. Дальше вы можете отлавливать ошибки и, если они случаются, то вызывать то или иное исключение. Таким образом ваш код станет более устойчивым, а устранять ошибки станет легче.
Итак, в этой статье я перечислил далеко не все плюсы ООП, которых, поверьте, намного больше, но затронул одни из самых важных. Надеюсь, что данная статья вам помогла понять, чем же ООП лучше, чем процедурный подход, однако, вы можете использовать тот стиль программирования, который вам нравится больше, и вы будете абсолютно правы.
Если кто-то хочет серъезно изучить ООП, то советую почитать следующую книжку:
Мэтт Зандстра - PHP: Объекты, шаблоны и методики программирования
В этой книге довольно неплохо рассказывается про то, какие плюсы у ООП, как его правильно использовать и что такое шаблоны проектирования. Дерзайте! Удачи!
-
-
Михаил Русаков
Комментарии (21):
Михаил, а я как то на хабре видел статью (ее еще тогда писали разработчики vk), что процедурный код выполняется чуть шустрее ежели ооп. Так ли это?
Ответить
Так, він виконується трохи швидше, але не потрібно робити заміни в коді з ооп на процердуний, тільки тому, що на 0.003 виконується швидше. Якщо постає питання швидкості - потрібно думати про використання memcache, nosql, зберігати сесії в memcachedb, а не на файлах і т.д Хочу порадити по цьому(не рахуйте за рекламу) ruhighload.com А щодо статті хочу сказати, що де треба одну функцію - не треба городити клас, де є об'єкт з купу методів - треба робити на ооп. Але не потрібно з ооп робити фабрики фабрик..
Ответить
Есть у ОПП один минус, на нем практически не возможно создавать динамические сайты, например применение технологии AJAX становится довольно сложным делом. На ОПП можно строить блоки,какие-то CMS. А вот построить какой-то блок с данными,которые будут обновляться в реальном времени намного тяжелее. Плюс без знаний MVC, вернее о нормальном представлении что это такое на ОПП программировать практически не возможно, кстати это одна из причин почему люди,которые привыкли к программированию на процедурном языке очень тяжело перескакивают на ОПП. Я сам видел сайты с большим количеством классов , в которых по две ,три строчки. То есть все сделано по принципу, котлеты отдельно ,мухи отдельно, крылья мух отдельно,ножки мух отдельно и так далее. А уж объяснить "процедурному" программисту зачем нужны Абстрактные классы,Интерфейсы объектов и так далее вообще практически не реально
Ответить
Что-то с ajax вы преувеличиваете. Никаких сложностей. Все делается в контроллере. Дергаем данные из модели и выводим в виде. Никаких проблем. Даже и не думал, что это так сложно
Ответить
А МОЖНО ПОСМОТРЕТЬ РАБОЧИЙ ПРИМЕР С ИСПОЛЬЗОВАНИЕМ НАПРИМЕР $.POST()
Ответить
я обычно делаю класс контроллера, к примеру называю его ajax. и аяксом отправляю пост запросы в /index/name_function в которой уже и подключаю нужные модели и прочее.
Ответить
Да, хороший вариант, согласен, но согласитесь для "процедурщика" это темный лес. Куда проще отправить данные, например, на ajax.php , где уже есть подключение к базе данных и нужные функции , и получить обратно ответ в какой-нибудь, <div>. НУ как-то так
Ответить
ну я только месяца 2 вэбом занимаюсь. До этого джавой увлекался. Хабр многому научил и учит + на тостере тыщу вопросов задаю, народ там знающий, помогает
Ответить
а по поводу процедурщика. Я был им ничтожное время и после джавы я себе не представляю даже как можно иначе:( Но спорить не буду, переучиваться всегда сложнее чем что-то выучить
Ответить
Я процедуркой программирую уже лет 5 а на ОПП перешел года два как, так если честно до сих пор понять не могу чем ОПП лучше, тут скорее всего зависит от того кто как привык и от количества человек работающих над скриптом, если какой сайт клиенту сделать то это одно, ну а если магазин с возможностью добавлять всякие модули то это другое. Кстати из личного опыта могу сказать , что процедурный подход работает быстрее, меньше шагов вправо влево делать надо. У меня обычно бывает микс, я использую в одном скрипте и ОПП и процедурный подход.
Ответить
А у меня вот все иначе) Все, кого знаю из веб области, убеждают, что процедурка целесообразнее. Мол привязка клиента, более быстрое исполнение скриптов и т.д.)))
Ответить
И таки они правы на все 100 Процедурка и целесообразнее и быстрее
Ответить
так вот. И как ооп`шнику пересесть не процедурку? Миф и не реальность)
Ответить
Легко, у меня все мои друзья , которые программировали на С++, свободно на процедурку перешли
Ответить
Ух ты! Да вы тут чат устроили) Ну, раз пошло такое дело, то выскажу и я свое мнение. Как в статье и написано, плохого или хорошего подхода нет. Если вы пишете скрипт на 10 строк(я утрирую, конечно), то не стоит заморачиваться с ООП. Тогда и скрипт будет быстрее работать и все будет понятно. Однако, если вы собираетесь писать большой портал, где, как сказано выше, будут модули, очень много самого разного функционала и состоять портал будет из ТЫСЯЧ файлов, то тут, конечно, лучше использовать ООП. Особенно, если вы работаете в команде. Но, если вы совсем не понимаете, зачем нужно ООП, пишете все в процедурном стиле и у вас это хорошо получается, то тогда пишите так и дальше. Но хотя бы основы ООП знать все же стоит.
Ответить
100%
Ответить
Хорошая статья. У меня к вам вопрос. Я знаю ООП, но не очень хорошо. А сайт создать все-таки хочется. Так вот, стоит ли писать сайт на процедурном походе, а потом, когда очень хорошо освою, переписать на ООП или изучить как следует ООП и писать на нем?
Ответить
Учи ООП, многие вещи будет корректней программировать с его использованием
Ответить
ООП лучше тем, что можно разбивать программу на классы и MVC этим самым менее загрязняя html код, и плюс к тому, что на ООП свой код можно лучше защитить от взломов. Ведь намного проще, например, когда вы написали сайт, а через время захотели сделать в нём некие изменение, например, добавить гостевую книгу. Вы просто создаёте новый класс и подключаете класс guestbook к классу где выполняется подключение к базе данных и так далее. Ещё очень хороший пример, так - это когда вы хотите сменить шаблон текущий на другой. Если у вас сайт будет написан на процедурном стиле программирования, то придётся и в программный код влазить глубоко по скольку у вас код будет и на страницах сайта. А если написан сайт при помощи ООП, то вам не нужно лазить в программный код. Единственное, так - это вам прописать php строки нужно и то, если у сайта нету шаблонезаторов.
Ответить
Не совсем согласен, при правильном написании даже на процедурном коде, все равно создается функция шаблонизатора,поэтому внешне html выглядет так же. Смешивать php и html считается дурным тоном даже для процедурного программиста, не зря придуманы записи такого типа <?if($a<=$b):?> html код <?endif;?> и это работает в обоих стилях ну и такое тоже <?=$title;?> или %title% все зависит от шаблонизатора
Ответить
Про php конструкции не спорю, но опять таки, всё зависит от того, что вы пишите, если это новостной портал, то там трудно будет писать его в процедурном стиле, поскольку он имеет не один и не 2 скрипта, и о безопасности тоже нужно думать, чтобы вас не ломанули уж тем более на процедурном стиле. И к тому же у Михаила на сколько я знаю php кода нет. Ну а если сайт вы делаете лично для себя и делаете сайт - визитку, то можно даже, и шаблонезатор не делать. Кстати, самое главное в ООП - это его реализм и MVC, без них не было бы смысла в ООП и создавать его.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.