의존 주입과 제어 반전에 대한 약간의 이해

6859 단어
1.1 IoC란 무엇인가
Ioc-Inversion of Control, 즉'반전 제어'는 어떤 기술이 아니라 디자인 사상이다.자바 개발에서 Ioc는 당신이 디자인한 대상을 용기 제어에 맡기는 것을 의미하며, 전통적인 대상 내부에서 직접 제어하는 것이 아니라.Ioc를 어떻게 이해합니까?Ioc를 잘 이해하는 관건은'누가 누구를 제어하고 무엇을 제어하며 왜 반전(반전이 있으면 정전이 있어야 한다), 어떤 방면이 반전되었는가'를 명확히 하는 것이다. ●누가 누구를 제어하고 무엇을 제어하는지: 전통적인 자바SE 프로그램 설계, 우리는 대상 내부에서 new를 통해 직접 대상을 만들고 프로그램이 주동적으로 의존 대상을 만든다.IoC는 이런 대상을 만드는 전문적인 용기가 있는데 그것이 바로 Ioc용기가 대상의 창설을 제어하는 것이다.누가 누구를 통제합니까?당연히 IoC 용기가 대상을 제어한다.뭘 컨트롤해?그것은 외부 자원 획득을 주로 통제하는 것이다. (대상뿐만 아니라 파일 등도 포함한다.)● 왜 반전인지, 어떤 면이 반전되었는지: 반전이 있으면 정전이 있다. 전통적인 응용 프로그램은 우리가 대상에서 자발적으로 제어하여 의존 대상, 즉 정전을 직접 얻는다.반전은 용기가 의존 대상을 만들고 주입하는 것을 돕는다.왜 반전일까?용기가 우리를 도와 의존 대상을 찾고 주입하기 때문에 대상은 수동적으로 의존 대상을 받아들일 뿐이기 때문에 반전이다.어떤 면에서 반전이 됐나요?의존 대상의 획득이 반전되었다.
1.2 IoC가 할 수 있는 일
IoC는 기술이 아니라 하나의 사상이며 대상을 대상으로 프로그래밍하는 중요한 법칙이다. 이것은 우리가 어떻게 느슨하고 결합되며 더욱 우수한 프로그램을 설계하는지 지도할 수 있다.전통적인 응용 프로그램은 우리가 클래스 내부에서 의존 대상을 주동적으로 만들어서 클래스와 클래스 간의 높은 결합을 초래하고 테스트하기 어렵다.IoC 용기가 생긴 후에 창설과 검색 의존 대상의 제어권을 용기에 맡기고 용기에서 조합 대상을 주입하기 때문에 대상과 대상 간에 느슨한 결합이 있기 때문에 테스트도 편리하고 기능 복용에 유리하며 더욱 중요한 것은 프로그램의 전체 체계 구조를 매우 유연하게 한다.사실 IoC가 프로그래밍에 가져온 가장 큰 변화는 코드가 아니라 사상적으로'주종환위'의 변화가 생겼다.응용 프로그램은 원래 최고이기 때문에 어떤 자원을 얻으려면 주동적으로 출격하지만 IoC/DI 사상에서 응용 프로그램은 수동적으로 변하고 수동적으로 IoC 용기를 기다리며 필요한 자원을 만들고 주입한다.IoC는 대상을 대상으로 하는 디자인의 법칙 중 하나인 할리우드의 법칙을 잘 나타냈다.'우리를 찾지 마. 우리가 널 찾을게'.즉 IoC 용기방의 대상이 상응하는 의존 대상을 찾아 주입하는 것이지 대상이 주동적으로 찾는 것이 아니다.
1.3, IoC 및 DI
DI - Dependency Injection, 즉 '의존 주입': 구성 요소 간의 의존 관계는 용기가 운행 기간에 결정되며, 이미지는 용기가 동적으로 어떤 의존 관계를 구성 요소에 주입하는 것을 말한다.주입에 의존하는 목적은 소프트웨어 시스템에 더 많은 기능을 가져오는 것이 아니라 구성 요소의 재사용 빈도를 높이고 시스템에 유연하고 확장 가능한 플랫폼을 구축하는 것이다.주입 메커니즘에 의존함으로써 우리는 간단한 설정을 통해 어떠한 코드도 필요 없이 목표에 필요한 자원을 지정하고 자신의 업무 논리를 완성할 수 있을 뿐 구체적인 자원이 어디에서 오고 누가 실현하는지에 신경 쓸 필요가 없다.DI를 이해하는 관건은'누가 누구에게 의존하고 왜 의존해야 하는지, 누가 누구에게 주입하고 무엇을 주입했는가'이다. ● 누가 누구에게 의존하는지 깊이 있게 분석한다. 당연히 응용 프로그램이 IoC 용기에 의존한다.● 왜 의존해야 하는가: 응용 프로그램은 대상이 필요로 하는 외부 자원을 제공하기 위해 IoC 용기를 필요로 한다.● 누가 누구를 주입하는가: IoC 용기가 응용 프로그램의 특정한 대상에 주입되고 응용 프로그램이 의존하는 대상이 분명하다.● 무엇을 주입했는지: 어떤 대상에게 필요한 외부 자원(대상, 자원, 상수 데이터 포함)을 주입하는 것이다.IoC와 DI는 어떤 관계일까요?사실 이들은 같은 개념의 다른 각도에서 묘사된 것이다. 반전을 제어하는 개념이 모호하기 때문에 (용기 제어 대상이라는 차원으로만 이해할 수 있고 누가 대상 관계를 유지할 것인지 생각하기 어렵다) 2004년에 거장급 인물인 Martin Fowler는 새로운 이름을 제시했다.'의존 주입'이다. IoC에 비해'의존 주입'은'주입 대상 의존 IoC 용기 설정 의존 대상'을 명확하게 설명한다.Spring Ioc에 대한 이해를 많이 봤습니다. 많은 사람들이 Ioc와 DI에 대한 해석이 어려워요. 어차피 말이 안 통하고 도리가 불분명한 느낌이에요. 읽은 후에도 안개가 낀 느낌이에요. 개도라는 기술 소인이 아주 통속적이고 쉽게 쓴 것 같아요. 그는 IoC(컨트롤 반전)와 DI(의존 주입)의 한 글자 한 글자를 명확하게 설명했고 읽은 후에 명랑한 느낌을 주었어요.Spring 프레임워크를 처음 배우는 사람들에게 Ioc에 대한 이해가 큰 도움이 될 거라고 믿습니다.
php 예로 제어 반전과 의존 주입을 설명하다
먼저 하나의 예를 보십시오.
b=new B();
        $this->c=new C();
   
        $this->b->Method();
        $this->c->Method();
         
        //TODO
    }
}
 
