Контакты
Местоположение
Россия, Смоленская обл., Смоленск

Достижения

Все достижения (7)

Наибольший вклад в теги

Все теги (21)

Лучшие ответы пользователя

Все ответы (12)
  • Почему Service Locator это зло и что использовать вместо?

    kraso4niy
    @kraso4niy
    fullstack
    1. Вы всё верно поняли. Сложность в том что внутри может оказаться не та структура которую вы ожидайте (ожидалась)

    Но это не значит что это плохо. Эту проблему можно решить валидацией. В вашем примере достаточно проверять на instanceOf. Тогда код станет правильный. А в symfony сделали это ещё лучше и добавили строгость к типам для сервис локатора через подписку на сервисы.

    Что бы понять когда применять сервис локатор, а когда инъекцию пройдите по ссылке https://symfony.com/doc/current/service_container/... и почитайте.

    Там есть пояснение:
    Sometimes, a service needs access to several other services without being sure that all of them will actually be used. In those cases, you may want the instantiation of the services to be lazy. However, that’s not possible using the explicit dependency injection since services are not all meant to be lazy


    Можно пояснить на примере: допустим у вас есть класс с методом, и внутри метода только в некоторых случаях вам понадобится сделать запись в БД (допустим обращение к сервису в виде get->('db')).

    Например:
    if($userData = $request->get('user_data')) {
        $db = $serviceLocator->get('db')->insert($userData);
    } else {
       die("user data empty");
    }


    Если делать через инъекцию, то $db всегда будет инициализирована, например если проводить инъекцию через конструктор или метод, то объект вашего класса всегда будет при любых условиях запускать код инициализации $db и тратить на это ресурсы. Пример через инъекцию (тут тип инъекции через аргумент метода, аналогично можно сделать через конструктор или сеттер)

    class MyClass {
       // $db будет инициализрован, но используется только в 1 случае для if
      // если $db тяжёлый сервис и инициализируется долго это проблема!
       function httpResponse(Request $request, Database $db) {
          
           if($userData = $request->get('user_data')) {
              $db->insert($userData);
           } else {
              die("user data empty");
           }
       }
    }


    А в случае сервис локатора $db будет инициализирован только в условии когда придёт user_data. Таким образом если у вас контроллер использует 15 сервисов (но это bad code!), а одновременно нужен только 1 из них, лучше использовать сервис локатор.

    class MyClass {
       // В таком случае рекомендуется воспользоваться сервис локатором! 
       function httpResponse(Request $request, Database $db, Servive1 $s1, Service2 $s2) {
          
           if($userData = $request->get('user_data')) {
              $db->insert($userData);
              if ($db->lastId()) {
                   $s1->makeSuccess();
                   if($s1->isSuccess()) {
                       $s2->commit();
                   }
              }
           } else {
              $s2->rollback();
              die("user data empty");
           }
       }
    }


    Отсюда следует почему сервис локатор считается антипаттерном. Если ваш класс использует 15 сервисов, и из них все используются выборочно, то вам вероятно следует изменить архитектурный подход, провести рефакторинг, провести декомпозицию класса.

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

    P.S:
    Использовать service locator можно и в этом нет ничего страшного, особенно когда есть понимание что это такое и для чего он нужен.
    Ответ написан
    Комментировать
  • Почему много людей в IT недовольны своей работы?

    kraso4niy
    @kraso4niy
    fullstack
    IT - это супер интересная область. Тут огромные возможности , потому что компьютер даёт эти возможности. Потому что без компьютера невозможно уже сделать что-то конкурентное. Любое производство, любой текст, любая информация - это компьютер! IT - очень разнообразная сфера. Это не только "кодить в IDE" и "попивать кофе/смузи" и "сидеть за монитором по 18 часов" - это и оптоволокно и спутниковая связь, и работа автомобильных систем, и станки и тракторы и ракеты. Как и любая профессия, она может быть очень интересной и очень скучной.

    Люди чаще недовольны, чем счастливы и это недовольство заставляет их двигаться вперёд - удовлетворять свои материальные и духовные потребности :) и это нормально :)

    Любая профессия интересна по своему и это всё субъективно. IT - одна из немногих сфер которая позволяет жить и работать там где хочется и при этом зарабатывать те деньги на которые можно комфортно жить.

    Недовольства от работы могут быть в любой сфере. Всё зависит от ситуации, компании/бизнеса и хотелок человека.

    Счастье наступает когда человек может то что хочет и хочет то что может :)
    Ответ написан
    9 комментариев
  • Каким программистом стать?

    kraso4niy
    @kraso4niy
    fullstack
    Главное чтобы вы не занимались 1с , даже под предлогом высокой зарплаты (не знаю где вы видели высокие зп для 1с) пожалуйста не нужно двигать это УГ .

    Советую начать с веб программирования (php,ruby,python,sql языки), это даст понимание как всё работает вообще плюс ко всему данная сфера охватывает многие области и есть спрос, а после этого дальше уже можно и на java и на c# переходить или на c.
    Ответ написан
    Комментировать
  • Как делать PDF по шаблону?

    kraso4niy
    @kraso4niy
    fullstack
    Использовать chromium headless -> html -> pdf конвертирование. HTML шаблоны можно пиксель-в-пиксель сделать. Далее скормить их хрому и конвертнуть. Гуглится всё это https://habr.com/ru/post/459112/
    Ответ написан
    Комментировать
  • Где можно найти примеры тестовых заданий на должность Php senior developer?

    kraso4niy
    @kraso4niy
    fullstack
    Вот вам тестовое задание от компании тикетлэнд.

    // Тестовое задание
    
    // Реализовать класс дерева, наследующийся от абстрактного Tree:
    
    class Node
    
    {
    
    private $name;
    
    function __construct($name)
    
    {
    
    $this->name = $name;
    
    }
    
    }
    
    abstract class Tree
    
    {
    
    // создает узел (если $parentNode == NULL - корень)
    
    abstract protected function createNode(Node $node,$parentNode=NULL);
    
    // удаляет узел и все дочерние узлы
    
    abstract protected function deleteNode(Node $node);
    
    // один узел делает дочерним по отношению к другому
    
    abstract protected function attachNode(Node $node,Node $parent);
    
    // получает узел по названию
    
    abstract protected function getNode($nodeName);
    
    // преобразует дерево со всеми элементами в ассоциативный массив
    
    abstract protected function export();
    
    }
    
    // Обеспечить выполнение следующего теста:
    
    // 1. создать корень country
    
    $tree->createNode(new Node('country'));
    
    // 2. создать в нем узел kiev
    
    $tree->createNode(new Node('kiev'), $tree->getNode('country'));
    
    // 3. в узле kiev создать узел kremlin
    
    $tree->createNode(new Node('kremlin'), $tree->getNode('kiev'));
    
    // 4. в узле kremlin создать узел house
    
    $tree->createNode(new Node('house'), $tree->getNode('kremlin'));
    
    // 5. в узле kremlin создать узел tower
    
    $tree->createNode(new Node('tower'), $tree->getNode('kremlin'));
    
    // 4. в корневом узле создать узел moskow
    
    $tree->createNode(new Node('moskow'), $tree->getNode('country'));
    
    // 5. сделать узел kremlin дочерним узлом у moskow
    
    $tree->attachNode($tree->getNode('kremlin'), $tree->getNode('moskow'));
    
    // 6. в узле kiev создать узел maidan
    
    $tree->createNode(new Node('maidan'), $tree->getNode('kiev'));
    
    // 7. удалить узел kiev
    
    $tree->deleteNode($tree->getNode('kiev'));
    
    // 8. получить дерево в виде массива, сделать print_r
    
    print_r($tree->export());
    
    /**
    
    результатом последнего пункта должен быть следующий вывод в STDOUT:
    
    Array
    
    (
    
    [country] => Array
    
    (
    
    [moskow] => Array
    
    (
    
    [kremlin] => Array
    
    (
    
    [house] =>
    
    [tower] =>
    
    )
    
    )
    
    )
    
    )
    
    */
    Ответ написан
    1 комментарий

Лучшие вопросы пользователя

Все вопросы (8)