제어 반전

Inversion of control

소프트웨어 엔지니어링에서 IoC(Inversion of Control)는 프로그래밍 원리입니다.IoC는 기존 제어 흐름과 비교하여 제어 흐름을 반전시킵니다.IoC에서 컴퓨터 프로그램의 커스텀 작성 부분은 범용 프레임워크에서 제어 흐름을 수신합니다.이 설계의 소프트웨어 아키텍처는 기존프로시저 프로그래밍과 비교하여 제어를 반전시킵니다.기존 프로그래밍에서는 프로그램의 목적을 나타내는 커스텀 코드가 범용 태스크를 처리하기 위해 재사용 가능한 라이브러리로 호출되지만 제어 반전에서는 커스텀 또는 태스크 지정이 호출되는 프레임워크입니다.c, 코드

제어의 반전은 프로그램의 모듈화를 증가시키고 확장 가능하도록 [1]하기 위해 사용되며 객체 지향 프로그래밍 및 기타 프로그래밍 패러다임에서 응용 프로그램을 가지고 있습니다.이 용어는 Michael Mattson이 Stefano Mazzocchi가 1999년에[3] Apache Software Foundation 프로젝트인 Avalon에서 취합한 [2]논문에서 사용되었으며, 2004년에 Robert C에 의해 더욱 대중화되었습니다. 마틴과 마틴 파울러.

이 용어는 의존성 반전 원리와 관련이 있지만, 이는 상위 계층과 하위 계층 간의 의존성을 공유 추상화를 통해 분리하는 과 관련이 있다.일반적인 개념은 IoC를 사용하여 구현되는 경우가 많아 커스텀코드는 일반적으로 이벤트 처리에만 관련된 반면 이벤트 루프와 메시지 디스패치는 프레임워크 또는 런타임 환경에 의해 처리된다는 점에서 이벤트 구동 프로그래밍과도 관련이 있습니다.

개요

예를 들어, 기존 프로그래밍에서는 응용 프로그램의 주요 기능이 사용 가능한 명령 목록을 표시하기 위해 메뉴 라이브러리에 함수를 호출하고 사용자에게 하나를 [4]선택하도록 쿼리할 수 있습니다.따라서 라이브러리는 선택된 옵션을 함수 호출 값으로 반환하고 메인 함수는 이 값을 사용하여 관련 명령을 실행합니다.이 스타일은 텍스트 기반 인터페이스에서 일반적입니다.예를 들어, 이메일 클라이언트는 새 메일을 로드하고, 현재 메일에 응답하고, 새 메일을 만드는 등의 명령어가 있는 화면을 표시할 수 있으며, 사용자가 키를 눌러 명령을 선택할 때까지 프로그램 실행이 차단됩니다.

반면 제어의 반전에서는 프로그램은 윈도우 시스템, 메뉴, 마우스 제어 등과 같은 일반적인 행동 및 그래픽 요소를 아는 소프트웨어 프레임워크를 사용하여 작성됩니다.커스텀 코드는 메뉴 항목의 테이블을 제공하고 각 항목에 대한 코드 서브루틴을 등록하는 등 프레임워크의 "빈칸에 채워짐"이지만, 메뉴 항목이 선택되었을 때 사용자의 동작을 감시하고 서브루틴을 호출하는 프레임워크입니다.메일 클라이언트의 예에서는 프레임워크는 키보드와 마우스 입력을 모두 따르고 사용자가 호출하는 명령어를 호출하는 동시에 네트워크인터페이스를 감시하여 새로운 메시지가 도착하는지 여부를 확인하고 네트워크 액티비티가 검출되었을 때 화면을 새로 고칠 수 있습니다.동일한 프레임워크를 스프레드시트 프로그램 또는 텍스트 편집기의 골격으로 사용할 수 있습니다.반대로 프레임워크는 웹 브라우저, 스프레드시트 또는 텍스트 편집기에 대해 아무것도 모릅니다.기능을 구현하려면 커스텀 코드가 필요합니다.

제어의 반전은 재사용 가능한 코드와 문제 고유의 코드가 응용 프로그램에서 함께 작동하더라도 독립적으로 개발된다는 강한 의미를 갖는다.콜백, 스케줄러, 이벤트루프, 의존성 주입 및 템플릿 방식은 객체 지향 프로그래밍의 맥락에서 가장 일반적으로 사용되는 용어이지만 제어 원리의 반전을 따르는 설계 패턴의 예입니다.

제어의 역전은 다음과 같은 설계 목적에 도움이 됩니다.

  • 작업 실행을 구현에서 분리합니다.
  • 모듈을 대상으로 설계된 작업에 초점을 맞춥니다.
  • 모듈을 다른 시스템이 수행하는 작업에 대한 가정으로부터 해방하고 대신 계약에 의존합니다.
  • 모듈 교체 시 부작용을 방지하기 위해

통제의 반전을 우스꽝스럽게 "할리우드 원칙"이라고 부르기도 합니다.전화하지 마, 우리가 전화할게.

배경

제어의 반전은 컴퓨터 과학에서 새로운 용어가 아니다.마틴 파울러는 이 [5]문구의 어원을 1988년으로 거슬러 올라가지만, 1970년대 [6]마이클 잭슨이 그의 잭슨 구조화 프로그래밍 방법론에서 설명한 프로그램 반전 개념과 밀접하게 관련되어 있다.상향식 파서하향식 파서의 반전이라고 볼 수 있습니다.한 경우 제어는 파서에 있고 다른 경우 수신 애플리케이션에 있습니다.

