문제

이 질문을하는 또 다른 방법은 다음과 같습니다. 귀하에 따른 통제의 반전은 무엇입니까?

Wikipedia 기사가 있기 때문에이 질문을합니다 IOC 비 OO의 설명에 의해 납치되었습니다. 이것은에서 가져옵니다 토론 페이지 그리고 2007 년부터 :

이전 내용이 무의미한 "객체 지향적"babble에 의해 완전히 인수되었으므로 페이지를 완전히 다시 작성하기 위해 자유를 얻었습니다.

나는 통제의 반전이 OO 언어 이외의 지역에서 어떤 의미가 있는지 알지 못한다. 절차 적 언어로 제어를 포기하기위한 많은 설명이 있으며 (이벤트 프로그래밍은 하나입니다) 순전히 기능적인 언어에는 더 높은 기능을 갖기 때문에 제어의 역전과 같은 개념이 필요하지 않습니다.

또한 기사 Martin Fowler가 IOC에 대해 자세히 설명하는 곳에서 그는 독점적으로 OO 사례를 처리합니다.

그렇다면 IOC는 독점적으로 OO 개념이며 정확히 무엇입니까?

나에게 IOC는 대부분의 OO 언어가 부과하는 한계 내에서 함수를 데이터로 바꾸려고 노력하고 다른 기능에 대한 인수로서 데이터를 데이터로 전달하려고 시도합니다. 그것은 IOC의 유일한 부분은 아니지만 그 중 일부가 있습니다.

공장 디자인 패턴도 있습니다. 공장 디자인 패턴도 있습니다. 여기서 물체의 나무가 제작되고 전달되기 전에 구성되고 있습니다.

나에게 IOC는 독점적으로 OO 개념입니다.

당신의 대답은 무엇입니까?

도움이 되었습니까?

해결책

당신은 구현 관점에서 이론적 문제를 살펴 봅니다. 첫 번째 질문은해야합니다 정확히 어떤 통제를 반전합니까? ?

그러면 객체, 방법, 기능 또는 전달되지 않은 것이 중요하지 않다는 것을 알게 될 것입니다.

요컨대, 의존성 주입을 할 때, 당신은 자원의 생성과 의존성의 제어 제어를 반전합니다 (자원).

Windows API 함수에 콜백 함수에 대한 포인터를 제공하면 자신의 매개 변수로 기능을 호출하는 제어를 제공합니다.

알다시피, IOC는 이론적 개념 일 뿐이며 물론 다른 실용적 구현이있을 수 있습니다.

다른 팁

제어의 역전은 가장 확실히 OO 개념이 아닙니다.

IOC는 존재하며 비구 언어로 상당히 자주 사용됩니다. 예를 들어 C에서 매우 일반적입니다. 이것의 주요 예는 Windows API입니다. 콜백을 통해 작동하는 Windows API 기능을 호출 할 때마다 기본적으로 IOC를 가장 원시적 인 형태로 사용합니다.

예를 들어, 열거적 인 기능. 이것을 사용하면 함수 포인터 (enumwindowsproc)를 라이브러리로 전달하고 코드는 라이브러리 코드 내에서 실행됩니다.

이것을 Wikipedia의 통제 역전의 정의와 비교하십시오. "제어의 역전은 라이브러리 절차가 사용자 절차를 호출 할 때 발생합니다."

정확히 동일합니다.

그러나 IOC는 풍부한 유형 시스템과 OOP와 함께 제공되는 다른 많은 도구를 추가 할 때 매우 강력하고 유연하며 사용하기 쉽습니다. 이것은 "더 좋은"것이기 때문에 더 일반적이지만 OOP 이전에는 존재했습니다.

글쎄, "제어의 역전"이라는 개념은 당신이 기능 포인터를 통과 할 수있는 방법이 어디에도 적용 가능한 것 같습니다. 기본적으로, 플러그인 개념과 호환 서명이있는 DLL (예 : 드라이버 생각)은 IOC의 형태 일뿐입니다.

그러나 풍부한 유형 및 컨테이너 모델과 함께 IOC를 사용할 때 기본적으로 OO 세계에 자동으로 가질 수 있습니다. 그리고 OOP의 개념은 IOC 개념, 특히 순수한 가상 클래스 (또는 "인터페이스")와의 다중 상속을 지원하는 언어에서 IOC 개념에 매우 잘 맵핑됩니다.

실제로, IOC의 OO 구현은 기능이 종종 일등석 시민이 아니기 때문에 매우 정교합니다.

Azder가 언급했듯이 : IOC는 여러 가지 이유로 사용됩니다. 나는 여기에 일부를 소집 할 수 있도록 요약하겠습니다 :)

반복

#ruby
{1,2,3}.each{ |i| puts i }

#haskell
map [1,2,3] ( \i -> write i )

//the stl algorithms
int printint( int i ){ return printf( "%d", i ); }
std::foreach( onetwothree.begin(), onetwothree.end(), &printi );

스레드 생성

CreateThread( NULL, 0, &myFunction, NULL, 0, NULL );

일반 이벤트 파견

//javascript
document.getElementById( "mybutton" )
            .addEventListener( 
                 function(e){ alert("buttonPressed") } );

이 예 중 어느 것도 객체 지향적이지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top