class B
{
    public function B()
    {
        //TODO
    }
    public function Method()
    {
        //TODO
        echo 'b';
    }
}
 
class C
{
    public function C()
    {
        //TODO
    }
    public function Method()
    {
        //TODO
        echo 'c';
    }
}
 
$a=new A();
$a->Method();
?>

위 코드에서 우리는 한 마디를 쉽게 이해할 수 있다.
클래스 A는 클래스 B와 C에 의존합니다.
즉, 만약에 앞으로 개발 과정에서 B클래스나 C클래스를 수정하려면 함수 개명, 함수 매개 변수의 수량 변동, 심지어 전체 클래스 구조의 조정과 관련되면 우리는 A클래스에 대해 상응하는 조정을 해야 한다. A클래스의 독립성을 상실하면 개발 과정에서 매우 불편하다. 즉, 우리가 말한'전신을 끌어당긴다'는 것이다. 만약에 두 클래스가 두 사람이 각각 쓴 것이라면모순은 왕왕 이때 발생한다...만약에 정말 B클래스와 C클래스를 바꾸려고 한다면 방법이 있습니까? A클래스의 코드를 바꾸지 않거나 가능한 한 적게 바꿀 수 있습니까?여기에는 반전을 제어하는 데 써야 한다.
고층 모듈은 하층 모듈에 의존해서는 안 되고 둘 다 추상에 의존해야 한다.
반전제어(IOC)는 일종의 사상이며, 의존주입(DI)은 이런 사상을 구현하는 방법이다.
첫 번째 방법은 구조기 주입(이런 방법도 추천하지 않지만 사용하지 않는 것보다 좋다)이다.
class A
{
    public $b;
    public $c;
    public function A($b,$c)
    {
        $this->b=$b;
        $this->c=$c;
    }
    public function Method()
    {
        $this->b->Method();
        $this->c->Method();
    }
}

