Ответы пользователя по тегу Программирование
  • Структурирование исключений. Что вы указываете в качестве exeption code?

    @xfg
    Понял, вас интересует для чего нужно свойство code в исключениях. К сожалению, я так и не смог нагуглить точного описания для чего в php это свойство добавили к исключению и для каких целей php предлагает его использовать сегодня.

    Но я думаю, что так сложилось исторически. В PHP 3 появились самые первые средства для работы с ООП. Не такие мощные и функциональные, какими вы их видите сегодня в PHP 5/7. Тогда механизм исключений в php не позволял добавлять множественные catch блоки. Это не имело смысла, так как в php не существовало возможности типизировать аргументы функций. Соответственно единственная возможность отличить одно исключение от другого внутри блока catch это использовать свойство code. Время прошло, добавили типизацию, множественные catch блоки, а свойство code осталось, как и многое другое в php. Использовать свойство code в настоящее время вряд ли имеет какой-либо смысл.
    Ответ написан
    Комментировать
  • Как монетизируются языки программирования и бесплатные фреймворки?

    @xfg
    Колесят по конференциям и собирают барыши. Книгами барыжат. Много всего.
    Ответ написан
    3 комментария
  • Как повысить уровень программирования?

    @xfg
    Если говорим об ООП подходе, то прочитать книгу по DDD от Вон Вернона. Фактически автор описывает, как строить многоуровневую архитектуру, чтобы разделить кашу из бизнес-логики, работы с хранилищем, приложением и представлением, на отдельные слои с однонаправленным потоком данных. Книга задает вектор движения и позволяет минимизировать собственные творческие шатания из стороны в сторону, которые приводят в итоге к спагетти коду.
    Ответ написан
    Комментировать
  • В чем косяк (полиморфизм)?

    @xfg
    В программировании несколько различных видов полиморфизма. Вам следовало уточнить, о каком из них идет речь. Собеседующий с вами конечно же не совсем корректен, так как простейшая форма полиморфизма в вашем примере все же присутствует. Другое дело, что в php под полиморфизмом обычно понимают полиморфизм подтипов. Выглядит так
    interface UnitInterface {
      public function setHp();
    }
    class Warrior implements UnitInterface {
      public function setHp() {...}
    }
    class Medic implements UnitInterface {
      public function setHp() {...}
    }
    
    class MainProgram {
      private $unit;
    
      public function __construct(UnitInterface $unit) {
        $this->unit = $unit;
      }
      public function run() {
        return $this->unit->setHp();
      }
    }
    
    echo (new MainProgram(new Warrior())->run();

    Идея в том, что конструктор класса MainProgram ничего не знает о конкретных реализациях ваших юнитов. Он знает только о том, что они должны удовлетворять интерфейсу UnitInterface. В будущем если у вас хорошо спроектирован интерфейс, то вы сможете заменить одну реализацию юнита на другую, не изменяя код внутри MainProgram. Таким образом, вы соблюдаете принцип открытости/закрытости из SOLID, который говорит, что классы должны быть открыты для расширения, но закрыты для изменений.
    Ответ написан
    1 комментарий
  • В чем разница между многопоточностью, многозадачностью и многопроцессовостью?

    @xfg
    В одном процессе может быть много потоков, но всегда как минимум есть один. Потоки внутри одного процесса делят общую память, изменение данных в одном потоке будет видно во всех остальных.

    В тоже время одна программа может порождать много процессов, процессы в отличии от потоков не делят общую память.

    А многозадачность это свойство ОС вычислять одновременно (*условно говоря) много задач (процессов и потоков) или проще говоря программ. Это дает вам возможность одновременно играть в игру и слушать музыку на своем компьютере.

    * на самом деле процессор работает в последовательном режиме и соответственно на самом деле не может одномоментно вычислять более 1 процесса или потока, но так как он способен вычислять гигантское количество операций в единицу времени и быстро переключается с одного процесса/потока на другой и обратно, то часто говорят одновременно. Но и здесь стоит сделать оговорку, что многоядерные процессоры позволяют действительно вычислять несколько процессов/потоков параллельно, где каждое ядро процессора может взять на себя вычисление 1 потока или процесса в единицу времени.

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

    При создании любого процесса внутри него автоматически создается как минимум 1 поток. Но также вы можете самостоятельно создать и более 1 потока, если у вас появится такая необходимость.
    Ответ написан
    5 комментариев
  • GIT как правильно пользоваться?

    @xfg
    Github Flow за 5 минут.

    1. Создал ветку для фичи/фикса
    2. Сделал в ветку несколько коммитов
    3. Отправил пулл риквест
    4. Обсудил с коллегами пулл риквест и при необходимости внес правки
    5. Прогнал ветку через тесты.
    6. Влил в master
    7. Выкатил master на продакшн

    Если фича ветка долго не мержится и начинает расходиться с master веткой, то вливаем master в фичу ветку и продолжаем.

    Если кто-то из команды хочет руками потестить новую фичу, то может сделать
    git checkout -b new-feature origin/new-feature
    И потестить руками локально на своей дев машине.

    Update: Если sql база, то пишут миграции. Можно посмотреть в любом фреймворке что это и как использовать. После каждого git pull пробуем накатить миграции через консоль (можно хук для гита написать) и если есть новые миграции, то они применятся к локальной базе. Если nosql база типа mongo, то ничего не надо, они schemaless.

    На продакшине, вытягиваем код из гита в отдельную директорию. Применяем миграции к базе, затем симлинк переключаем с директории со старой версией проекта на директорию с новой версией проекта. Если миграции ломают старую версию проекта, то предварительно нужно выключить проект, чтобы у пользователей не сыпались всякие непойманные исключения. Это вкратце, для всего этого нужно подобрать себе уже готовый инструмент деплоя, который это все автоматически будет делать.
    Ответ написан
    5 комментариев
  • Как разделять логику приложения?

    @xfg
    Где грань?
    Просто вместо html отдавайте с сервера данные в json/xml и т.д.
    Ответ написан
  • Правильно ли я использую PHP-DI?

    @xfg
    Неправильно. Внедряйте зависимости, а не контейнер. Вы нарушаете Закон Деметры. Будут те же самые проблемы при классическом подходе к юнит-тестированию, как если бы вы вообще ничего не внедряли и инстанциировали все зависимости прямо в классе.
    Ответ написан
    Комментировать