• Попросили проверить код, на что смотреть нужно?

    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 комментариев
  • Как называется описанная математическая операция над функцией?

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

    Stalker_RED
    @Stalker_RED
    Конечно, лайки за комментарии - это круто. Я бы нажимал иногда.
    Составной лайк, как предложил Сергей, тоже может взлететь. Как и вынесение ветки из комментов в ответ.

    ИДЕИ И ПРЕДЛОЖЕНИЯ:
    Сделать более явной кнопку редактирования собственного вопроса или ответа. Поставить ее вместо "нравится", например. Все равно ведь "голосовать за собственный ответ нельзя".

    Скрывать поле ответа для автора самого вопроса. Или полностью блокировать. Или хотя-бы выводить предупреждение. Очень часто новички на тостре вместо того, чтобы дополнить вопрос пишут всякое в поле "ответ".

    Изменить очень неочевидную иконку кнопки с тремя точками на <cоde> или типа того.

    Вместо удаления вопроса с формулировкой "ответ легко ищется поисковиком" - плашка со ссылками на похожие вопросы на тостере.
    pro: Эти почти почти одинаковые вопросы - это же ваши ключевики для органики.
    contra: Несколько лишних кликов для модератора. Но можно частично автоматизировать.

    В некоторых случаях можно подсказывать ответы еще в момент написания заголовка вопроса. Этакий live search в стиле гугла.

    Рейтинги за сами вопросы, причем не только в плюс, но и в минус. Я понимаю, что это очень спорная тема, но сейчас чуть ли не половина всех вопросов, которые появляются в моей ленте, сформулированы так, что можно только пытаться угадать чего на самом деле хотел автор вопроса. И некоторые люди пишут такие вопросы целыми сериями. К примеру, пользователь hollanditkzn пишет какой-то сервис по продаже футболок и когда у него появляются трудности - пишет вопрос на тостер. При этом он, похоже, свято верит, что все в курсе "содержания предыдущих серий" все знают какой код он там у себя написал, и какие ошибки у него выскакивают. Было бы круто заминусовать большую часть таких вопросов, например.
    pros:
    Меньше затраты времени и внимания у отвечающих.
    Более чистая поисковая выдача, если заминусованные вопросы плетутся в конце.
    cons:
    Некоторые люди постесняются писать вопросы (но может это и к лучшему?)
    Появится возможность для "карма-войн". Хотя на и хабре вроде выработали более-менее работающую схему, и на stackoverflow тоже.

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

    UPD2: Еще одно рацпредложение:
    Сейчас в ленте над заголовком вопроса указаны теги, как-то так:
    eq163KD.png
    При этом нет никакой возможности узнать какие-же там "+2 ещё", пока не откроешь сам вопрос. Было бы круто сделать показ тегов хотя-бы при наведении мышкой, чтобы можно было не открывая понять, что там про 1С, например.
    Ответ написан
    Комментировать
  • В каких вопросах комментарии к ответам играют большую роль, чем сам ответ?

    edinorog
    @edinorog
    Троллей не кормить!
    Ответ может быть многосоставной. Например автор указывает что это ответ и ниже ставит плюсик на комментарий. Который зеркалируется вверх к ответу

    А насчёт лайков ... да хрен его знает). Лайк должен быть один. За ответ!

    Вы бы лучше занялись стабильностью работы ресурса. А то когда инет лаганул и я чисто машинально нажимаю на первое что попалось под руку для проверки ... тостер это наихудший вариант!) Приходится запускать другой ресурс!)
    Ответ написан
    8 комментариев
  • Как получать переносы строк из textarea?

    @denisbookreev Автор вопроса
    Решил проблему с помощью атрибута <textarea wrap="hard"></textarea> и ответа Артем
    Ответ написан
    Комментировать
  • Как получать переносы строк из textarea?

    devspec
    @devspec
    Помогло? Отметь решением
    Вот это, видимо, имеется в виду?
    str = str.replace(/(?:\r\n|\r|\n)/g, '<br />');
    Ответ написан
    Комментировать
  • Какой оверхед у трафика https против http?

    sim3x
    @sim3x
    В ИТ, когда какой-то шпиціалист что-то говорит, можно просто попросить у него линк на тесты и метрики

    Советую у них спросить ети самые тесты и метрики
    Возможно, они помогут избавиться от персонала без квалификации

    stackoverflow.com/a/149445

    stackoverflow.com/questions/1468648/https-vs-http-...

    https://www.keycdn.com/blog/https-performance-overhead/

    Traffic overhead 5kb per connection
    CPU overhead 2%
    Ответ написан
    7 комментариев
  • Хранить ли фотки в базе данных?

    liveunit
    @liveunit
    Путь к изображению - да, само изображение хранить в бд не стоит.
    Ответ написан
    Комментировать
  • Почему Yii/Yii2 не подходит для крупных проектов?

    qonand
    @qonand
    Software Engineer
    Хоть Yii и создан в первую очередь как фреймворк для быстрой разработки приложений, ничего не мешает сделать на нем крупный проект. Как сказал oxidmod Yii ничего не навязывает разработчику, в этом его плюс и минус одновременно. Если проект реализовывают профессионалы - они спокойно его сделают на Yii качественно, если новички - они спокойно заговнокодят проект. Т.е. тут вопрос только в радиусе кривизны рук. Yii реже выбирают для крупных проектов чем тот же Symfony, т.к. с точки зрения бизнеса он более оптимальный, например:
    - в стандартной реализации Yii нацелен в первую очередь на скорость разработки, симфони - на качество. Соответственно в крупном проекте дешевле использовать Symfony со всеми его инструментами, чем реализовывать эти инструменты с нуля. Например, yii-шный ActiveRecord - хорош на простых проектах, но в сложных проектах он приносить больше проблем чем пользы, а в стандартной реализации никаких альтернатив ему не предусмотрено ...
    - Symfony накладывает определенные правила разработки для программистов, соответственно из за этого проще внедрять на проект новых разработчиков, не боясь что они заговнокодят.
    - в Yii низкий порог входа, соответственно "качество" многих разработчиков желает лучшего ...
    Ответ написан
    7 комментариев
  • Что нужно знать/уметь для создания сайта подобного myshows?

    keeprock
    @keeprock
    Тут надо знать несколько вещей:

    1. Как создавать интерфейсы и кое-что из мира вебдизайна

    2. Выбранный вами язык программирования (я так понимаю это PHP)

    3. Основы программирования (не веб-программирования, а именно программирования). Вот эти все непонятные вещи типа ООП, классов, инкапсуляции, наследования и прочее, прочее, прочее. Сервисы такого уровня требуют базовой подготовки в этом направлении.

    4. Что такое веб-фреймворки и как они могут помогать при разработке

    5. Как работать в базами данных

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

    Разбивайте проект на небольшие модули и постепенно пишите их. А потом соединяйте.
    Ответ написан
    Комментировать
  • Куда податься PHP программисту?

    @g00d
    Послушай, малыш.

    Совет от тебя же из будущего.

    Иди в универ, обязательно получи ВО. Все 5 или 6 лет ищи летнюю стажировку в гугл или других гигантах, поднимай до небес английский, параллельно с этим развивайся в соц. вопросах. Учись общаться с людьми, манипулировать ими. Подчиняться и управлять. Все что тебе кажется в коде (в программировании) самым сложным, окажется самым простым в твоей жизни! Без ВО ты будешь мало кому интересен. Чем оно круче тем тебе лучше. Со строчкой в CV о летней стажировке в крупной компании тебя возьмут с руками оторвут.

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

    P.S. Запомни, ты сейчас находишься в возрасте когда еще можно раскрыть свой потенциал. Когда тебе будет 20, 30, 35... раскрывать будет уже почти не возможно. Да ты сможешь приобретать новые навыки, умения, знания. Но это будет делать все сложнее и сложнее. Сейчас золотое время, используй его!
    Ответ написан
    2 комментария
  • Какой шрифт изображён на данной афише?

    whoisthere
    @whoisthere
    Не благодари. Жми «Нравится»
    Egor Krid Condensed
    Ответ написан
    1 комментарий
  • Куда податься PHP программисту?

    neuotq
    @neuotq
    Прокрастинация
    Выбирай любой ВУЗ где есть технические специальности программиста, конечно лучше что-то из крутых, больше можно будет научится у хороших профессоров, но даже не самые топовые уже хорошо. ВУЗ даст тебе опыт, понимание многих базовых фундаментальных штук, четкую программу что нужно учить на первых этапах. Помни, что самое важное в ВУЗе это не то как тебя учат, а то как ты учишься. Заканчивать конечно же не обязательно, хотя все же чем дольше ты продержишься тем лучше. Постоянно делай сайты и для группы и для кафедры и для различных ваших мероприятий. Параллельно нужно сделать over9000 заказов из города типа сайта для магазина что продает конфеты, все можно сделать даже за не очень большие деньги. но так ты набьешь руку еще и в практической части, поймешь какие проблемы реальных обычных людей что далеки от технических специальностей, научишься общаться и понимать задания которые не понимает тот кто их ставит и тд и тп.
    PS а, и обязательно найди деньги для этого: https://ru.hexlet.io/ , они сегодня одни из лучших в плане обсучения начинающих и не очень программистов. Подход совершенно иной чем у других "научу php за месяц", курсы и задания продуманны с целью прокачки прежде всего фундаментальных и практических штук, а уже следствие этого будет изучения php(ну или другого языка).
    Вот как то так.
    Ответ написан
    5 комментариев
  • Почему Php PDO отказывается принимать массив аргументов в execute?

    mahoho
    @mahoho
    Full stack certified PHP developer.
    Вы не можете подменять имена объектов (таблицы, столбцы, функции, процедуры) при помощи подготовленных выражений (prepared statements). Либо вручную собирать запрос, либо пересмотреть архитектуру приложения.
    Ответ написан
    3 комментария
  • Для чего используют абстрактные классы?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Абстрактный класс - это шаблон проектировщика, если вы наследуете от него класс, то он ОБЯЗАН иметь реализацию всех абстрактных методов какие перечислены в абстракции. Если Вася наследует от базовой абстракции MultiMedia класс Video, а Коля класс Audio, то для них будет "подсказка" что в их классе обязательно должен быть метод getPlayTime(), который есть в абстрактном классе, и Федя может смело его вызывать в любом классе наследуемом от абстрактного. Хотя в video и audio они реализованы по разному.
    Ответ написан
    4 комментария
  • Для чего используют абстрактные классы?

    Denormalization
    @Denormalization
    1) Нельзя создать инстанс абстрактного класса.
    2) Методы объявленные как "abstract" - обязательны к реализации. Что дает уверенность в том, что любой наследник будет реализовывать эти методы.
    3) Открыв файл с абстрактным классом, я сразу вижу методы которые у него есть, и которые мне необходимо реализовать. В вашем же примере я не знаю какие методы относятся конкретно к ChildClass, а какие к ClassName.

    Все эти интерфейсы, абстрактные классы и т.д и т.п нужно тогда, когда над проектом работает несколько (много) человек, и проект чуть больше чем "свой мегакрутой бложик".
    Ответ написан
    Комментировать
  • Для чего используют абстрактные классы?

    @Firik67
    Middle PHP Developer
    Это нужно для гарантии того, что в наследуемых классах будет реализован метод с тем же названием и похожим функционалом. Например, у классов Треугольник и Круг должен быть реализован абстрактный метод get_area, который считает площадь. Иначе можно писать в одном классе area, в другом get_area, что вызывает путаницу и проблемы с поддержкой кода. Имхо, думаю это не вся суть:)
    Ответ написан
    5 комментариев
  • PHP функция не видит внешнюю переменную?

    artem90
    @artem90
    TeamLead, Developer
    У функции своя область видимости и она не видит внешние пользовательские переменные.
    Для доступа к переменной Вам надо передать ее в качестве аргумента:
    function checkDone($myVar) {
       var_dump($myVar);
    }
    
    $myVarOutside = 100;
    checkDone($myVarOutsite);
    Ответ написан
    Комментировать
  • PHP функция не видит внешнюю переменную?

    AloneCoder
    @AloneCoder
    [object Object]
    $nameErr = $emailErr = $genderErr = "";
    
    function checkDone($nameErr)
    {
    if($nameErr == "")
    {return "true";}
    else
    {return "false";}
    }
    echo checkDone($nameErr);
    Ответ написан
    Комментировать