• Как стать Middle после Junior и Senior после Middle?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Сколько нужно мне проработать в организации чтобы стать Middle если сейчас я Junior?


    я видел людей которые за 5 лет в "организации" настолько остановились в развитии что как были джунами так и оставались.

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

    Вот и прикидывайте.
    Ответ написан
    Комментировать
  • Как добавить метод к классу если переопределить класс нельзя?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    завернуть работу с этими сервисами в еще один сервис который собственно будет выступать фасадом и скрывать всю грязь что вы делаете что бы было удобно.
    Ответ написан
    1 комментарий
  • Зачем в Angular есть Jsonp?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) Jsonp был с самых ранних версий angular
    2) angular на момент выхода версии 1.0 имел поддержку ie8 как минимум
    3) поскольку angular 1.x не может иметь значительных нарушений обратной совместимости - нельзя просто так удалять jsonp.
    Ответ написан
    2 комментария
  • Как использовать Принцип подстановки Барбары Лисков применительно к PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В PHP отсутствует Double Dispatching и перегрузка методов


    Double Dispatch в PHP:

    class Foo {
        // ...
        public function makeSomeStuff(Bar $bar)
        {
             $bar->doStuff($this->someData); // double dispatch!
        }
    }


    Перегрузка методов:

    class Foo {
        public function foo() {}
    }
    
    class Bar extends Foo {
        public function foo() {} // перегружен!
    }


    и в ответ на отличающуюся от базового класса/интерфейса сигнатуру он вывалится с ошибкой


    то что вы хотели сделать называется ad-hoc полиморфизм, и он есть из коробки в любом языке программирования с динамической типизацией. Достаточно просто не указывать явно сигнатуру, все довольно просто) Ну и да, минус этого то что это не явно и в рантайме. Для языков со статической типизацией явная "перегрузка" нужна только для того что бы компилятор мог построить таблицы диспетчеризации вызовов.

    Но решить проблему как-то нужно


    Перегрузка методов в наследниках с изменением сигнатуры это как раз таки нарушение принципа подстановки барбары лисков (LSP для сокращения).

    > Сервисы должны имплементировать какие-то общие методы, но помимо этого у них есть и специфичные методы.

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

    p.s. венгерская нотация - это ужас. Все эти префиксы и суффиксы которые показывают кто есть тип (интерфейс, абстрактный класс) это вещи которые ломают всю красоту идеи полиморфизма и абстракции. Если хотите можем об этом пообщаться отдельно.

    Однако каждый из хендлеров может не работать с конкретной реализацией сервиса.


    Значит полиморфизм в нашем случае пошел погулять. Есть куча решений данной проблемы, в частности Chain of responsibility.

    > Visitor. Предполагает наличие в каждом из хендлеров методов типа handleService1(Service1 $service) и handleService2(Service2 $service), при этом один из методов остается пустым

    зачем так усложнять то? У вас должен быть снаружи только один публичный метод а внутри уже реализация сама разберется. Ну то есть если хотите - можете внутри сделать два приватных метода но это так же странно.

    > Массив маппинга, который говорит, какой хендлер может обрабатывать какой из сервисов.

    Опять же излишнее усложнение.

    Короче ваша проблема в том что у вас есть некие сервисы, с неким интерфейсом, которые по факту делают совсем разные вещи. То есть они априори не могут принадлежать к одному и тому же типу. Ну и нарушение LSP на лицо, вы не можете в коде заменить одну реализацию сервиса другой.

    Дальнейшие варианты возможны только после того, как вы опишите на высоком уровне что вам нужно сделать. Ну то есть не то к чему вы пришли а почему вы к этому пришли и какая задача стояла изначально.
    Ответ написан
    8 комментариев
  • Как правильно написать unit тест?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) это не юнит тест, это интеграционный тест. Он проверят "часть системы в сборе", в вашем случае апишку. Если бы вы тестировали через UI (то есть через ангуляр) - это называлось бы end-to-end тест (от кнопок до базы данных мол).

    2)
    На просторах инета вижу простые примеры тестов которые проверяют на true false


    Давайте думать. Вот как бы вы проверяли такое руками? Можете придумать? А теперь можете написать скрипт который проверяет это за вас? Вот вы и умеете писать интеграционные тесты, это не очень сложно. Нужно только не зацикливаться.

    Что вам по сути важно когда вы пишите апишку? Скорее всего вы хотите всегда знать что структура ваших ответов не сломалась. Что вы случайно не поменяли имя поля, или случайно не убрали нужные поля. Для этого есть такая штука как json schema. То есть мы берем json и проверяем на соответствие. Опять же для phpunit можно найти готовые ассерты что бы не пилить велосипед.

    Далее, что еще нам может хотеться проверить - статус коды. Это опять же легко и думаю в документации к laravel это есть. Так же возможно вы захотите проверять заголовки но это уже специфичные штуки.

    Словом все что вы хотите проверить - вы просто проверяете. Правильно - это когда оно выполняет ваши потребности.

    Ну и возможно вам захочется проверить данные в json ответе. Тут уже есть кучи вариантов. Я например запилил свой велосипед для частичного сравнения JSON-а (ну не интересно мне все проверять). Можно и другими решениями это делать, но лично я такие штуки на этом уровне проверяю крайне редко, ибо... ну у меня другие тесты за проверку логики отвечают.
    Ответ написан
    6 комментариев
  • Как выполнить Js код в многопоточном приложении delphi?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    idhttp это не браузер, он не умеет выполнять javascript.
    Ответ написан
  • Должен ли программист знать ассемблер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) Сам ассемблер знать не нужно
    2) нужно знать что ассемблер вообще есть и полезно хотя бы минимально представлять как оно там внутри все работает и что есть семантический разрыв. Ну то есть не сам ассемблер даже важен, а принципы как оно что там выполняется, что есть конвееризация и т.д. Кэш процессора, зачем он нужен и т.д.
    3) это не must have, это скорее факультативные штуки
    4) это нужно для тех кто занимается разработкой систем, для которых критична производительность (так или иначе при оптимизации приходится ковыряться в опкодах/байткоде/разбираться что там делают оптимизирующие компиляторы).
    5) это нужно для тех кто разрабатывает средства для дебага и профилирования.

    Первые пару лет этого всего можно и не знать. А далее уже задачи сами определят, потом хотя бы поверхносные знания приобрести стоит просто для того что бы быть более грамотным разработчиком.
    Ответ написан
    Комментировать
  • Можно ли использовать as в temlate?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    есть ng-init но думаю что вам нужно что-то другое. Я обычно делаю такие элиасы на уровне контроллеров компонентов. Ну и в целом ваше желание больше похоже на то, что у вас есть кусок шаблона, который выгоднее было бы выделить в отдельный компонент.
    Ответ написан
    1 комментарий
  • Как вылить проект на node.js в сеть?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для упрощения жизни по началу можете взять какой heroku, оно относительно дешево и ничего не нужно самому настраивать. Да и инструкции для новичков есть, и free аккаунт для эксперементов.

    > вряд ли такие гиганты как yahoo и linkedin пользуются vps.

    у них свои датацентры, им проще. Но в целом от VPS процесс не сильно отличается (разве что масштабы другие). Есть еще нюансы связанные с администрированием, есть docker, есть ansible и прочее для оркестрацией серверами и т.д. Но это все потом. Не нужно стихийно пытаться покрыть сразу все. Возьмите пока вариант попроще и попробуйте а потом уже когда будет легко - можно повышать уровень и пытаться сделать так же самому на своем VPS, разбираться вообще во всем этом и т.д. Сейчас вам это просто не нужно.
    Ответ написан
    Комментировать
  • Что можно сделать на одностраничниках с помощью JavaScript?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Попробуйте реализовать тостер без бэкэнда (например на firebase) как одностроничное приложение. Или любое другое web-приложение. И прикинте что там будет на JS (по сути все).
    Ответ написан
    8 комментариев
  • Как использовать gulp-uncss на Symfony с шаблонизатором Twig?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    gulp-inject в симфони шаблоны делал когда-то.
    Ответ написан
    Комментировать
  • Как по максимуму использовать Bootstrap 3 на Symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. в этом нет смысла. Можно выделить critical-path css и хватит.
    2. это делается не при помощи бандлов а при помощи всяких инструментов для сборки фронтэнда.
    3. тут тоже симфони не причем.

    Короч рецепт успеха - фронтэнд отдельно, бэкэнд отдельно.
    Ответ написан
    2 комментария
  • Как использовать рефлексию для метода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    чем вас не устраивает call_user_func_array?

    p.s. ответ на ваш вопрос есть в документации по рефлексии.
    Ответ написан
    3 комментария
  • Использование getter снижает производительность приложения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    новых циклов $digest конкретно геттер не вызывает.

    В вашем же примере на каждый вызов геттера формируется абсолютно новый массив, и сравнение по ссылке он завалит. При этом сравнение это происходит на каждый $digest цикл. То есть на каждый $digest цикл (при отсутствии deep watch) будет происходить запуск ватчеров. Это единственный риск поскольку избавиться от этого можно только через deep watch а вот эта штука уже серьезно так бьет по производительности.

    Ну и это не говоря о том что на каждый $digest цикл будет дергаться ваш сервис. Вместо этого стоило дергуть сервис один раз и заменять данные в контроллере только тогда когда нужно.

    Если брать современные подходы, то мы вообще должны вынести все получение состояния из контроллеров (компонентов) наружу, например в ресолверы и мэпить все на проперти компонентов. Там уже геттеры/сеттеры хорошо подходят, но только те геттеры/сеттеры которые на уровне языка а не "методы". Это легче тестить, проще поддерживать и в целом открывает большой простор для дальнейшей архитектурной вакханалии.
    Ответ написан
  • Стоит ли использовать везде БЭМ нэйминг?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    если вы не используете БЭМ а только нейминг - то точно нет. Если вы используете БЭМ - то возможно, зависит от того нужно оно вам или нет.
    Ответ написан
    3 комментария
  • Как переопределить класс в Laravel?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вам не нужно это делать. Open-Close принцип. Все можно решить без "переопределений", это только в yii такая чушь.
    Ответ написан
    8 комментариев
  • Как пользоваться angular2-jwt?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть ли возможность пользоваться этим без подключения библиотеки разработчика


    Да. Либа самодостаточна.

    Может кто пользовался и может скинуть ссылки на примеры?


    Там все в ридми в принципе расписано как что юзать.

    import { tokenNotExpired, JWTHelper } from 'angular2-jwt';
    
    const token = 'some jwt token';
    const jwtHelper = new JWTHelper;
    
    if (tokenNotExpired(token)) {
        // everything ok
    }
    
    const payload = jwtHelper.decodeToken(token);


    это минимальный набор фич. Там есть больше, интеграция с Http сервисом и т.д.
    Ответ написан
  • Как правильно сделать раздельно front на angular и back на laravel?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Полистал немного ответы в сети, но что-то как-то всё размылено.


    бэкэнд отдельно, фронтэнд отдельно. Можете даже в отдельные репозитории это дело запихнуть что бы понятнее было. Общение - по HTTP API (JSON RPC, REST, что-хотите). И никаких проблем, никакой каши.
    Ответ написан
    Комментировать
  • Как стать спикером по фронтенду?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Но у меня вопрос, как люди становятся этими самыми спикерами?


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

    Собственно никакой магии. Либо просто случайно кто-то попросит что-то в духе "слушай, может выступишь?" либо сам.

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

    Тем более по фронтэнду. Там сейчас ситуация такая что большинство не очень опытные разработчики. И что-то интересное им рассказать и полезное более чем легко.
    Ответ написан
    Комментировать
  • Друзья, каким образом изменить значение свойства $b (прибавить единицу) у каждого объекта класса T, заданного в конструкторе класса G?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) var - не используйте это ключевое слово. Используйте public. А еще лучше - private.
    2) инкапсуляция, закон деметры. Не меняйте состояние объектов напрямую. Используйте сообщения (вызовы методов).
    3) вот эти свистоплязки с динамическим созданием имен переменных лишены всякого смысла
    4) имена классов, свойств, методов и вообще должны быть осмысленны. Вы должны быть в состоянии, ну не знаю, прочитать код вслух! и что бы всем вокруг все было понятно.

    class T{
        private $b;
        private $s;
    
        public function __construct() 
        {
             $this->b = mt_rand(0, 1000);
             $this->s = 'foo';
        }
    }
    
    class G
    {
        public function __construct(array $t) 
        {
              // ...
        }
    }
    
    $g = new G(array_map(function () {
        return new T();
    }, range(1, 4));
    Ответ написан