• Имеет ли смысл начинать с Си?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Плюсы:

    Си это сила. У него пока нет конкурентов в системном программировании (разве что rust подкрадывается и D, но они чуть на другие вещи ориентированы).

    Минусы:

    Сегодня Си это специфика. Это либо системное программирование (разработка драйверов, низкоуровневых вещей, баз данных, интерпритаторов, компиляторов) либо микроконтроллеры и т.д. Так же есть определенные задачи для которых критически важна производительность, там и ассемблер иногда используют, но скоро перейдут на FPGA.

    То есть знание Си = знание архитектуры комьютера, а это уже неплохо и пригодится. Сам же язык относительно простой и много времени на его изучение не потребуется.

    Если же вас интересуют более мэйнстрим вещи вроде web или мобильная разработка - проще сразу брать какой-нибудь современный динамический язык (python, javascript) и радоваться жизни.
    Ответ написан
    12 комментариев
  • Как можно переписать условие на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это оптимальный вариант. Быстрее будет только перевести все в хэшмэпы.

    $oldIdsMap = array_flip($arOld);
    $newIdsMap = array_flip($arrOld);
    
    if (!array_key_exists($checkId, $oldIdsMap) && array_key_exists($checkId, $newIdsMap)) {
        
    }
    Ответ написан
    3 комментария
  • Как передать события(данные) в другой контроллер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    введите между ними сервис, который уже просите менять состояние. А в контроллере подписывайтесь на изменение состояния.

    В целом ждем вмердживания новой документации: https://github.com/angular/angular.js/pull/13834 https://github.com/angular/angular.js/pull/14416

    Самодостаточные контроллеры как и $scope больше не нужны.
    Ответ написан
    Комментировать
  • Многопоточность в JSON PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Или php однопоточный и так не реализуешь?


    Помимо "потоков" есть еще неблокируемые вызовы. Вам именно это нужно.

    Рекомендую эту библиотеку: https://github.com/mpyw/co либо даже лучше https://github.com/recoilphp/recoil
    Ответ написан
    Комментировать
  • JavaScript API Вконтакте для аутентификации на клиенте. Как?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    С ней email не получается вытащить


    Потому что вам не нужно знать email.
    Ответ написан
    3 комментария
  • Какой правильный путь при написании роутинга?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала давайте разберемся с тем что такое "правильно". Правильно в контексте вопроса - это максимально гибко. В приведенных вами ссылке "роутер" влияет на то, как будет устроена вся система. То есть в них мы сначала делаем допущение "у нас будут контроллеры, модели и представление, что бы как в рельсах но по другому).

    Роутер же не должен ничегошеньки знать о контексте своего использования. Вот это будет правильно. Мы просто должы скормить ему какие-то правила маршрутизации, задающие соответствие "uri => mixed" к примеру, а так же иметь возможность скормить ему строчку что бы тот сказал кого все же вызывать.

    Все, на этом зона ответственности "роутера" заканчивается. Грубо говоря самая примитивная реализация роутера:

    // наш примитивный роутер
    function getRoute(array $rules, $uri) {
         return $rules[$uri] ?? null;
    }
    
    // использование роутера
    $action = getRoute([
        '/' => 'indexPage',
        '/about' => 'aboutPage',
        '/blog' => 'blogPage'
    ], '/about');
    
    // больше нам уже роутер не нужен
    // вызываем действие
    call_user_func($app, $action);


    Далее уже мы можем решать как нам будет удобнее организовать работу с правилами. То есть сразу мы видим что тут статическая карта маршрутов, а стало быть... мягко скажем не гибко. Тут мы можем использовать либо uriTemplates либо просто регулярные выражения либо придумать свою надстройку над регулярками для более удобного составления правил.

    Сами же значения карты роли роутеру играть не должны. Хотя мы можем добавить туда какие-либо дополнительные ограничения, вроде поддерживаемый HTTP метод и т.д. Но в этом плане проще сделать так:

    $rules = [
         [ 'uri' => '/blog/page{pageNumber:\d+}', 'method' => ['GET', 'HEAD'] ]
    ];


    далее мы можем сделать загрузчики правил и прочую чушь. Но повторюсь - цель роутера - на основе строчки, представляющей URI выбрат из списка маршрутов подходящий. Роутер не должен больше ничего уметь.

    Запуском же конкретных действий по найденному маршруту пусть лучше занимается другой компонент.
    Ответ написан
    5 комментариев
  • Как на AngularJS динамически создавать страницы (Галерея изображений)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если страниц не много, то делал с ngRoute


    Я подозреваю что переменные в правилах маршрутизации вы не объявляли...

    В целом рекомендую вместо ngRoute использовать uiRouter или angular-component-router. Ну и шаблон урла у вас будет примерно такой:

    /images/{album}/{photo}

    p.s. Может стоит убрать этот суффикс .html? Он как бы... не нужен.

    p.p.s. Раз уж вы приступаете к изучению ангуляра - рекомендую вам мониторить состояние дел с документацией. На данный момент она сильно устарела, а если брать русскоязычные источники то и подавно. Все они ориентируются на подходы angular 1.0-1.1 хотя уже есть 1.5 с более лаконичными вариантами.

    В частности вот-вот должны вмерджить полностью переписанный гайд по работе с ангуляром: https://github.com/angular/angular.js/pull/14416
    Ответ написан
    Комментировать
  • Как вызвать репозиторий в symfony 2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) Что-то мне подсказывает что валится оно на чем-нибудь вроде $product->find() а не на том что вы привели.

    2) Лучше делать так

    $this->get('doctrine.orm.entity_manager')->getRepository(Organization::class)


    3) А еще лучше регистрировать репозитории как сервисы

    4) А еще лучше, не наследоваться от доктриновский репозиториев и использовать свои, которым в конструктор передавать entity manager и там уже делать что душе вздумается. Пример (так как это должно быть, в реальных проектах можно упрощать)

    class DoctrineOrganizationRepository implements OrganizationRepository 
    {
        private $em;
        public function __construct(EntityManagerInterface $em) 
        {
              $this->em = $em;
        }
    
        public function getOrganization(int $id) : Organization
        {
               $organization = $this->em->find(Organization::class, $id);
               if (!$organization) {
                     throw new OrganizationNotFoundException();
               }
     
               return $organization;
        }
    }


    По сути наше приложение не должно слишком много знать о доктрине. Ну и еще удобнее регистрировать такие сервисы:

    services:
         organization_repository:
             class: MyApp\Service\Doctrine\DoctrineOrganizationRepository
             autowire: true


    5) Не дробите приложение на бандлы. Они для того что бы реюзать код. Если вы дробите систему на бандлы с мыслью "может потом реюзаю" - это пример преждевременной оптимизации. Вам нужен только AppBundle и то только ради маленьких шорткатов.

    Зависимостей между бандлами быть не должно. Они могут зависеть от библиотек. но не от бандлов.
    Ответ написан
    3 комментария
  • Какие есть функции обработки переменных с передачей по ссылке в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вместо вот таких конструкций:


    Для начала замечу что такие конструкции допустимы когда мы работаем с массивами, "необъявленных" переменных у нас быть не должно.

    Затем скажу что если вы посмотрите документацию к PHP7 то второй пример будет выглядеть так:

    echo isset($hello) ? $hello : 'empty';
    // vs
    echo $hello ?? 'empty';


    Первый пример странный поскольку я не знаю что такое $world.

    Использование ссылок в принципе должно происходить как исключение, то есть когда наша функция должна возвращать более одного значения (preg_match как пример). В остальных случаях их не стоит использовать так как они пораждают побочные эффекты и чем больше их будет тем сложнее будет работать с кодом.
    Ответ написан
    2 комментария
  • Неубиваемый eval?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
  • Как работает Service Locator?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Создаёт обьект и передаёт его или только определяет и конфигурирует, а создаёт фабрика


    Именно так. Мы когда регистрируем сервис в сервис локаторе, у нас появляются фабрики сервисов. Они могут быть явными (то есть мы явно пишем код который занимается созданием объектов, например так сделано в pimple) или не явно (всякие автоконфигураторы на основе рефлексий как в PHP-DI или конфиги в Symfony). Так или иначе у нас будут появляться фабрики.

    Сервис локатор по запросу сервиса проверяет создавал ли он такой или нет. И если нет - просит фабрику сделать сервис и выплевывает его тому кто запросил.
    Ответ написан
    6 комментариев
  • Какие есть Open-Source движки для документирования API?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В дополнение к тому что уже привели.

    apiblueprint + aglio - использую в данный момент. В частности мне требовался инструмент позволяющий писать читабельную документацию и при этом DRY-ить декларацию типов.

    Сейчас финализируется RAML 1.0 и я планирую перебираться на него. К сожалению с инструментарием придется чуть подождать но пока он выходит самым гибким и приятнее сваггера.
    Ответ написан
    Комментировать
  • Просмотр 3D модели из браузера?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А вьюверы на three.js просто захлопываются от нагрузки.


    ну так что же вы хотите, у вас судя по всему весьма жирная моделька. Лучше tree.js для браузеров ничего на данный момент особо нет. Можно попробовать поискать плагины для браузера, разве что.
    Ответ написан
    Комментировать
  • Как правильно создавать SPA?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Делать для начала все самому без фреймворков или же сразу начинать учить фреймворк?


    Давайте определимся с целями. Для обучения? Делать свои велосипеды без опыта работы с имеющимися решениями - это тупо JS подтянуть. Для этого есть более продуктивные способы. Пилить же свой фреймворк это обычно дело хоть и веселое но не продуктивное. Хотя польза есть конечно. Но лучше смотреть как сделано в популяронм решении и пробовать сделать так же тогда-уж.

    Словом учим JS на нормальном уровне. А учить фреймворки никогда не нужно, их нужно понимать и разираться. Заучиывание никому не поможет.
    Ответ написан
    1 комментарий
  • Какой из этих подходов в ООП лучше и как они называются?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с самого начала у нас есть более-менее абстрактный класс


    Так не должно быть. "абстрактные" классы это способ устранения дублирования, нам больше важны интерфейсы объектов и полиморфизм. Но конкретно в рассматриваемом примере нам важна только инкапсуляция.

    Далее оба способа и чем они отличаются. В первом мы просто создаем объект, который уже содержит какое-то состояние по умолчанию. Во втором мы создаем объект с нулевым состоянием, и потом просим его сменить свое состояние на новое.

    Вот и вся разница. Далее вход идет инкапсуляция. То есть наше состояние должно быть изолировано внутри объекта, и доступ к нему напрямую из внешнего мира должен быть закрыт.

    Если мы хотим создать объект с каким-то состоянием по умолчанию - мы берем первый вариант (либо как в примере прописывваем прямо как значение свойства, либо сэтим в конструкторе).

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

    Если же мы хотим создать объект но он не может быть пустым, объект должен требовать начальное значение в момент создания. Тогда мы просто передаем значение в конструктор. Без этого значения (или с неправильным) мы не сможем создать объект. К примеру если у пользователя обязательно должен быть email и пароль имеет смысл "заставлять" разработчиков явно передавать их в конструктор объекта. Это эдакая вариация.

    А теперь попробуем первый и второй подходы вместе + третий кейс с обязательными параметрами:

    class User {
         private $id;
         private $email;
         private $password;
    
         public function __construct($email, $password) 
         {
               // это ваш первый пример только без наследования, оно не нужно
               // в нашей задаче идентификатор пораждается
               // при создании объекта самим объектом, состояние по умолчанию
               $this->id = Uuid::uuid4(); 
    
               // мы требуем входящие данные что бы задать начальное состояние
               $this->email = $email;
               $this->password = $password;
         }
    
         // мутация состояния, второй вариант.
         public function changePassword($password) 
         {
                $this->password = $password;
         }
    }


    То есть вся разница только в том, откуда приходят данные для формирование объектом своего состояния. Изнутри (первый случай) или снаружи (второй случай). Оба подхода вполне себе можно использовать вместе.

    Ну и да - зачем в вашем примере наследование и нейкий "абстрактный" класс - не понятно. Наследование это не принцип, это механизм для достижения полиморфизма подтипов. С ним нужно быть осторожно, особенно если с полиморфизмом не разобраться сначала.
    Ответ написан
    Комментировать
  • Какое значение лучше в % или в px?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    и то и то плохо если всегда слепо использовать только что-то одно.

    Хорошо их комбинировать исходя из задачи. Например если у вас есть задача первую колонку сделать в 340 пикселей а все остальное растягивать, как думаете что вы будете использовать?
    Ответ написан
    2 комментария
  • Что за PHP фреймворк?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Выложи точку входа (index.php)

    В целом с первого взгляда похоже на codeigniter.
    Ответ написан
    4 комментария
  • Почему фильтр срабатывает не сразу?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Гуглим как работает отслеживание изменений в ангуляре (Angular digest cycle).
    Ответ написан
    Комментировать
  • Как построчно выводить через foreach?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Такие вещи делаются через CSS.
    Ответ написан
    2 комментария