객체 지향 프로그래밍, 스타일 규칙 및 기타 모든 것에서 흔히 발생하는 것과 동일한 기본 문제입니다. 사실 매우 일반적인 추상화는 너무 많은 추상화를하고 너무 많은 간접 성을 추가하고 일반적으로 좋은 기술을 과도하고 잘못된 곳에 적용하는 것이 가능합니다.
적용하는 모든 패턴 또는 기타 구성은 복잡성을 가져옵니다. 추상화와 간접 정보는 정보를 분산 시키며 때로는 관련이없는 세부 사항을 방해하지 않지만 때로는 정확히 무슨 일이 일어나고 있는지 이해하기 어렵게 만듭니다. 적용하는 모든 규칙은 융통성이 없어 최상의 방법 일 수있는 옵션을 배제합니다.
요점은 작업을 수행하고 강력하고 읽기 쉽고 유지 관리가 가능한 코드를 작성하는 것입니다. 아이보리 타워 빌더가 아닌 소프트웨어 개발자입니다.
관련 링크
http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
아마도 가장 간단한 형태의 의존성 주입 (웃지 마)이 매개 변수 일 것입니다. 종속 코드는 데이터에 의존하며 해당 데이터는 매개 변수를 전달하는 수단으로 주입됩니다.
그렇습니다. 어리 석고 객체 지향 의존성 주입 포인트를 다루지 않지만 함수형 프로그래머는 (첫 번째 클래스 함수가있는 경우) 이것이 필요한 유일한 의존성 주입이라고 알려줍니다. 여기서 중요한 것은 간단한 예를 들어 잠재적 인 문제를 보여주는 것입니다.
이 간단한 전통적인 함수를 생각해 봅시다-C ++ 구문은 중요하지 않지만 어떻게 든 철자를 써야합니다 ...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
텍스트 "Hello World"를 추출하고 주입하려는 종속성이 있습니다. 충분히 쉬운 ...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
원래보다 어떻게 융통성이 없습니까? 출력이 유니 코드 여야한다고 결정하면 어떨까요? 아마도 std :: cout에서 std :: wcout으로 전환하고 싶을 것입니다. 그러나 그것은 내 문자열이 char가 아니라 wchar_t이어야 함을 의미합니다. 모든 호출자를 변경하거나 (더 합리적으로) 이전 구현은 문자열을 변환하고 새 구현을 호출하는 어댑터로 대체됩니다.
그것은 우리가 원본을 유지한다면 필요하지 않은 유지 보수 작업입니다.
그리고 사소한 것처럼 보이면 Win32 API 에서이 실제 기능을 살펴보십시오 ...
http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx
그것은 다루어야 할 12 가지 "종속성"입니다. 예를 들어, 화면 해상도가 너무 커지면 64 비트 좌표 값과 다른 버전의 CreateWindowEx가 필요할 수 있습니다. 그리고 예, 이미 구식 버전이 남아 있습니다. 아마도 이전 버전의 새로운 버전에 매핑 될 것입니다 ...
http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx
이러한 "종속성"은 원래 개발자에게는 문제가 아닙니다. 해당 인터페이스를 사용하는 모든 사람은 종속성이 무엇인지, 지정 방법 및 의미가 무엇인지, 응용 프로그램을 위해 수행 할 작업을 찾아야합니다. 이곳에서 "기본 설정"이라는 단어가 삶을 훨씬 간단하게 만들 수 있습니다.
객체 지향 의존성 주입은 원칙적으로 다르지 않습니다. 클래스 작성은 소스 코드 텍스트와 개발자 시간 모두에서 오버 헤드이며, 해당 클래스가 일부 종속 객체 사양에 따라 종속성을 제공하도록 작성된 경우 종속 객체는 필요한 경우에도 해당 인터페이스를 지원하도록 잠겨 있습니다. 해당 객체의 구현을 대체합니다.
의존성 주입이 잘못되었다고 주장하는 것은 아닙니다. 그러나 어떤 좋은 기술이라도 과도하게 잘못 적용 할 수 있습니다. 모든 문자열을 추출하여 매개 변수로 변환 할 필요는 없지만 모든 하위 수준 동작을 고급 개체에서 추출하여 주입 가능한 종속성으로 변환 할 필요는 없습니다.