종속성 주입은 IoC의 [4]특정 유형입니다.Java Naming and Directory Interface(JNDI) 등의 서비스 로케이터도 비슷합니다.Loek Bergman의 [7]기사에서, 그것은 건축 원리로 제시되어 있다.

로버트 C의 기사에서. 마틴,[8] 종속성 반전 원리와 계층화에 의한 추상화가 함께 한다.그가 "역전"이라는 용어를 사용하는 이유는 기존의 소프트웨어 개발 방법과 비교하기 때문입니다.그는 종속성 반전에 대해 이야기할 때 계층 추상화에 의해 서비스가 분리되는 것을 설명합니다.이 원리는 추상화 레이어 설계에서 시스템 테두리가 어디에 있는지 알아내는 데 사용됩니다.

묘사

기존 프로그래밍에서 비즈니스 로직의 흐름은 서로 정적으로 결합되는 객체에 의해 결정됩니다.제어 반전에서는 프로그램 실행 중에 작성된 객체 그래프에 따라 흐름이 달라집니다.이러한 동적 흐름은 추상화를 통해 정의된 객체 상호 작용에 의해 가능합니다. 런타임바인딩은 의존관계 주입이나 서비스 로케이터 등의 메커니즘에 의해 실현됩니다.IoC에서는 컴파일 중에 코드가 정적으로 링크될 수도 있지만 코드 자체의 직접 참조가 아닌 외부 구성에서 설명을 읽어냄으로써 실행할 코드를 찾을 수도 있습니다.

종속성 주입에서는 종속 개체 또는 모듈이 런타임에 필요한 개체에 결합됩니다.프로그램 실행 중 종속성을 충족하는 특정 객체는 일반적으로 정적 분석을 사용하여 컴파일 시 알 수 없습니다.여기서 오브젝트 상호작용의 관점에서 설명되는 동안, 이 원리는 오브젝트 지향 프로그래밍 외에 다른 프로그래밍 방법론에도 적용될 수 있다.

실행 중인 프로그램이 개체를 서로 바인딩하려면 개체가 호환되는 인터페이스를 가지고 있어야 합니다.예를 들어 class 입니다.A동작을 인터페이스에 위임할 수 있습니다.I계층별로 구현됩니다.B; 프로그램이 인스턴스화 됩니다.A그리고.B를 주입합니다.B안으로A.

구현 기술

객체 지향 프로그래밍에서는 제어의 반전을 구현하기 위한 몇 가지 기본 기술이 있습니다.다음과 같습니다.

Martin [9]Fowler의 원본 기사에서 처음 세 가지 다른 기술에 대해 논의합니다.제어 유형의 [10]반전에 대한 설명에서는 마지막 유형을 언급합니다.대부분의 경우 컨텍스트화된 룩업은 서비스 로케이터를 사용하여 이루어집니다.

같은 대부분의 프레임워크.NET 또는 Enterprise Java 는 다음 패턴을 표시합니다.

일반의 학급 Server Facade {     일반의 < >K, V> V response To Request(요청 응답)(K 부탁한다) {         한다면 (비즈니스 레이어.validate Request(요청 검증)(부탁한다)) {             데이터. 데이터. = DAO.데이터 가져오기(부탁한다);             돌아가다 측면.데이터 변환(데이터.);         }         돌아가다 무효;     } } 

이 Java 기본 개요는 IoC 방법론을 따르는 코드의 예를 보여줍니다.다만, 중요한 것은,ServerFacadeData Access Object(DAO; 데이터 액세스 객체)에 의해 반환되는 데이터에 대해 많은 가정이 이루어집니다.

이러한 모든 전제조건이 때로는 유효할 수 있지만, 이러한 전제조건은 다음과 같이 구현됩니다.ServerFacadeDAO 구현으로 전환합니다.제어의 반전 방식으로 애플리케이션을 설계하면 제어가 DAO 오브젝트에 완전히 넘어갑니다.그러면 코드는

일반의 학급 Server Facade {     일반의 < >K, V> V response To Request(요청 응답)(K 부탁한다, DAO 다오) {         돌아가다 다오.데이터 가져오기(부탁한다);     } } 

이 예에서는 이 방법이respondToRequestIOC 사용 여부를 결정합니다.IoC를 정의하는 것은 파라미터를 사용하는 방법입니다.이는 일부 객체 지향 프로그래밍 언어가 사용하는 메시지 전달 스타일과 유사합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Johnson, Ralph E.; Foote, Brian (June–July 1988). "Designing Reusable Classes". Journal of Object-Oriented Programming. 1 (2): 22–35. CiteSeerX 10.1.1.101.8594. Retrieved 29 April 2014.
  2. ^ Mattsson, Michael (February 1996). "Object-Oriented Frameworks, A survey of methodological issues". Department of Computer Science, Lund University. CiteSeerX 10.1.1.36.1424. LU-CS-TR: 96-167.
  3. ^ Stefano Mazzocchi (22 January 2004). "On Inversion of Control". Archived from the original on 2 February 2004.
  4. ^ a b 의존성 주입
  5. ^ 마틴 파울러 블라이키에 대한 지배력 반전
  6. ^ "Introduction to Jackson Design Method" (PDF).
  7. ^ Wayback Machine Inside 아키텍처 아카이브 인덱스: Loek Bergman이 어디에서나 한 번 쓰고 실행할 수 있습니다.
  8. ^ Robert C에 의한 의존성 반전 원리.마틴
  9. ^ Martin Fowler에 의한 제어용기 반전의존성 주입 패턴
  10. ^ 2009년 6월 15일 Wayback Machine에서 아카이브된 IoC 유형

외부 링크