클라이언트 클래스는 다음과 같습니다.
$a=new A(new B(),new C());
$a->Method();

A클래스의 구조기는 B클래스와 C클래스에 의존하고 구조기의 파라미터를 통해 전달된다. 적어도 한 가지는 실현되었다. 바로 B클래스 대상 b와 C클래스 대상 c의 창설이 모두 A클래스 밖으로 옮겨졌기 때문에 B클래스와 C클래스가 바뀌면 A클래스는 수정할 필요가 없다. client클래스에서 바꾸면 된다.
만약 어느 날, 우리는 B류를 확충하여 두 개의 B류의 자류를 만들어야 한다.
class B
{
    public function B()
    {
        //TODO
    }
    public function Method()
    {
        //TODO
        echo 'b';
    }
}
class B1 extends B
{
    public function B1()
    {
        //TODO
    }
    public function Method()
    {
        echo 'b1';
    }
}
class B2 extends B
{
    public function B2()
    {
        //TODO
    }
    public function Method()
    {
        echo 'b2';
    }
}

간단합니다. 클라이언트 클래스는 다음과 같습니다.
$a=new A(new B2(),new C());
$a->Method();

그래서 A클래스는 B클래스가 어떤 하위 클래스가 있는지 신경 쓰지 않고 클라이언트 클래스에서 관심을 가지면 된다.
두 번째 방법은 공장 모드 주입(추천)
class Factory
{
    public function Factory()
    {
        //TODO
    }
    public function create($s)
    {
        switch($s)
        {
            case 'B':
            {
                return new B();
                break;
            }
            case 'C':
            {
                return new C();
                break;
            }
            default:
            {
                return null;
                break;
            }
        }
    }
}

Class A 코드는 다음과 같이 변경되었습니다.
class A
{
    public $b;
    public $c;
    public function A()
    {
        //TODO
    }
    public function Method()
    {
        $f=new Factory();
        $this->b=$f->create('B');
        $this->c=$f->create('C');
         
        $this->b->Method();
        $this->c->Method();
         
        //TODO
    }
}

사실 이미 일부분의 결합을 풀었다. 적어도 B클래스와 C클래스의 구조 함수에 변화가 발생하면, 예를 들어 함수 파라미터를 수정하는 등이다. 우리는Factory클래스만 바꾸면 된다.B류와 C류 중의 방법을 다시 추상화하여 인터페이스를 만들다
interface IMethod
{
    public function Method();
}

이렇게 하면 A류 중의 b변수와 c변수는 더 이상 구체적인 변수가 아니라 추상적인 유형의 변수이다. 운행하는 순간도 되지 않아 그들의 Method 방식이 어떻게 실현되었는지 모른다.
class B implements IMethod
{
    public function B()
    {
        //TODO
    }
    public function Method()
    {
        //TODO
        echo 'b';
    }
}
 
class C implements IMethod
{
    public function C()
    {
        //TODO
    }
    public function Method()
    {
        //TODO
        echo 'c';
    }
}

요약: 1.우리는 A클래스의 B클래스 대상과 C클래스 대상의 창설을 A클래스 밖으로 옮겼다.원래 A클래스는 B클래스와 C클래스에 의존하다가 A클래스는 팩토리에, 팩토리는 B클래스와 C클래스에 의존하게 됐다.
참조: PHP 제어 반전(IOC) 및 종속 주입(DI)

좋은 웹페이지 즐겨찾기