2015-01-28 3 views
3

나는 자주 의존성을 주입하기 위해 서명에서 사용하고있는 인터페이스를 만들고, class AIfaceclass AImpl : public AIface으로 끝나는 자신을 찾습니다. 그리고 꽤 자주 나는 결코 다른 서브 클래스를 구현하지 않는다. class AIface의존성 주입 + 완전 가상 대 인터페이스

이 방법은 모든 public 메서드 virtual을 사용하여 구현을 직접 사용하는 것이 유리한가요?


긴 설명 :
우리가 청소 서비스와 함께 동물원을 말한다. 우리는 TDD를하고 가짜 FeedingSvc로 동물원을 테스트 할 수 있기를 원합니다. 그래서 우리는 의존성 주입을 위해갑니다. 의 차이점은 무엇

:

class FeedingSvcIface{ 
    virtual void performFeeding() = 0; 
} ; 
class RoboticFeedingSvc: public FeedingSvcIface{ 
      void performFeeding(); 
}; 
Class Zoo{ 
    Zoo(FeedingSvcIface&); 
//... 
}; 

class RoboticFeedingSvc{ 
    virtual void performFeeding(); 
}; 
Class Zoo{ 
    Zoo(RoboticFeedingSvc&); 
//... 
}; 

대 (그리고 이제까지 필요한 경우, 미래의 인터페이스 추출) 테스트의 관점에서

를, 전자는 것 더 쉽습니다.

보통 "교차하는 레이어"라고 말하면서 인터페이스를 추가하는 것이 자연스럽지 만 테스트 할 때가 있습니다.
미래에는 다른 유형의 FeedingSvcs을 구현해야 할 수도 있지만, 실제로 필요하지 않은 경우 오늘 추상화를 수행하는 이유는 무엇입니까?,
일부 논리를 캡슐화하기 위해 두 클래스를 분할 할 수 있습니다.

+0

처음부터 인터페이스를 사용하면 단위 테스트 용 모의 객체를 훨씬 쉽게 만들 수 있습니다. – dlf

답변

3

모범 사례, 디자인 패턴 또는 다른 관용구를 고수하면 현재 더 많은 노력을 기울이지 만 장기적으로 더 많은 이익을 얻을 수 있다는 장점이 있습니다.

여러 개발자가 있고 경험이 풍부하고 그렇지 않은 팀에서 일하는 시나리오를 상상해보십시오.

동물원 메커니즘을 만든 사람이지만, 당분간 여분의 추상화를 사용하지 않고 KISS 원칙에 따라 동물원을 구현할 것입니다. "RoboticFeedingSvc의 여러 가지 별개의 동작이있을 경우 의존성 삽입보다 추상화가 있어야합니다!"라고 명시하는 정신적 인 메모 (또는 멋진 작은 주석)를 설정합니다. "

정말 멋진 일 때문에 휴가를 보내고 일부 주니어 개발자는 코드를 유지해야합니다.

개발자의 작업 중 하나는 ManualFeeding 옵션과 하이브리드 옵션을 소개하는 것입니다. 이것을 수행하는 방법은 여러 가지가 있습니다 (코딩 원칙을 무시하고).

작성자가 메커니즘이 성장하는 방식을 적용하지 않았기 때문에 중급 개발자가 내 의견을보고 "LoL u mad bro :)"덧글을 추가 한 다음 다음 중 하나를 선택하십시오.

  • 기본 인터페이스를 만들기 다른 FeedingSvcs에 의해 유도되는
  • 가 전략 패턴 (일부 펑이 무엇인가를 공급하는 방법의 측면에서 설정해야합니다)를 사용하여 RobotFeedingSvc에 의존성 주입을 만듭니다 (여기에 운이있어)
  • RobotFeedingSvc를 Feeder, Feeded 및 일부 Action 함수 사이의 합성으로 설정하십시오.
  • RobotFeedingSvc를 단일 톤 팩토리로 만듭니다 (싱글 톤 팩토리가 굉장하고 환상적이기 때문에) 어떻게 든 동물원 내부에서 올바른 먹이 기법을 반환하게 만듭니다. 여기서 중요한 것은 싱글 톤과 팩토리를 사용한다는 것입니다.
  • 주어진 FeedingPolicy 및 Feeder에 따라 부분적으로 특수화 된 RobotFeedingSvc의 템플릿 버전을 사용하는 동물원 (왜냐하면 그는 방금 템플리트에 부딪 혔고 템플리트는 모든 곳에서 사용해야하기 때문입니다). 를 포함하여 제대로 다른 개발자 도움이 될 것입니다 기능면에서 확장 성 수 있도록 응용 프로그램에 필요한 추상화 계층을 할 수있는 초기 노력을 (만들기

    :

나는 우리가 fewers 라인에서 이야기를 요약있을 것 같아요 여기에 미래에) 기존 코드를 사용하여 새로운 기능을 구현하는 올바른 방법을 빠르게 이해할 수 있습니다.

Zoo 클래스가 구체적인 클래스 대신 인터페이스를 사용하도록 강요하는 것은 새로운 기능이이 인터페이스를 구현해야한다는 의견을 남기는 것과 거의 같습니다.

구체적인 클래스를 매개 변수로 전달하도록 허용하면 구체적인 클래스를 변경하는 방법에 초점을 전환 할 수 있습니다.

그는 새로운 기능을 추가 할 필요가 있지만, 그는 동물원 구현을 변경할 수 없습니다 것 :

또 다른 기술적 인 이유는 다음과 같이 될 것이다. 지금 뭐야?