Ответы пользователя по тегу Паттерны проектирования
  • Как создать абстрактную фабрику, не ссылаясь на реализацию?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В приложении, которое использует Dependency Injection можно выделить 2 "области":
    - Composition Root
    - Остальное приложение

    Composition Root - это место в котором собираются все зависимости воедино. О всех реализациях зависимостей должен знать только он.
    Остальное приложение - это (тафтология) все остальное приложение. Они используют только интерфейсы и другие абстрации.

    Обычно Composition Root - это входная точка приложения. В нем создается эта самая ServiceFactoryImpl (стандартные реализации, из конфигурации могут быть прочитаны флаги, создан в зависимости от платформы и т.д.), а затем как интерфейс IServiceFactory, передается в остальные места.

    Т.е. в коде это будет как-то так
    #include <IServiceFactory.h>
    
    class Sample {
    private:
        IServiceFactory _factory;
    public:
        Sample(IServiceFactory factory): _factory(factory) { }
        DoSomething() { 
            auto service = _factory.CreateService();
            service.MakeStuff();
        }
    }
    
    int main() {
        auto factory = ServiceFactoryImpl(); // Читаем конфигурацию, параметры ОС и др.
        auto sample = Sample(factory);
        sample.DoSomething();
    }
    Ответ написан
    1 комментарий
  • Насколько разумно при композиции позволять компоненту управлять родителем?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    С точки зрения ЯП/Рантайма, это приведет к кольцевой зависимости, а это порождает различные баги (например, освобождение памяти), поэтому так лучше не делать.
    С точки зрения проектирования, Car не должен знать о Driver - это Driver должен знать о Car, т.к. он ей управляет. Здесь, по факту, водитель - это контроллер какого-то объекта.
    Ответ написан
    2 комментария
  • Как реализовать базовый класс для динамического создания подклассов без вызова рекурсии в Python?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Во-первых, этот паттерн называется абстрактная фабрика.
    Во-вторых, __new__ используется для выделения памяти, так что не надо его перегружать
    Ответ написан
  • Как типизировать обмен данными между микросервисами?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    gRPC

    У него есть свой собственный язык для описания типов. Для многих ЯП есть свои генераторы типов.
    Также богатая библиотека.

    Общий файл с определением структур можешь хранить в отдельном репозитории. А другие репозитории будут на него ссылаться (гит такое умеет)
    Ответ написан
  • В чем разница между понятиями Anti-Corruption Layer и паттерном Adapter?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Anti-Corruption Layer - это понятие из DDD. Оно обозначает слой (это может быть отдельный сервис или функция валидации), который проверяет запрос на корректность.

    Адаптер - это больше паттерн проектирования, который, грубо говоря, трансформирует запрос из одного формата в другой. Например, из XML в JSON, или если стоит прокси, то превращает `X-Redirected-From` в `Redirected-From` в HTTP заголовках.

    Адаптер может выполнять роль Anti-Corruption Layer и наоборот
    Ответ написан
    Комментировать
  • Правильно ли я реализую абстрактный класс?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    На мой взгляд
    базовый функционал
    надо заменить на
    общий функционал
    и
    определенная часть функционала
    на
    конкретная реализация функционала
    , т.к. здесь скорее всего пример Шаблонного метода.
    В общем случае, догадка верна - абстрактный класс может использоваться в качестве базовой реализации на основании которой создаются другие классы
    Ответ написан
    Комментировать