XNA 게임 서비스와 영광스러운 글로벌 변수의 차이점은 무엇입니까?


10

Microsoft.Xna.Framework.Game클래스에는 프로그래머가 클래스 유형과 클래스 인스턴스를 Add 메서드에 제공하여 게임에 서비스를 추가 할 수 있는 Services 속성이 있습니다.

이제 AudioComponent필요한 모든 클래스와 메소드 에 전달하는 대신 Game인스턴스를 전달 하고 서비스를 찾아보십시오. ( 서비스 로케이터 )

이제 게임에는 많은 서비스 (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager 등)가 있으므로 기본적으로 모든 것을 게임에 전달합니다.

그렇다면 왜 이러한 인스턴스를 싱글 톤으로 만들지 않겠습니까? 글쎄, 싱글 톤은 전역 상태를 가지고 있기 때문에 나쁘기 때문에 테스트를 방지하고 디자인을 훨씬 취하기 쉽게 만듭니다. 서비스 로케이터는 객체에 대한 종속성을 전달하는 대신 해당 클래스를 나머지 서비스와 연결하는 서비스 로케이터 (게임)를 전달하기 때문에 많은 사람들에게 반 패턴으로 간주됩니다.

그렇다면 XNA 및 게임 개발에서 왜 서비스가 권장됩니까? 게임이 일반 프로그램과 다르고 구성 요소와 밀접하게 관련되어 있고 클래스 기능에 필요한 모든 구성 요소를 전달해야하기 때문에 매우 번거 롭습니까? 게임 디자인에서 게임 서비스는 그저 필요한 악인가? 긴 파라미터 목록과 커플 링을 포함하지 않는 대안이 있습니까?


3
"서비스 로케이터는 많은 사람들에게 반 패턴으로 간주된다"-[인용 필요]. 분명히 당신이 필요하지 않은 곳에서 그것들을 사용하는 것은 모든 소프트웨어 구조에서 사실이 아닙니다-그러나 나는 안티 패턴이라고 불리는 서비스 로케이터를 들어 본 적이 없습니다. (다른 한편으로, 나는 또한 대부분의 시간을 최신 패턴 미세화에 대해 논의하는 프로그래머를 피하려고 노력한다.)

@JoeWreschnig 비록 당신에 동의하지만 나는 파고 그것을 발견했습니다 : blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
Roy T.

2
네,하지만 그 사람은 DI 사용에 관한 책을 팔고 있습니다. 분명히 그는 당신이 간단한 것을 사용하고 싶지 않다면, 당신은 그의 책을 사지 않을 것입니다! (모든 진지하게, Fowler의 독창적 인 DI / SL 기사는이 정확한 주제 인 martinfowler.com/articles/…를 다루었으며 , 그 사람의 블로그 rant는 토론에 아무것도 추가하지 않습니다.)

Martin Fowler가 방금 게시 한 링크를 답변으로 표시 할 수 있기를 바랍니다 (내 질문은 아니지만)
Roy T.

답변:


6

모든 사람들이 서비스 로케이터가 나쁘다는 데 동의하지는 않습니다. Service Locator는 모든 사람이 필요로하는 중요한 기능을 실제 구현에서 분리 할 수있는 방법을 제공합니다. 서비스 로케이터는 또한 런타임에 서비스를 교환하는 방법을 제공합니다. 또한 모든 곳에서 서비스 로케이터를 통과해야한다는 것이 사실이라고 생각하지 않습니다. 어디에서나 액세스 할 수 있다고 생각합니다. 전역이있는 게임 클래스는 프레임 당 약 1,000 번 전달되어야합니다 (성능 저하).

서비스 로케이터와 전역 클래스가 다른 클래스를 좀 더 명확하게하려면 다음 예제를 고려하십시오.

게임을 만들고 전역 변수 인 콘텐츠 로더가있는 gameA 클래스 객체를 사용합니다. 다음 게임에서는 gameA 클래스를 사용하고 싶지 않지만 새 gameB 클래스를 만들고 싶습니다. 이제 gameA의 전역을 gameB에 다시 추가해야하는데 이는 추가 작업입니다. 또한 원하는 콘텐츠 로더 유형을 구성하기가 어렵습니다. PC와 XBOX에서 모두 실행되는 게임이 있다고 가정 해보십시오. PC에서 '파일 열기'대화 상자를 열 수있는 콘텐츠 로더가 필요합니다. XBOX에있는 동안 나는 이것을 원하지 않습니다. 설정 파일을 가짐으로써 게임 A의 전역을 공개하지 않고도 게임 A 클래스 이외의 다른 곳에서도 게임이 콘텐츠 로더를 쉽게 변경할 수 있습니다.

이제 서비스 로케이터를 사용하고 있다고 가정하십시오. 항상 계속 사용할 수 있습니다. 그리고 어떤 종류의 서비스가 있더라도 항상 다를 수 있습니다. 공통 인터페이스가있는 한 구현에 신경 쓰지 않는 것도 사실입니다. (클래스와 같은 gamA에서도 사용할 수 있지만).

