Задать вопрос
  • Как уменьшить сложность и тяжеловесность "контроллеров" в API приложениях?

    @Akela_wolf
    Extreme Programmer
    Путь к уменьшению сложности один - декомпозиция.
    Выносить все лишнее в отдельные классы и модули.
    Скажем, стоит выносить логику валидации запросов из контроллера в отдельные классы, оставляя в контроллере только абстрактное: валидировать. логировать. передать на обработку. вернуть результат.
    Тоже самое в сервисах: выносить логику обращения к БД, обращения к внешним сервисам и т.д., оставляя только то что относится непосредственно к ответственности сервиса

    См. книгу Р. Мартин "Чистая архитектура", вот статья об этом на хабре
    Ответ написан
    2 комментария
  • Как сделать border для шестиграника?

    TheSnegok
    @TheSnegok
    Ответ написан
    Комментировать
  • На сколько могут быть длинными модификаторы в БЭМ?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    * Это не модификаторы, а элементы

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

    В какой-то момент вы упрётесь в то, что объём стилей блока становится невозможным для поддержки и нужно его декомпозировать на блоки поменьше.
    Если это сразу очевидно, то и декомпозировать лучше сразу.

    уменьшат мне варианты названия других основных блоков на странице


    Создавайте внутренние блоки с общим неймспейсом, в вашем случае основной компонент - `profile`, внутренние - `profile-info`, `profile-page`, и складывайте их так, чтобы связь родитель-ребёнок между блоками была очевидна.
    Ну, да, в таком случае формально вы больше не сможете создать не-дочерний блок с неймспейсом `profile`, чтобы не запутаться, но тут нет других вариантов, и выбрать надо меньшее из зол.

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

    Я вот здесь отвечал на похожий по смыслу вопрос - посмотрите.
    https://qna.habr.com/q/1129178#answer_2136844
    Ответ написан
    2 комментария
  • Как установить ref на transition-group елемент?

    0xD34F
    @0xD34F Куратор тега Vue.js
    ref указанный так указывает на Proxy а не на элемент. Как это исправить?

    Никак не исправить.

    Да это и не нужно. За этим Proxy скрывается ссылка на экземпляр компонента, а у экземпляра компонента в качестве одного из свойств присутствует ссылка на элемент.
    Ответ написан
    Комментировать
  • Как сократить/улучшить этот код?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    document.addEventListener(
      'click',
      (e) => {
        const target = e.target.closest('.media-category__item');
        if (!target) {
          return;
        }
        document.querySelector('.media-category__item.active')?.classList.remove('active');
        target.classList.add('active');
        document.querySelector('.media-tab.active')?.classList.remove('active');
        document.querySelector(`.media-tab[data-tab="${target.dataset.category}"]`)?.classList.add('active');
      },
    );
    Ответ написан
    7 комментариев
  • Как установить событие на будущий DOM элемент?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для контроля изменений DOM используйте MutationObserver. В данном случае вам надо установить опцию childList для слежения за потомками div'а и, если добавление элементов происходит не непосредственно в div, а в его потомка, то ещё и опцию subtree.
    Ответ написан
    Комментировать
  • Нормально ли бросать (throw) внутри async функции?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Где-то читал, что нехорошо кидаться ошибками изнутри async функций
    ... надо только возвращать rejected Promise.

    В этом `где-то` вас обманули, так как любое возвращаемое из `async` функции значение (да, включая throw) уже обёрнуто в `Promise`.

    const foo = async () => { throw new Error('Smth went wrong'); };
    const bar = async () => Promise.reject(new Error('Smth went wrong'));

    Работают абсолютно одинаково
    Ответ написан
    3 комментария
  • Какой функцией декодировать эту строку - чтобы русские буквы получились?

    WblCHA
    @WblCHA
    Для полной коллекции:
    decodeURIComponent("\u042d\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u043d\u0451\u0439 \u0437\u0432\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0431\u043e\u0433 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c")
    Ответ написан
    Комментировать
  • Какой функцией декодировать эту строку - чтобы русские буквы получились?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    toString() прекрасно сделает работёнку: грязно и дёшево )

    (
      "\u042d\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u043d\u0451\u0439 \u0437\u0432\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0431\u043e\u0433 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c"
    ).toString()  // "Это текст которы ..."

    по сути, тут и делать ничего не надо — это просто разные способы записать одну и ту же строку.

    Как число можно записать, например, и 1000 и 1e3 и 0x3E8,
    так и букву, например, можно записать несколькими способами: "ё", "\u0451".
    «В памяти» в итоге окажется одно и то же значение.
    Ответ написан
    Комментировать
  • Как прописать классы в php коде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Объясняем на простом примере, как в программировании можно использовать логическое мышление.
    $description = "<div id='details-2' class='col-12 col-xl-4 col-lg-12 mb-xl-5 mb-5'><div class='d-flex b-skills'><div class='height:70px;'><div class='text-bold'>";
    echo $description,"\n";
    echo addslashes($description);

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

    И откройте уже для себя волшебные клавиши Ctrl-U
    При проблемах с генерацией хтмл, надо смотреть ровно то что нагенерил ваш код, а не те красявости, которые старательно подрисовывает к нему инспектор.
    Ответ написан
    5 комментариев
  • Что такое артефакты в Gitlab?

    @Akela_wolf
    Extreme Programmer
    Нет. Артефакт - это общее название любого файла, полученного в результате сборки. Это может быть собственно результат сборки (jar или exe), отчет о тестах, сгенерированные данные и т.д. Иначе говоря, артефакт - это нечто материальное, то что не исчезает после окончания пайплайна (в отличие от временных файлов, которые удаляются по окончании процесса)
    Ответ написан
    2 комментария
  • Выключается emmet в VS code?

    @Yur4ukk
    Помогло
    просто в settings.json нужно написать такой код

    "emmet.triggerExpansionOnTab": true,
    "files.associations": {"*html": "html"},
    Ответ написан
    Комментировать
  • Как изменить длину заливки svg?

    RAX7
    @RAX7
    1) Заменить path на rect
    2) Для градиента использовать gradientUnits="userSpaceOnUse"
    Ответ написан
    2 комментария
  • Что использовать Long Polling или Webhooks?

    Dr_Elvis
    @Dr_Elvis Куратор тега Python
    В гугле забанен
    делай сразу на вебхуках. полинг удобен разве что для кратковременного присоединения бота. для постоянного стабильного подключения вебхуки. разница в том что полинг сам постоянно опрашивает сервер "есть чо для меня?", на что сервер либо выдает данные, либо нет. а вебхуки это типо "вот мой адрес, пришли данные когда появятся" и сидит ждет от сервера телеграма когда тот пришлет чего.
    Ответ написан
    2 комментария
  • Менеджер паролей iOS российский?

    @Drno
    1. Не умрет
    2. Не существует. (продукты касперского я не считаю адекватными)
    Ответ написан
    Комментировать
  • Стоит ли выносить код в отдельный компонент?

    Aetae
    @Aetae
    Тлен
    Всегда.
    Больше пяти строчек в разметке - отдельный компонент.
    Больше пяти строчек в коде - отдельный хук.)
    Ответ написан
    Комментировать
  • Что писать в резюме чтобы были шансы куда-то попасть без опыта?

    ArchitectOfRuin
    @ArchitectOfRuin
    WordPress-энтузиаст, маркетолог, переводчик
    Десятки откликов - это очень мало. Раньше, когда требовалась работа, я отписывал массово на email разным компаниям по вакансиям.
    Более сотни откликов, еще и написанных по-разному, чтобы в спам не улетало.
    В итоге из сотни откликов нашел пару вариантов для себя. Тоже без опыта. Без вышки. Компаниям на это начхать, если надо вакансию закрыть.
    Просто те вакансии, которые ты видишь, они обычно создаются рекрутерами для имитации какой-то своей деятельности. Чтобы показать начальству: "Смотрите, я работаю!" Они и не заинтересованы кого-то там нанимать. Во многих компаниях открытая вакансия идет в счет другому специалисту, который периодически делает типа "за двоих", а потому и деньги себе зачисляет. Такие тоже заинтересованы в отсутствии человека.
    И еще момент. На крупных биржах вакансий (не будем тыкать пальцем) многие объявления - фейковые. Никого там не ищут и не отвечают никогда. Вот исходя из этой картины мира и делай выводы.
    Ответ написан
    Комментировать
  • Как найти одинаковые на "вид" слова?

    hint000
    @hint000
    у админа три руки
    Выскажу очевидную мысль: сравнивать нужно не слова целиком, а посимвольно.
    Нагугливается без особых усилий целая кучка материалов:
    https://stackoverflow.com/questions/39948627/how-t...
    https://ru.wikipedia.org/wiki/Модуль:Похожие_символы
    https://en.wikipedia.org/wiki/Homoglyph
    https://ru.wikipedia.org/wiki/Омоглиф
    https://codebox.net/pages/homoglyph-detection
    https://habr.com/ru/post/86303/
    Ответ написан
    1 комментарий
  • Писать типы вначале или рассчитывать на вывод типов компилятором?

    Никакой религии в этом вопросе нет и быть не может. Есть вполне конкретные правила, когда писать типы весьма полезно.

    Если вы НЕ указываете тип, и рассчитываете на автовывод, то значит вам нужен не какой-то конкретный тип, а ТАКОЙ ЖЕ, КАК И... где-то ещё. Например, такой-же-как тип константы или такой-же-как тип возвращаемого значения функции. Иными словами, если я пишу:
    const id = findIdByName("abc");
    то мне не так важно, какой конкретно тип будет иметь id, мне важно чтобы это был тип возвращаемого значения функции "findIdByName". Для меня это приоритетно. Более того, если в какой-то момент тип возвращаемого значения у этой функции поменяется, то этот код продолжить компилироваться и, вероятно, даже РАБОТАТЬ (это зависит уже от того, что мы потом собираемся делать с id).

    Совершенно противоположная ситуация - интерфейсы. В широком смысле. Интерфейсы функций, интерфейсы классов, интерфейсы в смысле типов данных, создаваемых с помощью "interface". Особенно если эту функцию/класс/интерфейс использует много кто ещё. Тогда наоборот, вам НЕЛЬЗЯ допустить, чтобы типы параметров или тип возвращаемого значения просто так поменялись. Это вдвойне важно, если вы пишите библиотеку и речь идёт о её публичном интерфейсе - любое изменение интерфейса тогда должно подкрепляться версионированием (например, семантическим). Вы не можете просто так, тем более по недосмотру, вместо числа начать возвращать из функции строку - вы сломаете ваших клиентов, причём даже не знаете как и где.
    Ответ написан
    Комментировать
  • В чём разница в работе .then() у двух промисов?

    GlazOtca
    @GlazOtca
    Не в бровь, а в глаз!
    Представьте, что вместо консольлога вы передаете функцию fn
    Теперь, смотрите:
    1
    .then(fn())
    2
    .then(()=>{fn()})
    Понятна ошибка? В первом случае нужно было передать указатель на функцию, а мы её сразу вызвали fn(), правильнее было так:
    .then(fn)
    То же самое происходит и с консольлогом.
    Ответ написан
    1 комментарий