• Почему у интерфейса по ссылке не видно его методов?

    Если не вдаваться в подробности, то - в Go интерфейсы это указатели, и в приведённом примере *Repo это указатель на указатель, поэтому и методов нет.

    Так что для хранения в структуре указателя а не значения будет достаточно указать в качестве типа просто интерфейс Repo, и не указатель на него.
    Ответ написан
    Комментировать
  • Как использовать строку в качестве названия функции в GoLang?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Добро пожаловать в мир компилируемых языков программирования и статической типизации, здесь такое не нужно, считается очень плохой практикой и достижимо только через чёрные ходы, вроде рефлексии, что снижает производительность и безопасность кода, а также усложняет его сопровождение.
    Ответ написан
    Комментировать
  • Как решить проблему Rich Model в DDD?

    vhood
    @vhood
    Не забывайте отмечать решения
    бизнес склонен изменять поведение системы
    Хороший архитектор склонен пересматривать архитектуру

    есть модель пользователя, которая включает в себя объект скидки
    Судя по тексту ниже, скидки стоит отделить от пользователей

    подписки находятся в отдельном микросервисе, имеют свою БД и никак не связаны с сущностью пользователь
    Замечательно, значит скидки могут быть в отдельном микросервисе, иметь свою БД и иметь только идентификатор пользователя и идентификатор подписки. Пользователи же, скорее всего, будут в сервисе авторизации
    Ответ написан
    Комментировать
  • Как решить проблему Rich Model в DDD?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Отвечу на вопрос так: ядро DDD - представление бизнес-логики в коде. Добавляются промокоды, уровни скидок, подписки и т.д. - все это меняет бизнес-логику. Это нельзя просто просто взять и убрать, т.к. грубо говоря, под эти дела завели отдельные документы (юридически оформили уровни скидок, промокоды и т.д.). Соответственно и твоя доменная сущность должна измениться, так как она - отражение реального мира, а реальный мир изменился.

    В секции "Вопрос: ..." у тебя 3 вопроса, но смысл у них одинаковый: как правильно писать код так, чтобы было легко добавлять изменения?
    На абстрактный вопрос отвечу абстрактно - зависит. Для каждого случая надо искать свое решение, нет единого правильного, в любом случае тебе будет нужно изменять код, чтобы соответствовать условиям реального мира.

    P.S. сделаю замечание по поводу этой фразы:

    Также, подписки находятся в отдельном микросервисе, имеют свою БД и никак не связаны с сущностью пользователь.


    Тут явно это не говорится, но мне кажется, что ты разделяешь микросервисы по сущностям. Это плохой подход, так как ведет к головным болям, которые приводят к подобному (заданному) вопросу. Запомни: микросервисы надо разделять по бизнес-задачам, а не сущностям (иначе получаются вот такие crud сервисы, знающие друг о друге).
    Начни с этой статьи, и копай дальше. Иногда вопросы кода надо решать на уровне архитектуры системы.
    Ответ написан
    Комментировать
  • Корректно ли использовать глобальные зависимости с конфигами и логгером?

    @galliard
    Самая правильная архетектура - это та, которую легко поддерживать. Если внедрение логгера тебя утомляет, а глобальная функция - нет, то используй глобальную функцию.
    Ответ написан
    Комментировать
  • Как передать ивент из одного компонента в другой?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Если говорить именно о передаче событий, то гуглите, что такое шина событий. Но вообще, стоит подумать, а правда ли оно вам надо. Возможно, ваша задача может быть решена иначе:

    Первый компонент - внутри emit, снаружи обработчик события.

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

    @iljaGolubev
    Не совсем понятно, что в этих js файлах, когда они должны выполниться, доступны ли по url в браузере, как "собирается" приложение...

    если url {domain}/assets/js/{file}.js доступен, можно подключать в index.html

    если нет,
    Можно так webpack dynamic-expressions-in-import
    или так vite dynamic-import
    Ответ написан
    Комментировать
  • Как замокать зависимость в pytest?

    i229194964
    @i229194964
    Веб разработчик
    import pytest
    from unittest import mock
    
    class B:
        def __init__(self, db_connection):
            self.__db_connection = db_connection
    
    class A:
        def __init__(self, b: B):
            self.__b = b
    
        def do_something(self) -> None:
            pass
    
    @pytest.fixture(scope="module")
    def mock_b(mocker):
        mocker.patch('path.to.B')  # Здесь 'path.to.B' - это путь к классу B, который нужно замокать
        return B(mock.MagicMock())  # Возвращаем экземпляр класса B с мок-объектом для db_connection
    Ответ написан
    Комментировать
  • Как переслать сообщения из одной очереди в другую?

    @yarkin
    1) Если "не получается обработать" это котролируемый процесс, то можно использовать команды basic.reject или basic.nack с флагом requeue=true, чтобы сообщение попало обратно в рабочую очередь.
    2) Можно использовать тот же механизм DLX на очереди с ошибками вместе, например, с TTL. Сообщение попадает в очередь ошибок, лежит там, папример, 10 минут, а потом обратно перекидывается в рабочую очередь.
    Ответ написан
    Комментировать
  • Какие существуют источники информации с хорошими практиками advanced уровня по Go?

    @dcaraxes
    meme engineer
    На самом деле много хороих ресурсов есть. Из них отмечу следующие:
    YouTube -канал Николая Тузова https://www.youtube.com/@nikolay_tuzov, много качественно разобранных тем про устройство структур данных языка, GoGetPodcast, в которых частенько фигурирует Даниил Подольский, автор статьи https://habr.com/ru/company/oleg-bunin/blog/521582/

    Книга Михаила Цукалоса - https://www.piter.com/collection/all/product/golan...

    Style-guide с best practices от Uber - https://github.com/uber-go/guide
    Ответ написан
    Комментировать
  • Как сохранить объект на весь срок жизни приложения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Безотносительно фреймворков. В любом приложении есть точка входа. Enty point. Или еще ее называет main - функция. Вот добавь туда конструирование объекта объекта и все.
    Ответ написан
    Комментировать
  • Как правильно создать глобальный контейнер?

    @GofMan33333
    Вы можете создать класс, который будет хранить состояние ресурсов и предоставлять к нему доступ через свойства или методы. Вам может потребоваться реализовать синглтон-паттерн, чтобы обеспечить, что экземпляр этого класса существует только в одном экземпляре на всем протяжении существования приложения. Также вам может потребоваться защитить состояние ресурсов от неправильного использования, реализовав некоторые методы для доступа к ресурсам.

    В качестве примера:

    from threading import Lock
    
    class ResourceContainer:
        _instance = None
        _lock = Lock()
    
        def __new__(cls):
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
            return cls._instance
    
        def __init__(self):
            self._db_connection = None
            self._message_broker_connection = None
            self._config = {}
    
        def get_db_connection(self):
            return self._db_connection
    
        def set_db_connection(self, connection):
            self._db_connection = connection
    
        def get_message_broker_connection(self):
            return self._message_broker_connection
    
        def set_message_broker_connection(self, connection):
            self._message_broker_connection = connection
    
        def get_config(self):
            return self._config
    
        def set_config(self, config):
            self._config = config


    В этом примере создается класс ResourceContainer, который реализует синглтон-паттерн с помощью метода __new__ и мьютекса _lock. Он хранит состояние ресурсов (подключение к БД, подключение к брокеру сообщений, конфигурация) и предоставляет к ним доступ через методы get_* и set_*.

    Другие модули или функции могут получить доступ к экземпляру ResourceContainer так:

    def foo():
        container = ResourceContainer()
        db_conn = container.get_db_connection()
        # use db_conn
    
    def bar():
        container = ResourceContainer()
        config = container.get_config()
        # use config


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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да можно. Но обычно объединение идет по модулям приложения. Это упрощает процесс релиза. Например если меняется что-то в модуле работы с физ-лицами - то в релиз должен пойти в лучшем случае 1 артифакт. В худшем случае тебе придется релизить сразу все модули а это хлопотно.
    Ответ написан
    Комментировать
  • Нормально ли объединять сущности по паттернам?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    По домену, внутри домена по паттернам.
    Shop
    -- Factory
    -- -- ...
    -- Proxy
    -- -- ...
    Messenger
    -- Factory
    -- -- ...


    Хотя, конечно есть паттерны которые лежат вне доменной области, например, Адаптер. Он должен находиться на отдельном слое.
    Ответ написан
    7 комментариев
  • Нормально ли создавать множество очередей на один и тот же ивент?

    @yarkin
    Да, нормально, очередь запускается для потребителя (пула потребителей). Для публикующей стороны создаются обменники.
    Ответ написан
    Комментировать
  • Почему анонимная функция не замыкается на лексическое окружения метода класса?

    ddv88
    @ddv88
    Binance Futures
    Вкратце.
    downloadAll (links) {
            let _this = this;
            for (const link of links) {
                setTimeout(function() { _this.printer(link) }, 1000); 
            }
    Ответ написан
    Комментировать
  • Почему анонимная функция не замыкается на лексическое окружения метода класса?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вы не нашли, видимо, потому, что намудрили с терминологией.
    А так в любом учебнике написано, что в «обычной» функции this резолвится на этапе вызова, а к стрелочной прибивается гвоздями из контекста на этапе её определения.
    В общем: this ведёт себя особым образом и на него принципы замыкания не распространяются.
    Ответ написан
    5 комментариев
  • Зачем программисту работать на кого-то?

    В жизни всё просто... мечта, ресурсы, корабль, плывешь.

    0) Нет мечты - не трать время, читай пункт 4
    1) Есть мечта, нет корабля, есть ресурсы - покупаешь, строишь, набираешь команду.
    2) Ресурсы ограничены - гребешь на лодке сам. Ресурсы пополняешь из халявных источников или подфрилансиваешь по-пути. Заражаешь мечтой других, желательно с ресурсами... но и дополнительные руки в лодке тоже лишними не будут ))
    3) Ресурсов нет или грести на лодке медленно и долго... устраиваешься работать на корабль, который везёт к мечте кого-то другого, но примерно в том же направлении. Заодно набираешься опыта, смотришь как всё устроено, копишь ресурсы, ищешь единомышленников. Как только курсы кардинально разошлись - переходишь на другой. Если скопились достаточные ресурсы, переходишь на пункт 1. Если попутные корабли закончились, переходишь на пункт 2.

    4) Нет мечты... плаваешь в свое удовольствие, куда везут. Заработал - отложил на будущую мечту или старость, остальное спустил в порту... или спустил всё и поплыл дальше )))
    Ответ написан
    Комментировать
  • Как определить, в какой ситуации оптимальнее использовать подзапросы, а не соединения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут нечего думать. Смотрите что показывает explain plan и меряйте время отклика.

    SQL как язык - это чистая теория. То есть известен результат но неизвестно каким способом конкретная dbms его достигает. Операция explain будет зависеть от выбора dbms (Oracle, Postgres e.t.c) и будет по разному показывать реализацию алгоритма выборки для каждого select.

    Спрогнозировать как будет выглядеть план сложно. Даже разные версии Oracle к примеру могут показать разный план на одном тексте запроса.
    Ответ написан
    Комментировать