Ответы пользователя по тегу ООП
  • Как правильно возвращать значение из геттера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Полностью зависит от контекста. Здесь нет правильного ответа.
    Можно выделить 2 случая:
    1. Код полностью твой
    2. Код будут использовать другие пользователи

    Если случай 1, то делай как хочешь. Здесь ты главный и знаешь что менять можно, а что нет
    Если случай 2, то тут уже зависит:
    - Если возвращаешь объект, который может (и должен) быть изменен - делай изменяемым
    - Если это слепок состояния - то можно подумать над неизменяемым состоянием
    - Можно прописать это (то что нельзя изменять объект) в документации к методу геттера

    Дополнительно, если тебе так уж нужна неизменяемость, то добавляй интерфейсы. Возвращай какой-нибудь интерфейс с одними геттерами.
    Ответ написан
    Комментировать
  • В чём разница между DI, DI-контейнером и сервис-локатором?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    DI, Dependecy Injection - это сам процесс внедрения зависимостей (например, когда ты зависимости через конструктор получаешь)
    Пример:
    class User
    {
        IService _service;
        
        // DI
        User(IService service)
        {
              _service = service;
        }
    }


    DI-Container - это специальный контейнер, который может необходимую зависимость предоставить. Сначала ты в него регистрируешь все зависимости, а потом вызываешь метод по типу .getService("UserService") и он сам понимает какой сервис ты хочешь, какая у него реализация и как его создать (возможно для него нужны другие зависимости)
    Пример
    // DI-контейнер
    var container = new DependencyContainer();
    container.Register(typeof(IService), new ConcreteService());
    
    var service = container.Get<IService>();


    Сервис-локатор - это (анти) паттерн, когда, грубо говоря, у тебя есть статический класс этого DI контейнера, к которому обращаются все сервисы. Т.е. вместо того, чтобы использовать тот же самый DI или передавать интерфейс DI контейнера они напрямую обращаются к конкретному DI-контейнеру. Так делать не надо - будут трудности с тестированием, обновлением и всем сопутствующим
    Пример
    // Сервис-локатор
    class ServiceRegistry
    {
         IService Service;
         static IService GetService()
         {
               return Service;
         }
    }
    
    class User
    {
         void DoSomething()
         {
               var service = ServiceRegistry.GetService();
               service.MakeStuff();
         }
    }
    Ответ написан
    2 комментария
  • Чем отличаются свойства класса определенные в конструкторе от свойств вне конструктора JS?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В первом случае - ты объявляешь поле. Т.е. говоришь, что у класса есть такое поле
    Во втором случае - это поле инициализируешь значением. Т.е. присваиваешь какое-то значение, до этого момент там null
    Ответ написан