• Когда объектов не достаточно

    • Translation

    Я искал материалы об истоках объектно-ориентированного программирования. Причина была в том, что в сообществе Laravel возникла тенденция использовать паттерн Action и говорить вот что такое «настоящее ООП». У меня возникли некоторые сомнения, и вместо того, чтобы задавать вопросы, я решил поискать ссылки времён Smalltalk. Нашёл книгу Smalltalk, Objects, and Design. И мне было так интересно её читать, что я решил поделиться с вами своими находками.

    Паттерн Action гласит, что логику нужно обёртывать в классы Action. Эта идея не нова, в других сообществах продвигалась «Чистая архитектура», при которой каждый «сценарий использования» (или Interactor) должен являться самостоятельным классом. Всё очень просто. Но об этом ли говорит ООП?

    Если вам интересна суть статьи, то:

    • Smalltalk был одним из первых ООП-языков. Он стал источником таких концепций, как наследование и обмен сообщениями (или как минимум он их популяризировал, насколько я вижу).
    • Как сказал Алан Кей, придумавший термин «объектно-ориентированное программирование», объектов не достаточно. Они не обеспечивают нам архитектуру. Объекты — это про взаимодействие между ними, и в случае с большими системами вам нужна возможность разделения приложения на модули, которые можно отключать по отдельности, заменять и включать снова в общую систему, не кладя при этом всё приложение. В этом контексте Алан предлагает идею инкапсуляции «сообщений» в классы, когда каждый экземпляр является сообщением в системе, подкрепляя идею наличия в Чистой архитектуре классов «Action» или «интеракторов».

    Продолжайте читать, если я разжёг в вас интерес.
    Читать дальше →
    • +32
    • 6.2k
    • 6
  • Буддизм с точки зрения программиста

      Здравствуйте, меня зовут Сергей, я работаю JavaScript-программистом, и я - буддист. Но совсем не такой, каким вы меня только что представили. Наверняка, при прочтении слова "буддист", в вашей голове всплывает либо образ улыбчивого азиата в оранжевом одеянии, либо образ безработного хиппи-вегана, путешествующего по Индии, занимающегося йогой и ищущего "просветления" в сомнительных религиозных практиках. Так вот, я ни тот, и ни другой. Так кто же я? Чтобы ответить на этот вопрос, нужно для начала поближе познакомиться с историей буддизма.

      Около трех с половиной тысяч лет назад Древняя Индия была завоевана ариями - одним из индоевропейских племен, пришедшем в Индию с предгорий Кавказа через территорию современного Ирана. Немного отклонившись от основной темы поста, скажу, что с этим завоеванием связано много интересных фактов. Именно потому, что кроме Индии эти племена завоевали также территории Европы и Ирана, все европейские, персидский и индийские языки родственны друг другу и входят в одну языковую семью. Вы же понимаете санскритское слово "веды" без перевода, верно? И именно по названию места происхождения этих племен в английском языке европеоидная раса называется caucasian race. А также именно по названию этого племени французский граф Жозев Артюр де Гобино дал имя своей печально известной расовой теории, позже популяризованной и претворенной в жизнь Адольфом Гитлером. Но давайте вернемся назад к нашей теме.

      Читать далее
    • Чистая Архитектура для веб-приложений

        Хочу поделиться с вами подходом который я уже много лет использую в разработке приложений, в том числе и веб-приложений. Многим разработчикам настольных, серверных и мобильных приложений этот подход хорошо знаком, т.к. является фундаментальным при построении таких приложений, однако в вебе он представлен очень скудно, хотя желающие использовать такой подход однозначно есть. Кроме того на таком подходе написан редактор VS Code.

        Чистая Архитектура

        В результате применения этого подхода вы отвяжетесь от конкретного фреймворка. Сможете легко переключать библиотеку представления внутри вашего приложения, например React, Preact, Vue, Mithril без переписывания бизнес логики, а в большинстве случаев даже вьюхи. Если у вас есть приложение на Angular 1, вы без проблем сможете перевести его на Angular 2+, React, Svelte, WebComponents или даже свою библиотеку представления. Если у вас есть приложение на Angular 2+, но нету специалистов для него, то вы без проблем сможете перевести приложение на более популярную библиотеку без переписывания бизнес логики. А в итоге вообще забыть про проблему миграции с фремворка на фреймворк. Что же это за магия такая?
        Читать дальше →
      • Unit тестирование в Laravel

        • Tutorial

        Я часто слышу среди обсуждений в сообществе мнение, что unit тестирование в Laravel неправильное, сложное, а сами тесты долгие и не дающие никакой пользы. Из-за этого эти тесты мало кто пишет, ограничиваясь лишь feature тестами, а польза unit тестов стремится к 0.
        Я тоже так считал когда-то, но, однажды я задумался и спросил себя — может быть я не умею их готовить?


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

        Читать дальше →
        • +18
        • 21.8k
        • 9
      • Классифицировать старение организма, чтобы помочь стареющему населению

        • Translation
        1 ноябре в журнале Science вышло обращение ученых, исследователей старения, к Всемирной Организации Здравоохранения о том, что надо на старение не просто смотреть, а как-то классифицировать его с медицинской точки зрения. Проще говоря, предлагают старение признать болезнью, диагностировать на различных этапах и лечить. Это политически важная статья, поэтому мы её полностью перевели и публикуем. Обратите внимание на потрясающий список мест работы ученых, он приведен в конце.

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

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

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

        Тем не менее, для проведения клинических испытаний необходимо диагностировать заболевание и назначить лечение, необходим соответствующий код классификации болезней, принятый на национальном уровне в Международной классификации болезней ВОЗ (МКБ).

        Читать дальше →
      • Moscow Node.js Meetup 10: Архитектура Node.js-приложений, Hot Reload в Node.js и секретный доклад

          Друзья, это становится доброй традицией. Мы не встречались почти 11 месяцев – прошлая наша встреча была накануне Нового года и у самого Кремля. А в этом году Node.js исполнилось 10 лет, а это значит время провести юбилейный 10-й митап Msocow Node.js Meetup!

          В то время, как наш чат в Telegram ( t.me/nodejs_ru ), посвященный разработке на Node.js уже перерос 5 000 (пять тысяч!) участников, всё больше компаний, как международных, так и российских, продолжают успешно разрабатывать решения на базе Node.js, наращивать экспертизу на production-проектах.

          Крупные корпорации, банки, финансовые сервисы, e-Commerce, клиентские сервисы – все здесь. Масштаб и спектр задач, которые успешно решаются с помощью Node.js продолжает расти, а новые вызовы продолжают подогревать нам не только мозги!
          Эта встреча станет ещё более интересной и на этот раз пройдет при сильной поддержки от команды Leroy Merlin, известной своими развитыми архитектурными практиками и решениями в Node.js.

          Совсем недавно вышла уже счастливая 13-я версия, а 12-я “улетела” в LTS. Что это значит? Поговорим при встрече.;) А заодно обсудим, что произошло у каждого из нас за год – у кого-какие успехи, боли, челленджи, а затем копнем проблему создания единой архитектуры приложения, способы её решения, посмотрим на проблемы изолированных площадок и hot-reloading модулей в Node.js.

          КОГДА: 20 ноября 2019, 19:00
          ГДЕ: Москва, Шаболовка, в офисе компании Leroy Merlin.

          Программа


          Читать дальше →
          • +20
          • 3.1k
          • 1
        • Лексическое окружение (LexicalEnvironment) и Замыкание (Closures) в EcmaScript

            Привет, Хабр!

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

            Сегодня мы продолжим разбирать ключевые концепции EcmaScript, поговорим о Лексическом окружении и Замыкании. Понимание концепции Лексического окружения очень важно для понимания замыкания, а замыкание это основа очень многих хороших техник и технологий в мире JS (который основан на спецификации EcmaScript).

            Итак, начнём.

            Лексическое окружение (LexicalEnvironment, ЛО, LE)


            Официальная спецификация ES6 определяет этот термин как:
            Lexical Environment — это тип спецификации, используемый для разрешения имён идентификаторов при поиске конкретных переменных и функций на основе лексической структуры вложенности кода ECMAScript. Лексическая окружение (Lexical Environment) состоит из записи среды и, возможно, нулевой ссылки на внешнюю Лексическую среду.
            Разберёмся подробнее.

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

            Технически ЛО представляет собой объект с двумя свойствами:

            • запись окружения (именно тут хранятся все объявления)
            • ссылка на ЛО порождающего контекста.
            Читать дальше →
          • Функциональное программирование с точки зрения EcmaScript. Чистые функции, лямбды, имутабельность

              Привет, Хабр!

              Сегодня мы начнём говорить на очень важную тему — функциональное программирование. Значение ФП в современной веб-разработке трудно переоценить. Архитектура любого крупного современного проекта включает в себя пользовательские библиотеки функций и на собеседовании любого уровня в обязательном порядке будут вопросы по ФП.

              Введение в функциональное программирование


              Функциональное программирование(ФП) — способ организации кода через написание набора функций.

              EcmaScript, являясь мультипарадигменным языком программирования, реализует наряду с прочими и функциональную парадигму. Это означает, что функции в ES являются данными и могут быть переданы в функции, возвращены из функций и могут сами принимать функции. Т.е. функции в ES являются функциями первого класса.

              Отсюда следуют следующие определения:

              Функциональный агрумент(Functional argument, фунарг) — аргумент, значением которого является функция.

              Функция высшего порядка(ФВП, higher-order-funtion, hof) — функция, которая принимает функции в качестве аргументов.

              Функции с функциональным значением(Function valued functions) — функция, которая возвращает функцию.

              Все эти типы функций условно объединяют в функции первого класса, и, как следует из определения выше, в ES все функции являются объектами первого класса.
              Читать дальше →
            • Делим Laravel на компоненты

              Привет, Хабр. Недавно получил в руки интересный проект, который, несмотря на свою простоту требовал не использовать какой-либо фреймворк. О пакетах речи не шло, поэтому было принято решение использовать привычные компоненты Laravel. Если есть необходимость в использовании очередей, Eloquent или контейнера — добро пожаловать под кат.

              Читать дальше →
            • Docker + php-fpm + PhpStorm + Xdebug

              • Tutorial
              Не так давно тимлид нашей команды сказал: ребята я хочу, чтобы у всех была одинаковая среда разработки для наших боевых проектов + мы должны уметь дебажить всё — и web приложения, и api запросы, и консольные скрипты, чтобы экономить свои нервы и время. И поможет нам в этом docker.

              Сказано — сделано. Подробности под катом.
              Читать дальше →
            • Полезные репозитории с Eloquent?

              • Translation

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


              <?php
              interface PostRepository
              {
                  public function getById($id): Post;
                  public function save(Post $post);
                  public function delete($id);
              }

              Однако, в реальных проектах, если репозитории таки было решено использовать, в них часто добавляются методы для выборок записей:


              <?php
              interface PostRepository
              {
                  public function getById($id): Post;
                  public function save(Post $post);
                  public function delete($id);
              
                  public function getLastPosts();
                  public function getTopPosts();
                  public function getUserPosts($userId);
              }
              Читать дальше →
            • Пожалуйста, прекращайте говорить про шаблон Репозиторий с Eloquent

              • Translation

              Я регулярно вижу статьи в стиле "как использовать шаблон Репозиторий с Eloquent" (одна такая попала в недавний PHP-дайджест). Обычное содержание их: давайте создадим интерфейс PostRepositoryInterface, EloquentPostRepository класс, красиво их забиндим в контейнере зависимостей и будем использовать вместо стандартных элоквентовских методов save и find.


              Зачем этот шаблон нужен иногда вовсе не пишут ("Это же шаблон! Разве не достаточно?"), иногда что-то пишут про возможную смену базы данных (очень частое явление в каждом проекте), а также про тестирование и моки-стабы. Пользу от введения такого шаблона в обычный Laravel проект в таких статьях сложно уловить.


              Попробуем разобраться, что к чему? Шаблон Репозиторий позволяет абстрагироваться от конкретной системы хранения (которая у нас обычно представляет собой базу данных), предоставляя абстрактное понятие коллекции сущностей.

              Читать дальше →
            • Как мы писали фронтенд собственной панели управления хостингом: фреймворк и бэкдоры


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

                Сегодня наш фронтенд разработчик Артыш расскажет, как писал фронтенд этой панели: какой выбрали фреймворк, какой антипаттерн считаем хорошим тоном и как защищаться от бэкдоров, если пользуетесь готовыми библиотеками.
                Читать дальше →
              • Deploy Symfony + React приложения на AWS посредством CI

                Добрый день, в данной статье я покажу как развернуть Symfony 4 приложение на AWS. В официальной документации есть пример подобного процесса, однако мой вариант не столь тривиален, как загрузка zip архива с приложением. На дворе 2019, в моде docker, микросервисная архитектура и CI/CD практики наконец-то начинают входит в инструментарий не только DevOps-инженеров, но и простых смертных разработчиков. Чтобы статья была более интересна, я добавил фронт на React.JS, для охвата потребностей большей массы людей, если ваше приложение не использует Encore — не беда, я укажу как изменить Docker-файл для вас, поддержка React.JS тут влияет только на него. Кому будет интересен данный туториал? В первую очередь он направлен на PHP-разработчиков, желающих изменить свою практику деплоя — отойти от привычных канонов и воспользоваться docker для паковки своего приложения и выкладки образа. Но можно пойти чуть глубже, и дальнейшее повествование будет направлено на автоматический деплой приложения из Git'а посредством CI/CD платформы (будет использован CircleCI, но если интересует конфиг Gitlab'а, пишите в комментариях, я приложу). По сути, тут абсолютно не важно React/PHP ли у вас приложение или, скажем, на .NET Core, данная часть будет интересна разработчикам для получения навыков автоматизации деплоя в целом. Исходный код доступен в github-репозитории, ссылка в конце статьи. Ну что же, поехали!
                Читать дальше →
                • +10
                • 4.4k
                • 6
              • Альтернативный подход к подписке на события, или а так ли нужен EventObject

                Резюме


                Целью этой статьи является попытка посмотреть, с иной точки зрения, на описание систем распространения событий.
                 
                На момент написания этой статьи большинство ведущих фреймворков на php реализуют систему событий, в основе которой лежит описание объекта события EventObject.
                 
                Это стало стандартом в php, что недавно было подтверждено принятием стандарта psr/event-dispatcher.
                 
                Но получается так, что описание объекта события мало помогает при разработке слушателя. За деталями под кат.

                Читать дальше →
                • +19
                • 3.2k
                • 6
              • Vue.js: 3 анти-паттерна

                • Translation
                Вероятно, Vue.js — это один из приятнейших JavaScript-фреймворков. У него имеется интуитивно понятный API, он быстрый, гибкий, им легко пользоваться. Однако гибкость Vue.js соседствует с определёнными опасностями. Некоторые разработчики, работающие с этим фреймворком, склонны к небольшим оплошностям. Это может плохо влиять на производительность приложений, или, в долгосрочной перспективе, на возможность их поддержки.



                Автор материала, перевод которого мы сегодня публикуем, предлагает разобрать некоторые распространённые ошибки, совершаемые теми, кто разрабатывает приложения на Vue.js.
                Читать дальше →
                • +34
                • 16.5k
                • 5
              • 7 полезных сайтов и приложений для изучения английского

                • Translation


                Интересный факт – 20% населения планеты хотя бы на каком-то уровне говорит на английском языке, а его носителями являются всего 5% населения. При этом, этот язык – пожалуй, главный в интернете. По статистике, на нем написано 55,5% всего размещенного онлайн-контента.

                Так что для того, чтобы иметь доступ к огромному количеству информации, нужно учить английский. Лично мне бороться с прокрастинацией всегда нелегко, а летом это делать еще труднее. На полноценные занятия силы воли не хватает, однако есть приложения и сайты, на которых можно учить слова и грамматику в более легком режиме. Я нашел статью с подборкой таких ресурсов и подготовил ее адаптированный перевод.
                Читать дальше →
              • Race condition в веб-приложениях

                • Tutorial
                TL;DR В статье описываются непопулярные трюки с race condition, которые обычно не используют в атаках такого типа. По итогу исследований мы сделали свой фреймворк для атак racepwn.

                Вася хочет перевести 100 долларов, которые есть у него на счету, Пете. Он переходит на вкладку переводов, вбивает Петин ник и в поле с количеством средств, которые необходимо перевести — цифру 100. Далее, нажимает на кнопку перевода. Данные кому и сколько отправляются на веб-приложение. Что может происходить внутри? Что необходимо сделать программисту, чтобы все работало корректно?
                Читать дальше →
              • Hello, World! Глубокое погружение в Терминалы


                  На написание данной статьи меня вдохновила статья об анализе Сишного printf. Однако, там был пропущен момент о том, какой путь проходят данные после того, как они попадают в терминальное устройство. В данной статье я хочу исправить этот недочет и проанализировать путь данных в терминале. Также мы разберемся, чем отличается Terminal от Shell, что такое Pseudoterminal, как работают эмуляторы терминалов и многое другое.

                  Читать дальше →
                • Разработка под Docker. Локальное окружение. Часть 2 — Nginx+PHP+MySql+phpMyAdmin

                    Для лучшего понимания нижеследующего материала сначала рекомендуется ознакомится с Предыдушим постом

                    Рассмотрим пример развертки локального окружения состоящего из связки Nginx+PHP+MySql+phpMyAdmin. Данная связка очень популярна и может удовлетворить ряд стандартных потребностей рядового разработчика.

                    Как и в прошлом посте акцент будет смещен в сторону утилиты docker-compose, чем докера в чистом виде.

                    Итак, поехали!
                    Читать дальше →