2014-04-25 3 views
2

저는 현재 성을 방어해야한다는 게임이었습니다. 각 레벨은 적들이 들어 와서 공격하는 레인에서 구성됩니다. 성은 모든 레벨에서 동일합니다. 레벨 1에서 성이 손상되면 레벨 2에서 같은 건강 포인트로 "산란"합니다. 그래서 제가 게임의 시작에서 한 것은 성 개체 하나를 만들고 게임의 나머지 부분에서 이것을 유지하는 것입니다. 여기 패턴이있는 게터 체인을 피하십시오.

내 "디자인"을 명확히하기 위해 그림이다 :

enter image description here

를 지금 적들이 성과 내 코드 피해에 도착하면 다음과 같다 : '케이

this.getLane().getLevel().getGame().getCastle().doDamage(1); 

정말 잘 보입니다. 나는 더 깨끗한 해결책을 제시하기 위해 몇 가지 디자인 패턴을 조사해 왔지만 실제로는 찾지 못했고 누군가 아이디어가 있는지 궁금해하고있었습니다.

(나는 aswell 거기 게터 체인에 대한이 질문이 알고 : https://stackoverflow.com/questions/8744668/java-getter-chaining-bad-or-good 는하지만 정말 해결책을 마련하지 않는)이 변환

+0

[태그 : law-of-demeter]를 태그로 추가했습니다.이 질문은 본질적으로 그 원칙에 묶여 있기 때문입니다. 따라서, http://stackoverflow.com/questions/163071/coupling-cohesion-and-the-law-of-demeter – Fuhrmanator

답변

5

한 가지 방법 :에

this.getLane().getLevel().getGame().getCastle().doDamage(1); 

을 이 :

this.doDamage(1); 

게임, 레벨 및 레인 클래스에 대해 doDamage 메서드를 작성합니다. 제한된 수의 연결된 전화가있는 경우이 방법이 효과적입니다.

게임 클래스 메서드는 다음과 같이 보일 것이다 :

public void doDamage(int damage) { 
    getCastle().doDamage(damage); 
} 

등 레벨 및 레인 클래스를.

+0

책임을 위반하지 않았습니까? Lane 클래스가 doDamage() 메서드를 사용한다는 것은 나에게 의미가있는 것처럼 보입니다. – maigelm

+0

@ user2423268 : 아마도. 피해를 어떻게 처리 할 것인가는 당신의 선택입니다. 클래스 계층 구조를 사용하면 체인 메소드 호출이 가능합니다. 체인 메소드 호출을 원하지 않는다면, 나는 그것들을 제거하는 한 가지 방법을 설명했다. 또 다른 방법은 성을 직접 거래하고 내부 조직을 숨기는 것입니다. –

+0

@ user2423268 : 무차별 객체 참조를 기반으로하는 언어 및 프레임 워크의 한 가지 제한점은 "점"의 오른쪽이 보일 때까지 표현식의 왼쪽 부분의 역할이 완료된다는 것입니다. 정말로 필요한 것은 이벤트를 연결하거나 분리하는 것에 대해 걱정할 필요없이 오른쪽이 완료되면 왼쪽에 알림이 표시되는 효율적인 방법입니다. – supercat