• Как избавиться от контроллеров?

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

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

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) не используйте $scope в контроллере. Y031. И тем более не используйте $rootScope. И тем более не используйте и то и то.

    2) если мы выполним предыдущий пункт, у нас станет на 2 зависимости контроллера меньше, и проверять нам надо только состояние контроллера. В этом случае для теста достаточно просто взять нашу функцию и подменить зависимости через моки (если используете jasmine то там уже все есть, если используете mocha то тогда рекомендую sinon)

    3) Продвинутое владение: Не используйте ngController или контроллеры стэйтов/роутов (максимум для прокидывания данных из ресолверов в скоуп). Дробить все на директивы. Причем данные прокидывайте в них сверху через биндинги а не запрашивайте прямо изнутри через сервисы. Тогда тестировать в нашем UI компоненте вообще ничего не надо будет. Достаточно биндинги проверить. А модель уже покрывать обычными тестами, ну и модель наша будет полностью отделена от angular-а (сервисы типа $http и контейнер зависимостей не в счет).

    p.s. примерчик простенького приложения где все три пункта есть: вот.
    Ответ написан
    4 комментария
  • Как использовать как фильтр для ng-repeat в AngularJs?

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

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

    p.s. никаких $scope.$watch! и вообще не используйте $scope нигде кроме как в link директивы, который вам так же редко когда должен быть нужен. Y031
    Ответ написан
    2 комментария
  • Как сложить введенные числа?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    просто считайте сумму в контроллере, ничего такого.

    this.total = this.sums.reduce((sum, i) => sum + i, 0);


    вынесите это в отдельную функцию и вызывайте ее при добавлении/удалении элементов. И да, меньше логики в шаблонах и читайте angular-styleguide.
    Ответ написан
    3 комментария
  • TypeScript vs GopherJS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    TypeScript - это ES6/ES7 stage1, тобиш тот же babel, но сверху еще можно информацию о типах прописывать подробно, что улучшает качество статического анализа (нужно на больших проектах масштабов, например для кода angular2). Ну и да, то что его пилит майкрософт это нисколько не минус. Это у вас стереотипное мышление.

    gopherjs - это транслятор go в javascript и только. Собственно из-за этого мы получаем необходимость иметь на каждый чих биндинги. мое ИМХО - это больше подходит для серверной разработки.
    Ответ написан
    Комментировать
  • Насколько удачен такой процесс разработки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    в этом нет особо смысла. Никто не будет переписывать с кофескрипта на TS. Слишком дорого. Да и потом, сегодня прототип - завтра продакшен.

    Так ли важна статическая типизация, или это очередной меинстрим?

    Статическая типизация - не важна. Иметь информацию о типах на момент сборки проекта - важно, и чем больше проект тем более важным это становится. Статический анализ - пожалуй самый дешевый способ сократить фидбэк луп о вашем коде. Лучше только юнит тесты и TDD.

    Опять же в TS информация о типах - это бонус поверх ES6/ES7 state1 и только. Вы можете не прописывать типы. Да и для большинства кода типы можно вывести, достаточно определять все только для интерфейсов (публичная часть модуля считайте).
    Ответ написан
    3 комментария
  • MVC, правильно ли таким образом инклюдить модель и view в контроллер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Дайте ссылку на "канонический" образец MVC


    MVC образца 1979-ого года (канонический) подразумевает то, что контроллер ничегошеньки не знает о view. Он ловит события с инпутов и конвертит асинхронные действия пользователей в вызовы методов модели. Имеется в виду модель нашей логики, модель приложения, не обязательно один класс но целая иерархия которая сама может включать сколько угодно слоев и иметь сколь угодно большую сложность. Контроллер детали реализации модели вообще не парит, инкапсуляцию для этого придумали.

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

    Ну это если мы говорим про олдскульный MVC который в чистом виде никто не применяет уже лет 15-20. Ну и на бэкэнде в этом нет особо смысла так как модель в рамках одного запроса-ответа поменяться дважды у нас не должна. Просто пробрасываем все необходимое текущее состояние во view и все хорошо.

    В целом у нас всеравно есть зависимость view от модели, что не ок. Потому чуваки придумали Model View Adapter (можно считать это вариацией MVP но есть нюансы).

    Суть такая. В качестве адаптера сделаем контроллер, который будет получать данные формата UI (HTTP запрос в нашем случае) и будет генерировать данные для UI (HTTP ответ опять же). То есть задача контроллера сводится всего-лишь к тому что бы получить запрос, дернуть метод модели (один в идеале) и сформировать ответ.

    Итог - полная независимость представления от модели и модели от представления. Конвертацией форматов орудует адаптер (в нашем случае это GRASP контроллер). Причем мы можем выстраивать целую цепочку адаптеров (концепция мидлвэров на этом строится), которую потом можно свести к одному главному фронт-контроллеру. Ну и подходит это не только для HTTP но и для всяких там MQ/CLI и других вариантов интерфейсов которые могут пригодиться в будущем (а могут и не пригодиться).

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

    Ну и про буферизацию вывода не забываем.

    p.s. хватит писать велосипеды, вы всеравно из этого усвоите мало чего. Возьмите какой-нибудь микрофреймворк, что бы можно было и в нутрах покопаться, и бойлерплейт пописать, и на основе уже готового подумать почему там так сделано.
    Ответ написан
    Комментировать
  • Как правильно использовать функцию unserialize?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) достаем строку
    2) десериализуем в массив через unserialize
    3) ???
    4) профит

    images?q=tbn:ANd9GcQBCqwyKJ3ubE3LQRh3bJa
    Ответ написан
    3 комментария
  • Криптография, хэширование пароля password_hash?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нужно и безопасно ли использовать password_hash для хэширования пароля?


    Да, нужно и это безопасно. Более того, не забываем проверять пароль через password_verify

    Разумно ли использовать PASSWORD_DEFAULT или лучше использовать свою соль (если соль, то разумно ли хранить свою соль для каждого пользователя в бд ? - или как это делается?)


    Разумно, потому что большинство разработчиков не сильно замарачиваются с генерацией соли. По поводу хранения в БД - она хранится прямо в строке, выдаваемой после хэширования пароля, если что. Не парьтесь по этому поводу. Суть соли в увеличении времени подбора пароля. Точно так же как и использование медленных алгоритмов типа bcrypt.

    Ведь php постоянно расширяется, все меняется, вскоре может изменится все и появится ещё более лучший механизм для хеширования


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

    Или как вариант, изменить вообще метод хеширования


    Bcrypt должно хватать. Для новых пользователей можно юзать уже другой метод, а старых просить сменить пароль. Куча разных стратегий.
    Ответ написан
    Комментировать
  • Есть ли смысл изучать, писать на ActiveRecord?

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


    Больше чем нужно, скажем так. Как и любую модную технологию ее часто используют там где не надо и как не надо.

    Просто стоит уяснить что вы не ограничены конкретными инструментами. Даже если у вас половина проекта использует AR, для сложных выборок можно обойтись и без него упростив себе жизнь.
    Ответ написан
    Комментировать
  • Какие существуют нотации(правила именования) в программировании?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с переменными вида obj_jlabName вы код ревью не пройдете у подавляющего большинства разработчиков. Именуйте переменные адекватно, что бы можно было определить что в них. Завязывать имена переменных на модификаторы доступа (вообще все стоит делать приватным), или тип. Вы и так явно задаете тип, просто не пишите код так, что это бы вызывало двусмысленность. Ну и определение переменных должно быть рядом с их использованием, никаких методов на 100+ строк, если хотите добавить комментарий перед блоком кода - лучше вынести это добро в отдельный метод...

    Словом, называйте все своими именами, и будет вам счастье.
    Ответ написан
    5 комментариев
  • Что выбрать для клиент-серверного приложения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Определитесь с задачей. Если вы хотите научиться сервера писать - то Java + Spring, это и для аднроида вам поможет (немного расширит кругозор).

    А если просто хочется приложеньку с сервером написать - возьмите какой parse.com, contentful и прочие облачные сервисы. Они бесплатны в большинстве случаев для небольших нагрузок.
    Ответ написан
    Комментировать
  • Нужен ли node.js для серверной разработки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вопрос архитектуры. Нужно понимать как работает node.js, а именно в чем преимущества и недостатки event loop (полно и тех и тех), и нужно понимать как строить приложение в обход недостатков используя только преимущества. В целом же можно сделать массу различных прикольных вещей. Хотя новичку легко все упороть.
    Ответ написан
  • Как правильно передавать get-параметры и удобно работать с Url в js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    param[] - такие имена параметров не поддерживают


    Ну потому что это невалидная штука. Она работает только в PHP и больше нигде. Вместо этого следует использовать разделитель

    /cat/?param=102,105,204&view=1
    Ответ написан
  • Как написать тест для директивы Angular?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    мокаем сервис $location, и трекаем что наш код вызовет метод path с нужными нам аргументами. Создаем инстанс директивы (сервисом $compile) и кликаем на элемент. Проверяем был ли вызван метод.

    Но этот тест можно существенно упростить. У нас уже есть покрытая тестами директива ngClick, потому можно сделать так:

    function HomeButtonController($location) {
             var vm = this;
         vm.goHome = function () {
              $location.path('/');
         }
    }
    
    function homeButtonDirective() {
        restrict: 'E',
        controller: HomeButtonController,
        controllerAs: 'vm',
        transclude: true,
        template: '<button ng-click="vm.goHome()" ng-transclude></button>'
    }


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

    https://github.com/AngularClass/NG6-todomvc-starter/ - примерчик.
    Ответ написан
    7 комментариев
  • Что все-таки должен уметь делать frond-end-разработчик?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Все то что запускается в браузере - ваша зона ответственности. Ajax (ajax это просто возможность делать http запросы из js), все эти фреймворки и библиотеки, все все все. От бэкэнда вас целиком и полностью отделяет весьма жирная сетевая прослойка. Причем эту прослойку вы так же должны знать как слой интеграции между фронтэндом и бэкэндом (на поверхносном уровне хотя бы).

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

    Если фронтэнд - это отдельное приложение, то и знать вы должны все что нужно для его построения. Это и архитектурные штуки (MVC/MVA/MVVM/MVP/Flux/паттерны всякие/функциональное программирование) и тесты писать уметь должны и т.д. Все как у бэкэндщиков по объемам знаний. Просто у бэкэндщиков геморой обычно в конкурентных запросах, локах, базах данных и другими веселыми штуками. а у фронтэндщиков - зоопарк браузеров, различия в окружениях и т.д.

    nodejs - это уже опционально. В любом случае если вы хорошо знаете JS то посмотреть как там чего в API ноды проблемы не составит (например что бы быстренько поднять expressjs сервачек для разработки с мидлвэрами, часто нужно для всяких webpack-ов и browsersync). Ну и опять же билд стэк у фронтэндщиков в принципе весь на ноде написан. Но это не бэкэнд.
    Ответ написан
    4 комментария
  • Как узнать кем и в каком коммите была удалена строка?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    если вы знаете что было в этой строчке, то

    git log -S <string> path/to/file
    Ответ написан
    Комментировать
  • Как лучше организовать рассылку html писем в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    mailchimp, sendgrid

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

    А верстка писем - это уже отдельное развлечение.
    Ответ написан
    Комментировать
  • Как правильно разделить разработку веб-проекта на юзер-стори?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    правильно подойти к поставлению юзер-стори проекта


    user story - или пользовательский сценарий - это высокоуровневое описание фичи. Оно не содержит (ну точнее не должно) никаких деталей о том, как именно будет реализована фича. То есть никаких ссылок на то что "пользователь кликает на что-то", или там "пользователь шлет запрос на API". Только бизнес выжимка.

    Пытаемся в команде внедрить гибкую методологию разработки веб-проектов


    Главное понимать зачем вы это делаете и чем это от вотерфола отличается. Agile != scrum или kanban, там не обязательно загоняться по юзес сторям и т.д. Суть только в уменьшении цикла обратной связи. Что бы клиент что бы посмотреть результат ждал не пару месяцев а пару недель. Что бы в тестирование фичи попадали не раз в месяц а хотя бы раз в неделю. Ну и т.д.

    Ну и рекомендую посмотреть докладик: Agile is Dead • Pragmatic Dave Thomas
    Ответ написан
    1 комментарий
  • Как загрузить сервис по требованию?

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