어쨌든 게임 서비스가 꽤 편리하다고 생각합니다. 내가 아는 사람은 모두 그것을 사용합니다. 좀 더 도움이됩니다. 당신은 모든 시간을 캐스팅 상당히 덜 할 수 있도록 나는 게임 서비스 주위에 작은 도우미 클래스를 만들었습니다 http://roy-t.nl/index.php/2010/08/25/xna-accessing-contentmanager 언제 어디서나 게임 서비스 컨테이너 및 그래픽 장치 / 나는 그것을 많이 사용합니다.


답장을 보내 주셔서 감사합니다. 서비스가 필요한 클래스에서 일반적으로 필요할 때마다 서비스에 대한 GameServices 클래스를 요청합니까, 아니면 클래스에서 멤버 변수를 생성하고 생성자에서만 서비스를 요청합니까? 나는 내가 묻는 것이 얼마나 느리다고 생각한다 return (T)Instance.GetService(typeof(T));.
John Pollick

또한 GameServices 클래스 의이 구현 에 대해 어떻게 생각 하십니까? 추상화에없는 기능이 없기 때문에 불필요한 싱글 톤을 제거했습니다. 또한 Service모든 방법이 끝날 때 중복 접미사를 제거했습니다 .
John Pollick

또한 서비스 AddService메소드가 유형을 취하는 이유는 서비스 의 인터페이스를 지정할 수 있기 때문이라고 생각합니다 . 예를 들면 다음과 같습니다 Services.AddService(typeof(IGraphicsDeviceManager), graphics);. 그런 다음 서비스를 검색 할 때 인터페이스를 유형으로 지정하고 선택한 서브 클래스로 캐스트 할 수 있습니다.
John Pollick

첫 번째 질문은 @JohnPollick입니다. 나는 항상 그것을 요청하려고 노력하지만 (변경 될 수 있기 때문에) 매 프레임마다 무언가가 필요하다면 멤버 변수를 만듭니다. 나는 병목 현상이 없었던 것 이외의 많은 성능 통계를 가지고 있지 않습니다. 두 번째, 그래, 좋아 보인다 :). 그리고 세 번째. 이것이 실제로 타입 인수의 이유이지만, 검색된 값을 다운 캐스트하는 습관을 버리지 마십시오. 클래스를 서비스로 교환하는 기능을 파괴하기 때문입니다. IGraphicsDeviceManger를 원하지 않고 MyGDM을 원한다면 새로운 인터페이스를 만들 수 있습니다.
Roy T.

1
오, 당신도 캐스트를 보지 못했습니다. 물론 먼저 캐스팅하면 유형을 유추 할 수 있습니다. :).
Roy T.

5

그렇다면 왜 이러한 인스턴스를 싱글 톤으로 만들지 않겠습니까? 글쎄, 싱글 톤은 전역 상태를 가지고 있기 때문에 나쁘기 때문에 테스트를 방지하고 디자인을 훨씬 취하기 쉽게 만듭니다.

싱글 톤은 일반적으로 많은 유용한 특성을 취해 원하지 않는 여러 가지를 원하는 끔찍한 하이브리드로 묶습니다. ( '요청시 생성'특성입니까? 글로벌 범위? 하나 이상의 인스턴스 시행? 여러 인스턴스 금지?)

서비스 로케이터는 객체에 대한 종속성을 전달하는 대신 해당 클래스를 나머지 서비스와 연결하는 서비스 로케이터 (게임)를 전달하기 때문에 많은 사람들에게 반 패턴으로 간주됩니다.

당신은 완전히 결합을 피할 수 없습니다. 물건은 다른 것을 사용하고 프로그램이 없으면 아무것도하지 않습니다. 따라서 유일한 실제 질문은 추상화 수준에 있습니다.

객체 방향의 텍스트는 대부분 컴포지션과 집계를 구분합니다. 소유하고있는 것과 알고있는 것과의 개념적 차이를 아는 것이 중요합니다. 불행히도 대부분의 현대 언어는 여기에 명확한 구별이 없으며, 객체에 대한 언급은 이러한 것들 중 하나를 의미 할 수 있습니다. (다양한 스마트 포인터 유형을 사용하면 C ++이 더 잘 작동합니다.)

당신이있는 한 가지 방법은 수 있습니다 조성하고 코드에서 명확한 집계는 집계 개체에 대한 서비스를 사용하는 것입니다. 서비스는 소유하지 않지만 사용할 수있는 항목에 대한 액세스를 제공하는 한 가지 방법입니다.

그렇다면 XNA 및 게임 개발에서 왜 서비스가 권장됩니까?

나는 그들이 게임 개발에서 보편적으로 권장되는 것이라고 생각하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.