На js сложно наговнокодить

потому что на JS довольно сложно наговнокодить в «самом начале», когда тебе просто надо по нажатию на кнопочку прятать один элемент и показывать другой. Потом приходят колбэки и асинхронный отстрел всех твоих асинхронных ног внутри замыкания — так что твои асинхронные ноги оказываются и не твоими вовсе, вот на этот моменте больше половины и отсеивается

Что такое SPA

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

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

Далее, что же делать с данными, как их использовать? В обычной ситуации веб-сайта, все что делает JavaScript-программист, это «наворачивает» интерфейс (всякие проверки форм на лету, выпадающие менюшки, автокомплиты, измененные контролы и прочие навороты). Но что делать если сервер не отдает нам готовые страницы, а отдает только данные? Вот тут то и приходят на помощь концепции вроде MVC и пр., библиотеки/фреймворки вроде бэкбона, реакта, ангуляра, эмбера и т.п. Они позволяют разбить управление клиентом на несколько абстракций, без которых, перегонять данные сразу в шаблонизатор и выводить на экран будет просто самоубийством с точки зрения проектирования и поддержки.

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

Как только вы это освоите, все современные библиотеки/фреймворки перестанут быть для вас черным ящиком и всё что нужно будет учить, это синтаксис их API и концепции, которыми они оперируют.

Критерии Code Review

* Безопасность:
— Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так — бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов — это вполне норм))
— Никаких trigger_error, только исключения.
— Исключения ДОЛЖНЫ быть человеко-понятны, всякие «Something went wrong» можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
— Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
— За eval как правило шлю на **й.
— @ допускается только в безвыходных ситуациях, например проверка json_last_error.
— Перед работой с БД — обязательная проверка данных.
— Никаких == и !=. Со swtich — единственное исключение, по ситуации.
— Если метод возвращает не только bool, а еще что-то — жесткая проверка с ===, или !== обязательна.
— Никаких условий с присваиваниями внутри. while($row = …) — тоже идет лесом.
— Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном — запрещены.
— Конкатенации в sql — только в безвыходных ситуациях.
— Параметры в sql — ТОЛЬКО через плейсхолдеры.
— Никаких глобальных переменных.
— Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
— Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) — для консоли.
Читать далее →

[ajax_load_more scroll="false"]