• Как хранить характеристики товаров с расчетом на сложные запросы?

    может это подойдет habrahabr.ru/post/261137
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

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

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

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

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Почему в автозагрузчик 2 раза бросается вызов класса?

    miraage
    @miraage
    Старый прогер
    У вас всё это в одном файле? Уууу, я вас умоляю....

    https://getcomposer.org/doc/04-schema.md#autoload

    И вообще, внимательно ознакомтесь со всеми PSR стандартами.
    Ответ написан
    1 комментарий
  • В каком возрасте вы прочитали GOF паттерны?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    с 20 до 27 лет работал схемотехником...программировал в школе, институте, на работе под микроконтроллеры и для ПК простые приложения для взаимодействия с микроконтроллерами.
    В 27 стал работать С#-программистом и GOF-книгу прочитал в 29. Нового почти не узнал, узнал названия тех вещей, которыми занимался. =)
    Ответ написан
    Комментировать
  • В каком возрасте вы прочитали GOF паттерны?

    voidnugget
    @voidnugget
    Программист-прагматик
    В 18 прочитал "Шаблоны проектирования", и в 19 "Шаблоны проектирования корпоративных приложений" с "Зомбированные шаблонами и балдеющие от адреналина". Активно начал использовать в 19-21 год, когда начали появляться подходящие задачи. К самому GOF'у стоит относится скептически так как там описаны далеко не все существующие шаблоны, которые приходится использовать на практике, да и то максимум 3-4 шт на приложение.

    Просто читать - бесполезно, нужно смотреть примеры реализации на различных языках, и реализовывать самостоятельно.
    Ответ написан
    Комментировать
  • В каком возрасте вы прочитали GOF паттерны?

    @jaxel
    Лет в 20 первый раз прочитал... и ничего не понял:) GOF очень тяжело воспринимается, особенно начинающими. Более-менее хорошо понимать паттерны я стал после прочтения Фримен Эр., Фримен Эл., Сьерра К., Бейтс Б. "Паттерны проектирования". Там всё простым языком написано и разжёвано.
    Ответ написан
    Комментировать
  • В каком возрасте вы прочитали GOF паттерны?

    newross
    @newross
    Product owner
    Дело не в возрасте, а в квалификации и опыте.
    Не имея реального опыта решения задач, для которых применяются паттерны, непонятно зачем это все нужно. И соотвественно не интересно читать и вникать. Как только соберешь грабли и начнешь искать способы их обхода - начинай читать.
    Ответ написан
    1 комментарий
  • Как в API Яндекс карт геокодировать запрос и получить название области в стране?

    У Москвы нет области, это город федерального подчинения.
    Для Кирова (или любого другого города, кроме Москвы и Петербурга), например, отдается область - https://geocode-maps.yandex.ru/1.x/?format=json&ge...
    Ответ написан
    3 комментария
  • Сколько весит ваш сайт?

    @Valera_gm
    Эл.библиотека, общий вес ~200гб ("html" + картинки (файлов под ~5 миллионов) ,шаблонизатор smarty, 120мб база данных об книгах, их авторах, принадлежность к категории).
    500-600 уников в сутки (в смысле тех кого регистрирует счетчик liveinternet ) и много тысяч хитов, которые генерят разные боты(с которыми ведется борьба, за исключением поисковых ботов гугла и яндекса).
    Траффик в месяц 300гб-550гб, конфигурация w7, HDD 1тб(sshd) +128гб ssd, 3770к, 12гб + в мир "смотрит" через vds - hdd raid10 60гб, 2гб озу (он выполняет функцию кеширования и фильтрации траффика).
    Ответ написан
    Комментировать
  • Как в Yii2 формируется переменная $content?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Если не ошибаюсь, может использоваться ob_start
    То есть, это функция, которая не выводит страницу как есть, а записывает ее в буфер, который можно извлечь с помощью функции ob_end_clean().
    Если даже система не такая - думаю, сам принцип довольно близкий к этому.
    Ответ написан
    3 комментария
  • Как починить usb порт в роутере mikrotik после падения со шкафа на пол?

    AnnTHony
    @AnnTHony
    Интроверт
    Открыть, посмотреть визуально ничего ли не оторвано, не отошло.
    Прозвонить порт мультиметром, например.
    Откатиться к контрольной точке - подбросить его с пола на шкаф.
    Ответ написан
    3 комментария
  • В контроллере более 1000 строк кода. Это правильно?

    @SergeyZelensky-Rostov
    ну 35 action это нормально что поделать, а вот бизнес-логику надо держать в модели а на счет проверки данных лучше вообще ее делать отдельным модулем
    Ответ написан
    Комментировать
  • В контроллере более 1000 строк кода. Это правильно?

    @dmitryKovalskiy
    программист средней руки
    Ну вообще многовато, но бывает. Что значит "содержит бизнес логику"? Общается с базой данных запросами? тогда это большой грех. Надо выносить в отдельные классы и компоненты. Опять же сама цифра 35 мало что значит. Возможно ряд экшенов надо выносить в отдельные контроллеры просто по смыслу,а не от переизбытка методов в одном.
    Ответ написан
    3 комментария
  • В контроллере более 1000 строк кода. Это правильно?

    27cm
    @27cm
    TODO: Написать статус
    Размер файла ещё не говорит о том, что в нём что-то не правильно.

    Контроллер содержит бизнес логику. Проверку введенных данных и т.д.

    А вот это уже не хорошо. Бизнес логику я бы убрал в модели, а проверки в фильтры и валидаторы.

    Может разбить контроллер на несколько частей?

    Если экшены можно логически разделить на несколько независимых групп, то почему бы и нет. Ещё иногда удаётся объединить несколько экшенов в один.
    Ответ написан
    Комментировать
  • Какие имена директорий сделать для крупного проекта?

    27cm
    @27cm
    TODO: Написать статус
    Хранить ведущие нули в именах папок - лишнее. В целом решение вполне норм, вот только если пользователей, как вы написали, в перспективе станет 100 000+, то это это уже 100 000+ папок и опять возникает та же проблема.

    Можно делать, например, как в git: берем хеш sha1 от данных файла, создаем папку из первых двух (или более) символов этого хеша, а внутрь заливаем данные. Получится что-то вроде:
    /a4/b7fce097055c3cbd6879db9625f9a3890cc409.jpg
    /a4/a66ce019422c3cbcbd69db9625f9a3890cda83.jpg
    /8c/3c7fbcd903744b20fd7567a1fcefa99133b5bc.jpg
    /e9/65047ad7c57865823c7d992b1d046ea66edf78.jpg
    (Всего не более 256 папок)

    Или если все файлы пронумерованы:
    /a4/1.jpg
    /a4/2.jpg
    /8c/3.jpg
    /e9/4.jpg

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

    ptitca_zu
    @ptitca_zu
    Programmer. Reader. Introvert
    Ответ написан
    Комментировать
  • Где популярные онлайн тестирования разработчиков?

    @Oxoron
    Шарпер
    Хотя придется регистрироваться, тестов там хоть отбавляй.
    Ответ написан
    7 комментариев
  • Какие способы сокрытия контента вы знаете, при адаптивной верстки?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    используйте при разработке подход называемый "mobile first"
    сначала верстайте под мобильные. потом через медиа-запросы подключайте остальное.
    например следующий код
    @media (min-width: 960px) {
      body {
        background: url('big-image.jpg');
      }
    }

    будет загружать картинку только при ширине просмотра более 960 пикселей.
    Ответ написан
    3 комментария