Задать вопрос
  • Как доработать код?

    @Vitsliputsli
    Ничего страшного, допишите еще один case и метод, и все будет нормально. Да, это нарушает принцип, но все так делают, просто хрен кто признается. Не пытайтесь здесь вкрячить какого-нибудь монстра, сложный код - это потенциальные ошибки, если возможно написать просто, так и нужно сделать.
    Принципы - они принципы, а не законы, надо следовать не букве, а смыслу. Принцип открытости и закрытости оберегает нас от ошибок и дополнительных затрат на тестирование кода, который вроде бы и так уже работает и хорошо себя зарекомендовал. Т.е. если бы у вас был один метод и вы там внутри как-то хитро разруливали работу с разными типами и при добавлении нового типа изменяли бы его - это было бы ужасно. В текущей реализации, вам нужно будет добавить новый метод (это не изменит поведение класса до вмешательства), и добавить новый путь при использовании нового типа - да, вмешательство, но оно минимально. Если умудритесь накосячить здесь, то вас уже никакие принципы не спасут.
    Если же у нас, что-то гораздо более сложное, либо класс физически недоступен для изменений, или он уже вовсю используется, а новый тип нужен только для конкретной реализации, то, пожалуйста, есть наследование. Наследуете класс, в потомке добавляете метод и заменяете метод, выполняющий перенаправление (не забывайте, что есть вызов parent). Это будет полностью соответствовать принципу.
    Но я бы больше уделил внимание тому, почему мы ориентируемся для выбора метода на внутреннее свойство, точно ли это должны быть методы, а не отдельные классы. И вполне может быть получится так, что все эти танцы с бубнами не нужны.
    Ответ написан
    Комментировать
  • Какую современную систему стейт-менеджмента лучше выбрать для React-проекта с "нуля"?

    @andrew_progs
    Тоже голосую за mobx - очень быстрый старт на начальном уровне и большие возможности если копнуть поглубже. Подходит как для мелких, так и для крупных проектов, можно сделать как один глобальный стейт, так и несколько небольших с или без взаимодействия между собой. Код получается таким как вы сделаете, mobx почти не накладывает свои ограничения как в случае с библиотеками, реализующими flux. Плюс оптимизация можно сказать из коробки. Очень советую, во всех своих проектах использую только mobx и не собираюсь ближайшее время никуда переходить. Правда пользовался до этого только Redux и Apollo
    Ответ написан
    Комментировать
  • Какой алгоритм работы с JWT token?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    При авторизации выдаются сразу оба токена, рабочий и refresh. Refresh-токен сохраняется в базе сервера вместе с идентификатором пользователя, рабочий токен хранить смысла нет.

    Срок жизни записан в самом токене, как одно из полей полезной нагрузки (payload). Прочитать это поле может и сервер и клиент. Сервер в любом случае должен контролировать срок жизни токена, клиент может это делать сам, а может просто реагировать на ответы сервера.

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

    Запрос на обновление сопровождается refresh-токеном.
    Если refresh-токен в базе помечен как уже использованный, то инактивируются (удаляются из базы) все refresh-токены данного пользователя и возвращается сообщение о необходимости повторной авторизации.
    Refresh-токен отмечается в базе как использованный .
    Если срок действия refresh-токена истёк или такого refresh-токена нет в базе сервера, то возвращается сообщение о необходимости повторной авторизации.
    Возвращается новая пара токенов.

    Где и как хранить токены на клиенте - вопрос предпочтений. Можно не хранить вообще, тогда при перезагрузке страницы пользователю придётся авторизоваться заново. Можно сохранять только refresh-токен, выполняя запрос на обновление при запуске приложения / открытии страницы.
    Ответ написан
    4 комментария
  • Какую современную систему стейт-менеджмента лучше выбрать для React-проекта с "нуля"?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Проголосую за MobX. Из того, что пробовал, это самая удобная штука. Код получается простой, без всяких ФП-шных мозговывертов
    Ответ написан
    Комментировать
  • Какую современную систему стейт-менеджмента лучше выбрать для React-проекта с "нуля"?

    Все сильно зависит от специфики вашего проекта, но по своему опыту могу сказать, что ФП хранилища в проекте с бизнес-логикой - зачастую хуже, чем ООП варианты.
    В своих проектах обычно использую стек из Mobx + tsyringe(DI). С недавних пор добавил в эту схему React-Query. Иногда бывает полезно использовать MST, если ваша бизнес логика требует каких-то сложных моделей данных с собственной логикой, а так же сложной связи между ними. В частности, MST дает немного больше возможностей для проектирования моделей данных, нежели обычные классы с Mobx.
    Поясню за ответственности:
    1. Mobx - отвечает именно за бизнес-логику frontend приложения. Не надо туда пихать геттеры данных с бэкенда, которые нужно просто визуализировать, для это есть React-Query. Поскольку Mobx базируется в первую очередь на классах, для работы с ним мы можем применять ООП и соответствующие паттерны, выстраивая интересно логику из хранилищ и сервисов прямо на frontend. Для лучшего понимания как это правильно варить, рекомендую глянуть на backend.
    2. React-Query - у них на сайте прекрасно описано, зачем они нужны, и этот инструмент в любом случае призван дополнять типичные хранилища состояний, будь то хоть Mobx, хоть Redux, хоть еще что-либо, рекомендую почитать. Отличный инструмент для работы с состоянием приложение в случае тех данных, которые просто нужно взять с бэка и отобразить.
    3. Tsyringe - для меня проверенный и неплохой инструмент для работы с DI на фронте. Это гораздо лучше, чем пробрасывать хранилища внутрь других хранилищ через конструкторы или через глобальные переменные. Аналогично с подключением в эту схему сервисов. Сразу скажу, что есть риск запутаться в конфигурациях сборщика, если используете CRA, ибо и Mobx, и Tsyringe используют в своей основе декораторы, а babel их переваривает с переменным успехом, но если разобраться, настроить можно)

    Опять таки, адепты Redux и ФП могут сказать, что я просто не умею готовить Redux. Действительно, не умею. Несколько раз пытался трогать Redux, но он не нравился ни до того, как узнал про Mobx, ни после. Верю, что разрабатывать на нем можно. Но и ухо можно чесать левой рукой через затылок. Чтобы Redux был производительным и эффективным, нужно понимать как устроены данные и как работает его реактивность. Он может неплохо подойти для менеджмента состояния каких-то простых моделей данных, например, форм. Но зачем нам центральное хранилище для форм?
    Mobx в этом плане сильно проще и при хорошей архитектуре проекта и самого приложения, джуниоры редко могут там что-то вытворить своеобразное, да и производительность там поломать куда сложнее. В общем, Mobx банально удобнее и проще, но при этом не только не ограничивает разработчиков в возможности создавать сложные и элегантные решения, а только помогает в этом.

    Вот такие мысли, надеюсь поможет)
    Ответ написан
    Комментировать
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    @Nkly777
    git chery-pick - ты забираешь комиты из одной ветки в другую, это бывает полезно когда изменения сделаные другим разработчиком в его ветке, прямо сейчас нужны тебе в твоей ветке, и что бы не писать этот код заново, ты забираешь его комит себе в ветку

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

    git merge - обычно используется когда у вас 2 и более master ветки (к примеру master и prototype) в этих ветках очень много комитов (и rebase здесь не подходит) и обчно через пару недель, maintainer репозитория наработки из prototype ветки "сливает" в master ветку по средствам этого самого git merge

    P.S. Что бы легче предствить разницу между git merge и git rebase. Представь что merge как собачка на молнии у одежды - "сшивает" комиты по дате их создания.
    В то время как git rebase как пожарная лестница - при применении твои коммиты крепится на конец родительской ветки

    git merge используйте для мержа фич и фиксов в master ветку (как и делает это Github)
    а git rebase используется для своей ветку в которой вы работаете над фичей что бы забрать последние изменения с master ветку (для этого есть очень удобная команда `git pull --rebase origin master`, аналог 3х команд (`git checkout master; git pull origin master; git checkout mybrach; git rebase master`)
    Ответ написан
    2 комментария
  • Curl не создает новый Laravel проект что делать?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    1 комментарий
  • Как сделать, чтобы скрипт не влиял на google speed?

    подключай через 5 сек после загрузки страницы
    Ответ написан
    Комментировать
  • На чем написать кроссплатформенный GUI?

    @res2001
    Developer, ex-admin
    Самое выгодное - это то что вы лучше всего знаете.
    Если важна производительность то берите С++ или другой компилируемый язык. Но это на самом деле сильно зависит от задачи, где-то и python с php вполне хватает. Сам по себе GUI не требует особой производительности (если вы обычное приложение пишите, а не игрушку на 120FPS).
    Можете юзать Qt на python и не слезать со своего любимого коня.
    Ответ написан
    Комментировать
  • Как работает веб-сервер и node js в связке? Зачем нужен Nginx?

    SagePtr
    @SagePtr
    Еда - это святое
    Я nginx юзаю по той причине, что на одном сервере крутятся несколько приложений, с его помощью удобно объединить их все "под одной крышей", не арендуя для каждого из них отдельный инстанс. В ситуации с дефицитом IPv4-адресов это как-то расточительно, а так - каждое приложение слушает отдельный порт, nginx слушает 80 и 443 и проксирует все запросы по имени домена на них.
    Да и гораздо проще всю работу по обеспечению общения клиентов с сервером скинуть на nginx - не надо в каждом приложении отдельно делать логирование запросов, работу по получению и продлению SSL-сертификатов, можно сосредоточиться на решении конкретной проблемы.
    Ответ написан
    Комментировать
  • Как работает веб-сервер и node js в связке? Зачем нужен Nginx?

    @darkshy
    Самый простой ответ - зачем заново изобретать велосипед?
    По факту, nodejs тоже не нужен, ведь можно все сделать на assembler
    Ответ написан
    1 комментарий
  • Следует ли ограничивать CSS стили с помощью id предка?

    cannibal_corpse
    @cannibal_corpse
    Верстальщик руками
    То, какие стили вы пишете селектору влияет на перфоманс, а то какому селектору - не влияет.
    Если волнует читаемость - используйте препроцессоры и методологию.
    Не нравится БЭМ? Посмотрите в сторону AtomicCSS (tailwind и прочее)
    Ответ написан
    Комментировать
  • Следует ли ограничивать CSS стили с помощью id предка?

    ThunderCat
    @ThunderCat Куратор тега CSS
    {PHP, MySql, HTML, JS, CSS} developer
    Существенную разницу в скорости рендера вы сможете заметить разве что на пентиум 200 без ммх. В остальных случаях это последнее что нужно оптимизировать, так как больше влияет глубина вложенности дом дерева, нежели как будут заданы те или иные стили.
    Ответ написан
    1 комментарий
  • Как повысить базовые знаний архитектуры?

    @Kirill-Gorelov
    С ума с IT
    Похожий вопрос, на который я так же отвечал
    Где найти книги или курсы по PHP, где даётся проектирование приложений с учётом ООП?

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

    Тут понимаешь, нету как такового дельного совета, качай скилы, пока есть возможность. И на удаленку в Москву или еще куда.

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

    Потом и девчата появятся и деньги, и все-все что нужно......

    Извини за разброс мыслей.... мне еще работать сейчас....
    Ответ написан
    Комментировать
  • Змея не хочет вытаскивать словарь из файла *.txt, как ей помочь?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    теоретически может вытащить словарь

    А практически он читает строку.

    Либо через json
    import json
    
    with open('db.txt', 'r', encoding='utf-8') as db:
        db_dict = json.load(db)


    Либо через literal_eval, хотя json, конечно, лучше
    Ответ написан
    2 комментария
  • Каким образом в Set попали не уникальные значения?

    Есть разница между буквальной строкой "habr", примитивом String("habr") и объектом new String("habr"). В последнем случае typeof === "object" и происходят чудеса:
    const x = new String("habr");
    const y = new String("habr");
    x === y // false

    Соответственно и Set() сможет хранить экземпляры объектов, которые только при приведении к примитиву дадут одинаковые строки, а так суть есть разные инстансы. Может, это ваш случай?
    Ответ написан
    5 комментариев
  • Как изменить Class.prototype в JS6?

    MvcBox
    @MvcBox
    Software Engineer [C/C++/JS(for Node.js)/etc]
    Потому, что:
    function Rabbit() {}
    console.log(Object.getOwnPropertyDescriptor(Rabbit, 'prototype'));  // { value: {}, writable: true, enumerable: false, configurable: false }

    class Rabbit {}
    console.log(Object.getOwnPropertyDescriptor(Rabbit, 'prototype')); // { value: {}, writable: false, enumerable: false, configurable: false }

    Найдите разницу :)

    А если бы использовали
    'use strict';
    то сразу бы увидели в чем проблема, так как при попытке выполнить
    Rabbit.prototype = {};
    получили бы ошибку:
    TypeError: Cannot assign to read only property 'prototype' of function 'class Rabbit {}'
    Ответ написан
    1 комментарий
  • Курс или полный гайдлайн по git?

    Griboks
    @Griboks
    Ответ написан
    Комментировать