• Как писать тесты?

    nonlux
    @nonlux
    Ну тесты бываю разными: и зелеными и красными. ))

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

    Я как ярый сторонник BDD использую два типа тестов feature (читай интеграционные тесты) и spec (читай юнит тесты)

    Итак, features. Берем Behat и херачем кучу тестов по типу:
    Зашел на главную,
    Потыкал чего-то в форме регистрации
    Зашел в профиль и увидел свое имя и фотку на странице
    Profit!

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

    Для таких тестов хорошо иметь поддержку окружения (prodaction, development, test) в коде, чтобы например можно было капчу отключить или еще какую сложную лабуду не делать.
    Если система замудрена до ужаса придется здесь для тестов все окружение поднимать. А лучще вообще отдать CI такое делать пусть друг трудится.
    Плюс таких тестов например когда пишем сложный фронт - сложный бек и еще более сложнейший бек-бек, то можно одним чохом протестировать работу всего сервиса.

    Следующий уровень абстракции spec:

    Если нам в интеграционных тестах было немного пофиг на БД. Она как бы пишет, но что так за структура абсолютно пофиг. То в случае со спекими нам ВАЩЕ ПОФИГ.
    Мы берем наш класс (функцию) и проверяем что за результаты она отдает. Вместо объектов, с которыми подопытный (объект тестируемого класса), даем ему резиновую бабу (моки и т.п), и смотрим на результаты нашего труда.

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

    Вот как то так!

    P.S тесты надо бы писать до кода.
    Ответ написан
    2 комментария
  • Как писать много кода, оставляя его простым, как в начале?

    @dmz9
    не знаю зачем тут пацаны советуют чистый код Р. Мартина
    https://www.ozon.ru/context/detail/id/5011068/
    вот что нужно на замену
    https://www.ozon.ru/context/detail/id/138437220/
    есть обе у меня, но красненькую купил раньше. в ней больше информации как внешне так и по сути.

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

    во многих конвенциях о code-style указываются очень грамотные вещи, и они не просто так там находятся. в общем смысл такой - код должен быть самодокументируемым/самоописательным, а комментарии к коду не должны быть в стиле "моё почтение, капитан!".
    • код должен напоминать хорошую прозу.
    • комменты описывают намерение (зачем?) а не реализацию (как?).
    • прими во внимание время жизни переменной. чем ближе переменная к "месту военных действий" тем лучше. перекликается со временем жизни переменной - чем быстрей "умирает" тем лучше, часто можно даже без переменной обойтись не в убыток читаемости.
    • люди советуют тут ограничиваться конкретным числом строк. имхо - вредный совет. метод не должен ограничиваться. метод должен быть такой длины, которая требуется. иногда без "супер-методов" не обойтись (это не о функциях на 100500 входящих параметров), невозможно просто разбить тяжелую функцию на более мелкие куски, не умножив число запоминаемых переменных/других методов. метод может быть в 3 строки, может быть даже в одну, а может быть в сто-двести строк и более. если из метода ничего нельзя выбросить и нечего добавить - значит он в точности занимает столько сколько нужно.
    • многословие приветствуется но без фанатизма. машине почти всё-равно какой длины у тебя функция (если вы понимаете о чем я), а для тех кому нет - есть минификаторы (для js например)
    • название метода должно однозначно говорить о его назначении. спрашивай себя - зачем этот метод? зачем это свойство? если ты не можешь ответить значит и запомнить/вспомнить не сможешь, значит у метода/свойства нет конкретного предназначения и потом (через какое то время) будет сложно разобраться для чего он вообще нужен.
    • визуально отделяй приватные/публичные методы. это тоже некоторая подсказка которая помогает разбираться в коде.
    • следуй одному стилю как минимум в отдельно-взятом файле. (кемелкейс отдельно, лодаш отдельно).
    • следуй принципу наименьшего удивления (программиста). т.е. поменьше роялей в кустах
    • соблюдай абстракции. если класс это не просто набор статичных методов - значит он описывает какие то действия вполне определенного объекта. не раздувай и не разбивай на несколько классов одну цельную и четкую абстракцию. это поможет сосредоточиться на отдельном куске кода в один момент.
    • старайся не писать рядом в одном классе методы, которые "проникают" во все аспекты приложения (антипаттерн - суперкласс/божественный объект).


    вообще стоит почитать про паттерны и антипатеррны, это конечно не библия но знать хотя бы основные стоит.
    Ответ написан
    2 комментария
  • Когда следует использовать angular?

    ozknemoy
    @ozknemoy
    яваскриптист
    на проектах от среднего. но! есть проблемы с серверным рендерингом. но судя по инфе это решаемо. в остальном нерешимых вопросов не заметил. скорость если уметь готовить можно поднять. тк из коробки там не настроено ничерта почему то. вообще пописав на фреймворке(не на библиотеке), понимаешь что сайт на чистом js или jq это треш, но кому то нравится. хотя судя по stackoverflow люди и на ангуларе треш умеют делать
    видимость элементов это мелочь. роутер всего лишь разруливает навигацию по сайту . без нее банально никак. просто вынесено в отдельные модули чтобы люди выбирали кому какой нравится. но есть и резолвы и дочерние вью и еще разные плюшки
    Ответ написан
    Комментировать
  • Какая книга интересно и чётко расскажет устройство компьютера на физическом уровне?

    Nekto_Habr
    @Nekto_Habr
    Чат дизайнеров: https://t.me/figma_life
    Энциклопедия профессора Фортрана
    Ответ написан
    Комментировать
  • Переход проекта с jQuery на Angular 1 или Angular 2 или React?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    https://youtu.be/XQM0K6YG18s?t=16m46s смотреть с 16m46s
    Ответ написан
    Комментировать
  • Есть какие нибудь материалы по JS для подготовки к собеседованию?

    @Bukinator
    https://habrahabr.ru/post/231071/ Всё ещё актуально
    Ответ написан
    Комментировать
  • Для изучения PHP сейчас не стоит смотреть старые курсы?

    @egormmm
    Борітеся — поборете!
    Из всех курсов и книг в свое время самым понятным оказались курсы "Специалиста".
    Ответ написан
    Комментировать
  • Codewars, на сколько поможет подтянуть js?

    Jump
    @Jump
    Системный администратор со стажем.
    Скажите, реально ли по codewars прокачаться по js
    Реально.

    Скажите, реально ли по codewars прокачаться по js до уровня среднестатистического front end разработчика?
    Нереально, ибо к front end разработке он никаким боком не относится.

    JS это инструмент. Как молоток, или пила. И им нужно уметь пользоваться.
    Но хорошее умение пользоваться молотком и пилой не сделает вас умелым плотником. Ибо это только часть умения, необходимая, но не исчерпывающая.
    Ответ написан
    Комментировать
  • Codewars, на сколько поможет подтянуть js?

    IonDen
    @IonDen Куратор тега IT-образование
    JavaScript developer. IonDen.com
    Codewars даст вам хорошую базу и знание языка. Это безусловно очень полезно, но...
    Фронтенд разработка подразумевает под собой еще и знание конкретных прикладных технологий - Основные навыки фронтенд-разработчика

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Т.е. сложно понимаю, что "засунуть" в один объект, что в другой, что должно быть статическим методом, что приватным и тд.


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

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

    Теперь задумаемся о декомпозиции всего этого хаоса. Мы находим какую-то задачу, которую выполняет наш код (например какую функцию вызвать для обработки каждого конкретного запроса) и выносим это в отдельный объект. Отправка email-ов - отдельный объект. Весь SQL зашиваем в отдельный объект. Соединение с базой - объект. Пользователи - объекты. Все - объекты.

    И главное, у каждого объекта есть своя область ответственности. UNIX way. Каждый объект делает что-то одно и делает это хорошо. Бывает так что ну... нужно сделать так что бы один объект делал две вещи. НЕ вопрос, мы можем его попросить сделать что-то сложное, а он будет как хороший менеджер тупо делегировать работу другим объектом. То есть он и сложную штуку сделает, и сам не будет знать как она делается.

    А все безхозные функции, которые не пренадлежат никаким объектам (например функции порождающие объекты) можно вынести в статические методы. Главное что бы статичесих переменных у нас небыло (ибо это те же глобальные переменные). И поменьше публичного ибо черт его знает что эти разработчики будут использовать. Причем "те разработчики" это вы завтра.

    Вообщем писав всё время на процедурке, сложно перейти на ооп.


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

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

    Подскажите, какой проект начать писать (гостевая, блог), или может начать изучать фреймворк.


    Фреймворки универсальны, а значит чистого ООП там быть не может. Во всяком случае нет ни одного фреймворка на котором стоит учиться ООП.

    Есть хорошие упражнения на развитие понимания объектно-ориентированного проектирования. Например вот: https://habrahabr.ru/post/206802/

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

    Или может подскажите книгу/сайт где пошагово в ооп написан какой-то проект, чтобы быстрее пришло понимание.


    Так вы научитесь делать один конкретный проект а на втором вы уже проиграете. Так дела не делаются. Надо разобраться с причинами появления идеи ООП. Ну то есть что было до. Можно еще с функциональным программированием попробовать разобраться. В PHP оно слабо применимо, но основные идеи очень тесно переплетаются с ООП и познав немного функциональщины ваше ООП будет лучше. Да и если про ООП вы можете найти много булшита, про функциональщину врут мало.
    Ответ написан
    3 комментария
  • Какие еще есть блогеры вроде Sorax?

    lancer_serega
    @lancer_serega
    PHP Developer
    Русскоязычные каналы
    (безумно старался не повторяться, и скорее всего у меня это получилось, но если что прошу сильно не пинать)
    (по возможности, время от времени буду дополнять данный пост новыми каналами)
    Видео курсы и уроки + Графика и 3D моделирование
    Mihail Kozlov (ORACLE, MongoDB, Linux, BSD, Asterisk, CISCO, Python, Microsoft, TRANSACT-SQL, MySQL)
    Ускорение Сайтов (Nginx, защита от DDoS, ускорения MySQL и всеко что относится к сайту)
    Технострим Mail.Ru Group
    fwdays
    SpecialistTV
    Как создать сайт. Основы Самостоятельного Сайтостроения(WebForMySelf)
    WPRUSe · Финты WordPress
    IT Propaganda(Здесь уроки python, и разные задачки на логику)
    Видеоуроки PHP(кстати... здесь не только про php)

    create web-developer

    Frontend & Backend разработка
    FrontendDevConf
    Dev Workout
    GetDevNET
    IT-Channel
    itloft(для бизнеса, стартапа)
    ITmozg.ru
    Itvsi.info
    Ivan Booravoi(в основном backend)
    Java Courses With Kovalevskyi
    Java developer
    Master-CSS(не только про css, но все про верстку)
    Postgres Professional
    Rahim Muratov(YII 2)
    Ruseller.com(эх... ностальгия)
    splincode wd(Java, Php, C, C#, C++, и пр.)

    Англо - понимающим :)
    Codecourse(Eng)
    JREAM(Eng)
    Code Review Videos(Eng)

    Не по теме, ну тоже интересно :)
    Новинки IT, Обзоры компьютерной техники и периферии (здесь моддинг и оверклокинг своего железного питомца)
    COMPDAY.RU(тоже моддинг и разгон)

    MyGap - А вот это самый интересный канал (который не по теме (= )
    Ответ написан
    Комментировать
  • Как правильно реализовать API?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Шаг 1, изучаем https://jwt.io/ - на настоящий момент стандарт для аутентификации.
    Шаг 2. Каждое устройство должно иметь уникальный токен. Пользователь должен иметь возможность деавторизовать любое устройство. При смене пароля все токены автоматически стираются.

    Организация хранения токена должна выглядеть примерно так:
    tokens
    - user_id
    - device_id  - при авторизации через браузер можно подставить md5(User-Agent)
    - device_name  - человеко-понятное имя девайса или название браузера
    - token
    - last_used
    - expires_at

    Про API, вместо передачи дополнительного параметра в запросе очень часто используют HTTP-заголовки.
    Наличие множества токенов практически ничем не грозит, разве что небольшим увеличением размера данных.
    Сброс токенов нужен по времени, по смене пароля, значительной смене географии (другая страна и т.п.), при нажатии кнопки Выход и по желанию пользователя (опции Выйти со всех устройств).
    Ответ написан
    12 комментариев
  • Записная книжка программиста?

    DevMan
    @DevMan
    https://ru.wikipedia.org/wiki/Сниппет

    есть масса софта для их организации, с онлайновой синхронизацией и без.

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

    лично я предпочитаю офлайновый менеджер, с синхронизацией через дропбокс.
    Ответ написан
    Комментировать
  • Doctrine ORM Лучшие практики?

    by25
    @by25
    Веб-разработчик
    1. Никаких сеттеров. Entity всегда дожна быть валидной (установка значений через конструкторы, именованные контсрукторы). Если нужно менять состояние - делаем осмысленные методы, типа:
      public function updatePassword($plainPassword, EncoderInterface $encoder) {
          //...
      }
      public function updateProfile(UserProfile $profile) {
          //...
      }

    2. Вадидация должна происходить в приложении на более высоких слоях. (Валидируем request, command и прочее).
    3. Очень удобно использовать Embedded-object (doctrine-orm.readthedocs.io/projects/doctrine-orm/... в качестве Value-objects.
    4. flush() всегда делаем в контроллере (в верхнем слое приложения) и забываем про такую конструкцию $em->flush($myEntity); Суть такая: наше приложение работает с бизнес-объектами (domain-objects), меняет их состояние, однако про сохранение (коммит изменений) слой модели не должен знать, это не его задача. Все изменения фиксируются в конце запроса.
    5. Используйте Domain-events - очень удобная штука.
    6. Иногда очень полезно отказаться от автогенерации доктриной id, можно использовать uuid.


    И дострина многим не нужна, часто достаточно active-records.
    Doctrine даёт большой профит только если доменна логика сложная, ну все это хорошо ложится на проектирование по модели (DDD).
    Ответ написан
    7 комментариев
  • Какие есть интересные блоги современных JavaScript ниндзя?

    • www.nczonline.net
    • 2ality.com
    • ponyfoo.com
    • mathiasbynens.be
    • davidwalsh.name
    • rmurphey.com/archives
    • caolan.org
    • perfectionkills.com
    • www.bennadel.com
    • addyosmani.com/blog/
    • dmitrysoshnikov.com
    • yehudakatz.com
    • ncombo.wordpress.com
    Ответ написан
    3 комментария