2013-05-11 3 views
0

JAVA 상속을위한 학습 과정으로서 스케쥴러 클래스와 액터 클래스를 조합했습니다. 스케줄러 클래스는 액터 객체 목록을 생성하고 actor 객체를 호출하여 act() 객체를 호출합니다.스케쥴러와 액터 용 Java Roguelike 클래스와 서브 클래스 구조

이제 배우 클래스의 첫 번째 본능은 플레이어가 자신의 차례가 도착했을 때 플레이어가 스케줄러를 일시 중지 할 수 있도록 플레이어 액터에 스케줄러에 대한 참조를 전달하는 것입니다.

그래서 스케줄러 내에서, 나는 현재 배우에 대한 참조가이 스케줄러되는

actor.act(this); 

.. 다음을 수행 할 수 있습니다. 다음과 같이 내가 행동을 선언 할 수 있습니다 플레이어 클래스 내의 이제

...
@Override 
    public int act(Scheduler queue) 
    { 
     //need to pause scheduler here and wait for player to act 
     queue.lock(); 
     //wait for action from player 
        if (this.playerActionComplete) 
        { 
          queue.unlock(); 
        } 
    } 

이 올바른 OOP 접근 방식인가? 벌써 이상한 일들이 생겼고이 접근법에 인내해야하는지 궁금합니다.

건배!

+0

* 내 첫 번째 본능은 배우가 "스케줄러 일시 중지"(그 의미가 무엇이든)가 주어지면 배우가 시스템의 다른 모든 것을 멈추게 할 수 있다는 것입니다. –

+0

Hi Dave, 스케줄러는 턴베이스 시스템을 시행하므로 다른 스레드가 실행 중일 때 플레이어가 돌아 왔을 때 시스템이 타이어 점화 정지 상태가되어 플레이어 입력을 기다려야합니다. 그러나 이것은 배우들이 스케줄러를 참조하는 방법에 관한 질문에 관한 것입니다. 이것을 생각한 후에 Act() 메소드에서 schedule 매개 변수를 제거하고 객체 유형이 스케줄러 클래스 내의 플레이어인지 확인합니다. 그렇다면 스케줄러가 스스로를 쉽게 잠글 수 있습니다. –

답변

2

당신은 세 가지 주요 이유는이 방법으로 인내 안 :

1) 순환 종속성. 매개 변수로 this을 전달하면 일반적인 코드 냄새가납니다.

2) 단일 책임. 배우가 행동해야하며, 플레이어가 플레이해야하며 스케줄러가 일정을 잡아야합니다. 배우가 스케줄러를 제어하지 못하게하십시오. 배우 중 한 명이 Scheduler.unlock을 try finally 블록에 넣는 것을 잊어 버린 경우 어떻게할까요? 만약 당신이 일을 완전히 다른 방식으로 다른 유형의 스케줄러를 소개하고 싶다면?

3) 직접 반복하지 마십시오. 스케줄러가 사용할 수있는 다양한 액터가 있다고 가정하고 있습니까? 그렇다면 스케줄러를 잠그고 잠금 해제하는 데 모두 동일한 코드가 포함될 예정입니까? 또는 모두 동일한 추상 기본 클래스에서 상속해야합니까? 그렇다면 자신을 반복하지 않고 배우를 스케줄러에 단단히 연결하여 배우가 스케줄러없이 작업하는 것을 불가능하게 만듭니다.

왜 그냥 scheduler가 act의 호출을 중심으로 잠금 및 잠금을 호출하지 못하게합니까?

관련 문제