Внедрение зависимостей в контексте двух простых классов - PullRequest
0 голосов
/ 23 января 2019

У меня были проблемы с захватом инъекций зависимостей (или позвольте мне сказать, что это полезно).Поэтому я решил написать два простых кода: один без DI, а другой с ним.

Итак, у меня есть класс A

public class A {
    public void foo(){
        B b = new B();
        b.fooB();
    }
}

, как видно выше. A зависит от B, B это

public class B {
    public void fooB(){
        Log.e("s", "y");
    }
}

, и мы можем использовать A как

public void do(){
    A a = new A();
    a.foo();
}

Но говорят, что A не следует просто инициализировать B, потому что это зависит от него, однако мы должны иметьсервис, который имеет какие-то контракты между двумя классами.Например, если я ошибаюсь, пожалуйста, дайте мне знать

Так что давайте иметь интерфейс BService

public interface BService {
    void fooB();
}

И B становится DiB

public class DiB implements BService {
    @Override
    public void fooB(){
        Log.e("s", "y");
    }
}

И A становится DiA

public class DiA {
    BService bService;

    public DiA(BService bService){
        this.bService = bService;
    }

    public void foo(){
        bService.fooB();
    }
}

и мы можем использовать A как

public void dIdo(){
        BService service = new diB();
        diA a = new diA(service);
        a.foo();
}

Итак, я прочитал о преимуществах DI:

  • Проверяемые коды: потому что я могу на самом деле протестировать обакоды в JUnit (я не хочу публиковать здесь тест, чтобы избежать длинных вопросов)
  • Разделение: сказано, что если класс B изменяется, то на A это не должно повлиять, и я не могу понять это, потому что если я изменю fooB() в классе B на fooB2 (), мне придется изменить метод переопределения в BService, что, в свою очередь, означает, что мне придется изменить его в классе A

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

1 Ответ

0 голосов
/ 23 января 2019

на первой ноте, я не согласен с вашим "сказано, что A не должен просто инициализировать B, потому что это зависит от него" .. потому что тот же код работал для меня в .NET

    class Program
{
    static void Main(string[] args)
    {
        A aobj = new A();
        aobj.foo();
    }
}
public class A {
    public void foo()
    {
        B bojb = new B();
        bojb.fooB();
        Console.WriteLine("From A.foo() ..");
        Console.ReadLine();
    }

}
public class B {
    public void fooB()
    {
        Console.WriteLine("From B.fooB() ..");
        Console.ReadLine();
    }
}

Кроме этого, догадайтесь, что вы запутались в основах внедрения зависимостей. Само слово зависимости передает источник внедрения для любого класса.

  1. Во-первых, зависимость может быть идентифицирована во время экземпляра класса, а конструктор является первым типом.
  2. Во-вторых, после того, как объект будет создан, перед тем, как мы вызовем какой-либо метод, будут некоторые назначения для свойств или открытых полей. Хотя это и необязательно, но последовательность как таковая. Итак, второй тип.
  3. Наконец, метод инъекций.

Рекомендую прочитать больше, прежде чем делать дело.

...