• Как не нарушать границы компонентов при подходе package-by-feature?

    DollyPapper
    @DollyPapper
    Ну вызывать на прямую я бы не стал, иначе зачем вы это все делали. Нам от других слоев и пакетов обычно нужны некие данные. Можно передавать DTO между пакетами. Т.е. за получение данных отвечает так же пакет, и другой пакет эти данные использует.
    Ответ написан
    Комментировать
  • Консистентность данных в микросервисах?

    DollyPapper
    @DollyPapper
    Оттого и вопрос - можно ли обойтись без всего этого, сохранив плюсы реализации транзакционных механизмов РСУБД на микросервисах?

    Паттерны распред. транзакций от того и появились, что нельзя. У вас физически несколько разных БД на разных хостах. Транзакция это свойство систем хранения данных, когда мы атомарно фиксируем некоторое состояние системы в БД. В распределенной системе - в нескольких БД. Сайд эффекты типа отправки СМС не имеют никакого отношения к транзакциям. Либо отправляйте СМС после полной фиксации транзакции, либо как вариант используйте компенсирующую СМС, типа - "Извините мы ошиблись на самом деле мы не сделали того о чем мы писали в прошлой смс", но это уже в порядке бреда.
    Ответ написан
  • Как можно поднять сервер внутри локальной сети? Что для этого выбрать?

    DollyPapper
    @DollyPapper
    А что за ответ вы услышать хотите? Остальные вопросы это какие? Что не получилось? Конкретной информации по какому вопросы вы не нашли? Вы вопрос без вопроса задали. Напишите ваши "остальные вопросы" и тогда вам смогут подсказать где найти "конкретную информацию".
    Ответ написан
    Комментировать
  • Что такое Docker простыми словами?

    DollyPapper
    @DollyPapper
    Грубо говоря докер это изолированный от системы некий процесс. Можно считать это некий chroot для процесса.
    Представьте себе операционную систему в которой есть некоторое пространство из ресурсов. Память, диск, системное время, сеть, сетевые интерфейсы. И в этом пространстве находятся процессы которые используют эти ресурсы. А теперь представьте что в этой большой системе мы откусили кусок ресурсов и некоторый процесс, например БД изолировали от всей остальной системы. Докер это своеобразная матрица (всмысле как в фильме матрица) для процесса некоторого.
    Ответ написан
    Комментировать
  • Глобальность в JavaScript?

    DollyPapper
    @DollyPapper
    Что такое глоаблаьные объекты и как они работают?

    Глобальные обьекты это обьекты обьявленные в глобальной области видимости в программе и доступны из любого места программы.
    И что-ли все переменные это прсотос свойства?

    Нет. Переменные это переменные, свойства это свойства.
    let a = {f: 10}
    a это переменная, f это свойство обьекта.
    И я почитал про создание перменной без исопльзования клчевых слов let/var/const.

    Это круто, держите нас в курсе.
    Какая вся картина ооп

    Большая и противоречивая. Конкретней задавайте вопрос.
    Ответ написан
    Комментировать
  • Как проверить наличие пользователя в БД?

    DollyPapper
    @DollyPapper
    У вас какая-то странная логика получилась.
    _, err := db.Query("SELECT chat_id FROM telegram WHERE chat_id=?", chatID)

    если этот запрос отработает без ошибок (в т.ч. если результат будет не пустой), то err будет = nil, следовательно выполнится блок else и создастся пользователь. Т.е. буквально, если уже есть такой пользователь, то вы создаете нового.
    Вам нужно что-то типа
    _, err := db.Query("SELECT chat_id FROM telegram WHERE chat_id=?", chatID)
    if errors.Is(err, sql.ErrNoRows) {
    // создаем пользователя
    } else {
    fmt.Println("Пользователь уже есть в базе данных")
    }
    Ответ написан
  • Какой гайд поможет делать авторизацию на сайте golang?

    DollyPapper
    @DollyPapper
    Во первых аутентификацию. Авторизация это про проверку прав.
    Если без REST API, то классика это принимать через POST запрос данные с формы.
    Вот статья
    Если кратко:
    Делаете ручку /signin, которая проверяет пароль присланный пользователем с хешем паролей в базе данных (ну или где вы храните данные)
    Если всё ок, создаете сессию, сохраняете сессию где нибудь в хранилище (опять же это может быть база данных, может быть ин мемори, есть библиотеки для этого, погуглите, да хоть в памяти приложения в мапе храните)
    Далее ID сессии записываете в куки и посылаете ответ пользователю в заголовком Set-Cookie sessid="session_id", где session_id это айди который вы раньше сгенерили.
    А далее пользователь ходит на ваш сайт, и какая нибудь мидлвара берет из запроса куки, берете оттуда id сессии, ищет этот айди в хранилище. Если нашла, то пропускает запрос дальше, если нет - 401 Unauthorized.
    Ну в статье вобщем всё подробно описано.
    Ответ написан
    Комментировать
  • Что эффективней, чтение из файла или массив?

    DollyPapper
    @DollyPapper
    Спорный вопрос. Смотря что мы с данными хотим делать и как часто. Есть возьмем к примеру базы данных, и массив и захотим поискать данные, то вероятно файл (бд) окажется даже выгодней, поскольку поиск в массиве будет занимать O(n) а поиск на диске O(logn) при условии что ищем мы по индексу
    Ответ написан
    3 комментария
  • Как правильно распределять ответственность между классами?

    DollyPapper
    @DollyPapper
    Про репозиторий можно почитать например тут
    Ответ написан
    Комментировать
  • Как правильно устанавливать соединение с БД?

    DollyPapper
    @DollyPapper
    Если вы будете пул создавать каждый раз при запросе в каждой функции, то какой тогда смысл от пула? Пул в go это своего рода синглтон, он создается один раз и далее распространяется по всему приложению. Очевидно, что если каждый раз будет новый инстанс пула, то никакой защиты от переполнения коннектов мы не получим. Итого: пул создается один раз, далее во всех остальные части программы он передается как вам удобно, через DI напрямую в фукнцию, в конструктор обьекта или еще как.
    Ответ написан
    Комментировать
  • В каких случаях использовать импортируемые поля в структуре go?

    DollyPapper
    @DollyPapper
    Смысл делать поля экспортируемыми есть в очень редких случаях. Один из таких случаев например маршалинг (json/yaml/etc), без экспортируемых полей библиотека просто не сможет засеттить значение в поле. Другие дело обстоит с сущностями (обьектами/структурами вашей предметной области). В случае сущности эта самая сущность должна скрывать свое внутренее состояние и не позволять изменять его извне. Приведу банальный пример:
    type User struct {
        Name string
        Age    int
    }

    И сеттеры геттеры к ней.

    Далее допустим есть бизнес правило, что у вас можно регистрировать пользователей строго старше 18 лет. Как вы будете контролировать, что нельзя назначить возраст < 18 лет? Да никак, с экспортируемыми полями это невозможно. Почитать на эту тему можно погуглив про инкапсуляцию и information hiding. В данном конкретном случае геттеры и сеттеры наверное будут более подходящими. В сеттерах можно прописать условие, что возраст должен быть строго больше 18 лет. Однако может быть и такой случай, что сущность не должна вообще более изменяться после создания. Для этого в ООП языках, чтобы задать первоначальные значения существуют конструкторы. В го нет конструкторов, т.к. нет понятия класса, но нам ни что не мешает создать обычную функцию порождающую обьект юзера, и засеттить значения возраста и имени в этой фкнции.
    Ответ написан
    Комментировать
  • Чем отличается наследование в ооп от протипированного наследования?

    DollyPapper
    @DollyPapper
    При классовом подходе у вас есть класс и его экземпляр. Состав полей и цепочка наследования при этом задана жестко во время написания. В прототипной модели у вас нет классов, есть обьекты прототипы которые могут динамически мутировать по ходу выполнения программы. Мутация означает, что мы можем изменять не только значения атрибутов обьекта, но и сам состав этих атрибутов.
    Ответ написан
    Комментировать
  • Можно ли изменять неимпортируемые поля структуры в других пакетах программы?

    DollyPapper
    @DollyPapper
    Возможно уже неактуально, но.
    Не следует строго следовать мантрам про "глобальные переменные это плохо". Иногда это необходимо. Делаете из своего кеша синглтон (как его правильно делать в го можно посмотреть в инете). Переменная инстанс самого обьекта кэша будет лежать на уровне пакета кэша и будет неэкспортируемой. А сама New будет возвращать либо кэш, если он уже ранее был создан, либо тот инстанс который был создан. Так например pgxpool устроен ЕМНИП.
    Ответ написан
    Комментировать
  • Как стать специалистом по информационной безопасности (кибербезопасность)?

    DollyPapper
    @DollyPapper
    Ну отвечу баяном - для начала учимся гуглить и гуглим свой же вопрос. Если твой вопрос в поиске на данном сайте ввести, то найдется овер дофига ответов...
    Ответ написан
    Комментировать
  • Как сделать видимость в 2-х разных пакетах структуры из 3-го?

    DollyPapper
    @DollyPapper
    А зачем вы вообще сделали алиас на тип p3.SM? Возвращайте просто p3.SM из p1 somefunc и принимайте p3.SM в p2 anotherfunc. Ну либо если вам зачем то прям понадобился этот алиас, то приведите тип anotherfunc(p3.SM(SM)).
    UPD: в Go нет динамической диспетчеризации. То что вы пытаетесь сделать - создать подтип с помощью алиаса. В Go это не прокатит.
    Ответ написан
  • Брокер сообщений простыми словами, правильно ли я понимаю?

    DollyPapper
    @DollyPapper
    А в каком предложении своего вопроса вы собственно описали концепцию? Вы описали некоторые свойства брокеров. Основная концепция брокеров это быть звеном передающим сообщения в распределенном окружении. Это не обязательно микросервисы, это могут быть вполне себе монолиты.
    а преимущество в основном то, что все сообщения проходят через одно место и тебе не надо париться, чтобы сервисы знали на каком порту они развёрнуты чтобы передавать сообщения напрямую друг другу

    Вместо того чтобы сервисы знали друг о друге они будут должны знать где находится брокер. Шило на мыло.
    Основное преимущество в том, что брокер гарантирует доставку.
    Ответ написан
    Комментировать
  • Как HR реагируют на "NDA" в резюме вместо места работы?

    DollyPapper
    @DollyPapper
    Т.е. в резюме у вас будет NDА, а в трудовой название компании? Што?
    Мне прям интересно, что это за компания которая не хочет чтобы ее в резюме упоминали. Гидра какая нибудь :)
    Ответ написан
    1 комментарий
  • Зачем именно нужны связи в бд?

    DollyPapper
    @DollyPapper
    Вы перепутали связи и ограничения в БД. Неформально связи как раз и закрепляются ограничениями типа внешний ключ, но в целом связи это вопрос формализации моделируемого мира в контексте вашей БД. У вас уже есть связь между сообщинем и пользователем. Тот факт что у вас в сообщении имеется колонка userid как раз и есть факт связи, что две сущности: сообщения и пользователи связаны. Однако эти связи принято подкреплять на уровне самой БД теми самыми огланичениями. как указал mayton2019 я могу в вашей системе в теории создать сообщение которое не принадлежит ни одному пользователю в вашей базе. Рассматривайте ограничения как штуки которые не позволяют нарушить логику ваших связей.
    Еще почитать на тему проектирования связей
    Ответ написан
    Комментировать
  • Стоит ли переписывать старый проект на .NET6 (на голом энтузиазме)?

    DollyPapper
    @DollyPapper
    Чистая архитектура это не серебряная пуля, в чем профит то? Какие ваши проблемы она решит? Выглядит так, что вы устали работать с легаси говнищем и хотете на текущее место работы привнести новые технологии. Если это так, то это не работает. Поверьте, я проверял. Лучше смените проект.
    Ради опыта напишите полезный пет проект, или опять же - смените место работы. Загнивание на работе с технологиями которые вам не нравятся это путь в выгорание. Опять же поверьте, я проверял.
    Ответ написан
    2 комментария