2009-11-25 5 views
3

여기에 문제가 있습니다. 우리가 비디오 게임을하고 있고 의존성 주입을 사용한다고 가정 해 보겠습니다. 여기에 우리가 무엇 : 나는 의존성 주입을 할 때 내 캐릭터 자체를 만들 위치를 알 수있는 정보를했을 있도록종속성 삽입은 안티 패턴 체인 체인입니까?

Game Class // This is just the code to keep track of the overall game logic 
Character Class // This would be the guys in the game, good and bad guys both 
Weapon Class // The weapons for the characters 

그래서 일반적으로 내가 문자로 현재지도에 위치, 게임 상태를 주입 것, 캐릭터를 가지고 무기를 만들고 무기의 강도에 대한 값을 주입하고 게임 클래스 등 다른 일반적인 게임 상태를 주입합니다.

이것은 거의 내게 반 패턴 같아 보입니다. . 나는 그것이 매우 부서지기 쉽고 변경하기가 어렵다는 (적어도 나에게는 그렇게 보인다) 코드를 가지고 있기 때문에 그렇게 말하고있다. 전달되는 게임 상태 정보를 변경하려면 세 가지 클래스를 모두 변경해야합니다. Game 클래스를 원래대로 변경 한 다음 Character를 수정 한 다음 Weapon 클래스도 수정합니다. 이것은 특히 여기 3 개가 아닌 5 개 레벨의 깊은 곳으로 가면 많은 일입니다. 그래도 DI 테스트보다 단위 테스트가 쉽습니다.

이것은 다시 나쁜 습관처럼 들립니다. 이것은 일반적으로 일이 이루어지는 방식입니까? 우리는 일종의 'MotherShip'패턴을 가졌습니다. 모든 것이 최상위 레벨에 있습니다. 그래서 게임을 만드는 대신에 캐릭터가 무기를 만들어 게임 (또는 다른 클래스)이 모든 것을 만들도록합니다.

이 방법으로 캐릭터에 새로운 무기를 추가하고 싶다면 게임 클래스가 무기를 만들어 주입 할 수 있습니다. 이것에 무엇을해야할지 모르겠습니다. 감사합니다

답변

2

디자인에 대한 질문은 답변이 어렵습니다. 특히 예제가 이해가 안되는 경우에 그렇습니다. 이 경우, 캐릭터가 무기를 생성한다는 것은 이해가되지 않습니다. 캐릭터가 한 캐릭터에 대한 책임을 져야합니다. 어쩌면 캐릭터에 무기를 추가 할 수는 있지만 캐릭터가 무기 제조업체가 아닌 한 실제로 새로운 무기 클래스를 만들지는 않을 것입니다.

나는 이보다 더 좋은 패턴이 팩토리 패턴이라고 생각합니다. 무기를 만드는 책임이있는 학급을 만드십시오. 그리고 캐릭터를 만드는 책임이있는 클래스. 그렇게하면 캐릭터가 생성 될 때 변경해야하는 장소가 3 개 또는 4 개라면 해당 팩토리가 해당 동작을 처리 할 수 ​​있으며 이후 변경을 위해 포함됩니다.

+0

디자인 문제는 당신이 이미 올바른 방법을 알고 있기 때문에 당신에게 이해가되지 않을 것이라고 생각합니까? 그것은 단지 추측입니다. 나는 아직도 각 학교가 많은 하위 클래스를 소유하고 있다고 생각하는 오래된 학교 OO에 집착하고 있다고 생각합니다 (세계에는 집, 집 사람들, 사람들에게는 옷 등이 있습니다). 귀하의 충고는 나에게 의미가 있습니다. 캐릭터는 무기에 대한 지식이 있어야한다고 생각하지만 캐릭터를 주입 할 수 있습니다. 공장 패턴에 대한 정보 주셔서 감사합니다. 내가 보통 직면하는 경우는 단지 하나의 인스턴스가 될 것입니다. 이 예가 제가 가진 최고의 것입니다. –

+2

주의해야 할 것은 실제로 오브젝트가 실제로 생성되는 위치에주의를 기울이는 것입니다. "새"키워드를 사용하면 단일 구현으로 자신을 잠그므로이를 제어해야합니다. 또한 객체를 생성 한 사람은 책임을 가진 다른 사람에게 객체를 전달할 때까지 객체를 작성한 사람이 책임을집니다. {House, Person, Clothes} 예에서 옷 유형의 객체는 다른 곳에 만들어 져서 Person 객체 나 House 객체에 지정되어야합니다. – tster

+0

그래, 내 문제 였어. 나는 의존성을 거꾸로 가지고 있었다. 전에 비슷한 질문을했고 많은 사람들은 의존성 체인이 완벽하게 정상이라고 생각했기 때문에 이것이 모든 사람에게 실제로 알려지지 않았다고 가정합니다. 적절한 종속 질서와 이것들과 같은 중요한 관행을 실제로 다루는 것에 대해 알고있는 어떤 원칙이나 책이 있습니까? 감사합니다. –

5

의존성을 연결하거나 중첩하는 것은 완벽하게 자연스러운 방법입니다. (예를 들어, 예를 들어 약간 이상한 소리를내는 사람에게 동의해야하지만) 왜 깨지기 쉬운 지 이해할 수 있습니다. 즉, 구체적인 유형을 주입하면 소비자에게.

트릭은 모든 종속성 수준에서 인터페이스를 도입하여 은 소비자과 독립적으로 구현할 수 있습니다. 예를 들어, IGame 인터페이스를 정의하고 Game 클래스 대신 Character 클래스에 삽입해야합니다.

그렇다고해도 인터페이스를 너무 자주 변경해야 할 수도 있기 때문에 심층적 인 중첩이 많은 인터페이스는 여전히 취약 할 수 있습니다. 가능한 한 많이 Hollywood PrincipleLaw of Demeter을 준수하도록 노력하면 가장 잘 해결됩니다.