За последние 24 часа нас посетили 30713 программистов и 1463 робота. Сейчас ищут 770 программистов ...

В чем преимущество объектов?

Тема в разделе "PHP для новичков", создана пользователем Walk, 17 янв 2018.

  1. Walk

    Walk Активный пользователь

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Всем нужно ООП, все пишут на ООП, а я вот задумался - а в чем собственно преимущества объектов?

    Вроде бы говорят, что это удобно. Но на текущем уровне, и в текущих домашних поделках (только на домашних поделках можно экспериментировать - на работе приходится "работать в тренде") мой опыт показал, что с фулл статикой мне работать в разы удобнее.

    Второй довод - защищенность кода. Казалось бы да... но практика показывает, что:
    1. При желании можно сломать любой код
    2. То, что код "защищенный" не значит, что приложение нормально работает. Я наблюдал забавную ситуацию, когда один крупный проект начал падать от того, что слишком много пользователей начали обращаться на несуществующие запросы, а проект спроектирован так, что ему нужно выполнить кучу логики, чтобы показать ошибку 404.

    А вот чем хуже - быстродействием. Ради интереса посчитал, во сколько арифметические операции с объектами:

    PHP:
    1. <?php
    2.  
    3. class Number
    4. {
    5.     private $number;
    6.  
    7.     public function setNumber($value)
    8.     {
    9.         $this->number = $value;
    10.     }
    11.  
    12.     public function getNubmer()
    13.     {
    14.         return $this->number;
    15.     }
    16. }
    17.  
    18.  
    19. class Arithmetic
    20. {
    21.     public function sum($a, $b)
    22.     {
    23.         return $a + $b;
    24.     }
    25. }
    26.  
    27. $a = microtime(true);
    28. $i = 0;
    29.  
    30. while ($i < 1000000) {
    31.     $nubmerOne = new Number();
    32.     $nubmerOne->setNumber(25);
    33.     $numberTwo = new Number();
    34.     $numberTwo->setNumber(10);
    35.     $arithmetic = new Arithmetic();
    36.     $arithmetic->sum($nubmerOne->getNubmer(), $numberTwo->getNubmer());
    37.     $i++;
    38. }
    39.  
    40. $b = microtime(true);
    41. $o = $b - $a;
    42.  
    43. echo '<p>Арифметические операции объектами: '.$o.'</p>';
    44.  
    45. $h = microtime(true);
    46. $i = 0;
    47.  
    48. while ($i < 1000000) {
    49.  
    50.     $a = 25;
    51.     $b = 10;
    52.     $c = $a + $b;
    53.  
    54.     $i++;
    55. }
    56.  
    57. $j = microtime(true);
    58. $p = $j - $h;
    59.  
    60. echo '<p>Арифметические операции без объектов: '.$p.'<br />';
    61. echo '<p>Арифметические операции без объектов выполняется в '.($o/$p).' раз быстрее.</p>';
    Скрипт выдает, что операции без объектов выполняются в среднем в 25 раз быстрее.

    Конечно, раз ООП стало в вебе стандартом - в чем-то оно лучше. Но, чем, мне откровенно непонятно.
     
    #1 Walk, 17 янв 2018
    Последнее редактирование: 17 янв 2018
  2. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Для чистоты эксперимента надо было, как минимум, простое сложение также делать через функцию... Вы же, по сути, хотите сопоставить процедурное и ОО программирование. Естественно лапша будет работать всегда быстрее.... Но вот работать с ней.....
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    только в том случае если там лапши на 100-200 строчек кода если лапша начинает повторять сама себя, нарастающий функционал лапши будет излишни великим, где на ооп придётся написать всего лишь единожды описать режим работы и потом заниматься созданием просто экземпляра объекта... То я бы поспорил о быстроте функционала.
     
  4. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    В любом случае, конечно же и функциональное здесь будет быстрее. Т.к. вы выполняете больше операций в цикле. Тут больше вопрос в удобстве работы с кодом. Точно так же, например, и принцип MVC замедляет работу кода.
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    а ты попробуй поставь себе задачу, опиши колесо машины. И создай его 4 экземпляра. Ведь на каждую машину приходится по 4 колеса. А потом опиши тоже самое на функциях. И посмотри разницу удобства. Но если ты не шаришь в ООП, то ты будешь ООП лепить как процедурку и естественно тебе покажется что процедурка будет лучше.
     
  6. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    А тут и спорить не чего. Тут просто надо понимать как это работает.
    В лапше нет накладных расходов на, утрировано, создание в памяти области для работы функций и методов, нет накладных расходов для создание экзмпляра класса. Тупо идет последовательная обработка кода с минимумом джампов.
     
  7. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    Помнишь недавно в скайпе писал "у меня беда с ооп, как собака - понимать поинмаю с сам сделать сложно"
    короче, с горем пополам сделал класс и объектами его объектами!!!! показал работу старшему программисту, он говорит "что тут наворотил? какие объекты ))) и все переделал процедурным стилем, мало того что код стал в три раза короче, так и быстрей в два раза...
    Видимо главное преимущество ООП это гибкость
     
    Walk нравится это.
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я бы не сказал что она замедляет на столько что можно было бы почувствовать разницу. Вот честно.
     
  9. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Функционал будет одним и темже - количество строк разным.. Причем значительно разным.
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    вы просто не умеете его готовить.
    --- Добавлено ---
    ну тут я чутка не так написал. (За что извеняюсь, написал масло масленное). Я имел ввиду излишество кода будет.
     
  11. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Ну, а как не замедляет? Она добаляет дополнительные сущности в код, которые нужны лишь разработчику. Утрировано ты в одном случае видишь GET запрос. Сразу заправшиваешь 100 строк в БД, и в том же цикле их выводишь на страницу. В MVC роутер решает кому отдать запрос, идет инклуд, далее все 100 строк получаются из базы, потом отдается в отображение, где еще один цикл выводит их на страницу
     
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    А вообще я про то и говорю. Тут главное понимать, где нужно использовать функцию, а где класс.
     
  13. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    я смотрю работать не кто не хочет, всем бы ляса точить... а у нас снег наконец то пошел в Харькове
     
  14. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    я ж сказал про лапшу:
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    только вот роутер и добавляет. Но роутер, работает быстренько. Вон я пользуюсь слимом, да там прилично кода, но работает он очень быстро. Разница на глаз абсолютно не заметна даже при больших нагрузках.
    --- Добавлено ---
    согалсен
     
  16. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Модель получила 100 строк и занесла их в массив. Вернула контролеру. Контроллер передал массив в представление. Где в цикле (второй цикл по тем же данным) осуществляется вывод ;)
     
  17. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    не у всех всё так работает. Как я и писал MVC это идеология :) Я работаю с ед. точкой входа, где я маршрутизирую ссылку соглассно определённому контроллеру где я уже сам решаю какую модель мне подключить и нужно ли её подключить, а может я прямо из контроллера, всё сделаю и отправлю во view, зачем нагружать излишним дёрганьем классов каких либо.
    --- Добавлено ---
    Всё зависит от сложности задачи обработчика. Если задача тривиальная проверить юзера... То нахрен мне вообще лезть в модель, я в контроллере опишу логику работа там 5 строчек всего и верну, результат обратно allow или disallow и всё.
    --- Добавлено ---
    вот пример:
    Контроллер просто влезает в расстояние между моим большим и указательным пальцем. Всё зачем мне создавать под это ещё модель.
    PHP:
    1. public function authLogin(Request $request, Response $response)
    2.     {
    3.         $result = [];
    4.         $tokenName = $request->getAttribute($this->nameKey);
    5.         $tokenValue = $request->getAttribute($this->valueKey);
    6.         $csrf = $this->arrayCsrf($tokenName, $tokenValue);
    7.         // Get Post Request;
    8.         $post_data = $request->getParsedBody();
    9.  
    10.         // Users verify
    11.         // create @var $error
    12.         $error = false;
    13.         $user = Users::getUserByEmail($post_data['login_email']);
    14.         if ($user === Null) {
    15.             $error = true;
    16.         } else {
    17.             if (password_verify($post_data['password_login'], $user['password'])) {
    18.                 $_SESSION['user_id'] = $user['id'];
    19.                 $result['success'] = true;
    20.             } else {
    21.                 $error = true;
    22.             }
    23.         }
    24.         // check @var $error
    25.        if($error === true) {
    26.            $result['error'] = ['login' => false];
    27.            $result['csrf'] = $csrf;
    28.        }
    29.         // end check
    30.         // return Response
    31.         $newResponse = $response->withJson($result);
    32.         return $newResponse;
    33.     }
     
  18. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Вообще, кстати, в свое время, когда я уже во всю программировал с использованием ООП. Мне в поезде в руки досталась книга C++ для чайников.... В ней была часть объясняющая работу ООП и как то так было все тупо и просто расписано, что у меня кое что даже по полочкам более правильно разложилось (до этого, если утрировать, относился к ООП "ну так надо").... Объяснений не помню, но может в интрнете найдете почитайте (хотя там уж редакций много наверное сменилось)
    --- Добавлено ---
    Т.е. контроллер лезет на прямую в бд?
     
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Да если бы задача стояла не только в проверке юзера, но и в написании после этого какого то результата, то я скорее всего вынес бы всю эту хрень в отдельный статический класс, с запоминанием что узер проверен, или нет. И писал бы логику дальше
    --- Добавлено ---
    не совсем для этого существуют библиотеки для работы с бд, у меян даже модель не работает напрямую с бд, для этого есть библиотеки получения данных, у меня не сколько другое понимание mvc, но оно работает изумительно. И мне очень удобно.
     
  20. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Контроллер работающий с данными это уже нарушение MVC. Для командной работы над проектом это уже грубая ошибка,
    --- Добавлено ---
    Пользователь (мыло, пароли и т.п.) это же тоже данные.
     
  21. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    но иногда бывает и так, тока через query builder пример:
    PHP:
    1. public function getCommentByVendorCode (facadeRouter $router) {
    2.         $post = $router->getPost();
    3.         if (empty($post['vendor_code'])) {
    4.             return $router->withJson(['type' => 'error']);
    5.         }
    6.         $vendor_code = (int)$post['vendor_code'];
    7.         $res = Query::connect('my_comment')->where(['vendor_code' => $vendor_code])->order('id DESC')->getAll();
    8.         if (empty($res)) {
    9.             return $router->withJson(['type' => 'error', 'text' => 'Нет комментариев. Будьте первым кто их оставит!']);
    10.         }
    11.         return $router->withJson(['type' => 'allow', 'comments' => $res]);
    12.  
    13.     }
    --- Добавлено ---
    @voral вот и скажи мне что мне тут в модель выносить
     
  23. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Конечно, хреначить все в одну простыню удобно(удобно не переключая вкладки кодить:D), но это не то, что должен делать программист.
     
  24. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Вот в приведенном вами коде. Вы в контроллере проверяете пароль при помощи определенного алгоритма, придет другой разработчик и прочитав что у вас MVC по какимто объективным причинам изменит логику шифроания пароля там где он сохраняется.. И все... Трындец вашему проекту. ;)
    --- Добавлено ---
    @askanim,
    PHP:
    1. $res = Query::connect('my_comment')->where(['vendor_code' => $vendor_code])->order('id DESC')->getAll();
    Т.к. если вам потребуется в дальгнейшем обработка данных полученных в БД выысделаете ее в одном месте.. Если делать как вы - придется искать везде...

    Это у вас точно НЕ MVC
    --- Добавлено ---
    Подход MVC четок в этом отношении.. .Тут не должно быть "да тут не зачем разделять", просто разделяете и все. Точка. Просто вы либо реализуете MVC либо нет. Т.е. если я возьмус за ваш код, зная что он MVC я должен быть уверен, что не должен собирать везде запрос списка комментариев.
     
    runcore нравится это.
  25. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @voral вот и скажи мне что мне тут в модель выносить
    то есть вы хотите сказать что строчку кода нужно размножить на ориентировачно 10-15 строчек создавая отдельный класс с проверкой на поступления переменной в метод, передавая его потом в query builder и проверкой на пустоту возрврата данных и вернуть либо false либо массив данных... Не хило.
    нет просто вы не понимаете что такое MVC
    --- Добавлено ---
    Подход MVC это капля в море. Каждый понимает по своему.
    --- Добавлено ---
    ну значит разраб индус! :D Раз он будет менять шифрование пароля.
    --- Добавлено ---
    Потому что каждый норм пыхер знает что надо использовать DEFAULT от пыха. Ибо оно может взять и измениться (Например шифрование возьмёт и станет бесполезным). А по дефолту стоит то что нужно, и при обновлении его в пыхе соответственно код изменений не понесёт.

    ИМХО моё мнение: Программист должен писать код чисто и оптимально. Если он это делает, другой прогер тоже сядет и разберётся в нём. А если сидеть и работать красота ради красоты, это волк в овечьей шкуре, значит чувак не понимает что он делает.
    --- Добавлено ---
    как и с ООП, когда ты услышал тут фразу теперь её понимаю: Писать ООП ради ООП не надо.