PHP: PsySH или Что такое REPL, Exploratory development

Читать в полной версии →

Что такое REPL, Exploratory development

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

Недавно я узнал, что это не просто отчаянная попытка двоечника, а системный подход под названием Exploratory development, что переводится как исследовательская разработка

Я люблю исследования, поэтому этот термин и подход мне очень нравится

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

Или на другом этапе этот цикл может быть представлен так:

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

Традиционные инструменты, используемые до REPL в PHP - это var_dump()+die() и XDebug.

REPL (Read, Execute, Print Loop) - новый инструмент, позволяющий сделать этот цикл более удобным, интерактивным и быстрым.

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

Запуск PsySH

Процесс установки в зависимости от ОС можно найти здесь: https://psysh.org/#install

и здесь: https://github.com/bobthecow/psysh/wiki/Installation

Запуск выполняется командой:

psysh

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

Первый метод - REPL

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

Дальше приведу основной список команд консоли psysh:

Второй метод - Debug

Делая в коде точки останова (breakpoints), мы

Зачем (Use Cases)

Теперь, когда мы представляем в целом, зачем, и что и как мы можем делать с помощью консоли, я думаю будет хорошо представить несколько чуть более конкретных примеров того, для чего именно это может понадобиться в процессе разработки:

Удобства

Теперь рассмотрим некоторые более конкретные удобства, которые можно увидеть в этом инструменте:

Интеграция с фреймворком на примере Laravel

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

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

https://github.com/bobthecow/psysh/wiki/Integrations

Рассмотрим её на примере Laravel. В Laravel PsySH реализован под названием Tinker. Он интегрирован в среду и запускается с помощью консольной утилиты Artisan:

php artisan tinker

Дополнительные команды Tinker

Tinker добавляет в PsySH свои дополнительные команды, ориентированные именно на Laravel. Перечислим их для примерного понимания

Возможности

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

Приведу несколько примеров того, что можно делать в консоли, подключив контекст фреймворка:

Выводы

Интерактивная REPL консоль PsySH позволяет производить интерактивную отладку и исследовательскую разработку.

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

Возможности отладки

Отладка в браузере пока не реализована, поддерживается только встроенный в php браузер, но и REPL-консоль - это не про линейную, а про интерактивную отладку

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

Интерактивная разработка

Использовать голый PHP довольно бесполезно, намного более эффективно использовать с подгрузкой кода всего приложения. Подгрузка кода приложений интегрирована для многих фреймворков, в частности для Laravel

Недостатки

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

Видимо, для того, чтобы выполнить анонимную функцию, нужно будет скопировать её код в консоль.

Нет возможности вывести в консоль графическую информацию, такую как GUI, графики, схемы

Не понятно, как тестировать запросы по API

Аналоги

P.S.:

Когда Вы поправите код в своём любимом редакторе и захотите протестировать свой класс в Tinker, то обнаружите, что в нём используется код в состоянии, которое было на момент запуска tinker. Чтобы получить новый код, понадобится перезагрузить Tinker. Для того, чтобы иметь возможность подгружать код без перезагрузки есть отладчик, основанный на tinker, под названием Tinx. В нём есть команда, перезагружающая код, а также несколько magic команд, упрощающих отладку моделей.

Удачи с REPL!

Используемые материалы

https://psysh.org/

https://psysh.org/#docs

https://github.com/bobthecow/psysh

https://www.sitepoint.com/interactive-php-debugging-psysh/

https://presentate.com/bobthecow/talks/php-for-pirates

https://laravel-news.com/laravel-tinker

видео: https://softonsofa.com/tinker-like-a-boss-custom-includes/

https://www.youtube.com/watch?v=KeQThH9tDB0

https://www.youtube.com/watch?v=xgo3klUrpSc