2009-09-01 6 views
8

이 내가 설명하는 샘플 문제를 사용합니다 새로운 응용 프로그램 을 설계하고 때 나는 시간을 많이 직면 문제이글로벌 국가와 싱글 톤 의존성 주입

난 내가 원하는 간단한 game.so을 쓰고 생각입니다 선수 명단을 들고있다. 내가 몇 가지 옵션이 ..

일부 클래스

private static ArrayList<Player> players = new ArrayList<Integer>(); 
public Player getPlayer(int i){ 
    return players.get(i); 
} 

의 정적 필드 1. 한

하지만 글로벌 상태

2.or 내가 싱글을 사용할 수 있습니다

class PlayerList{ 
    private PlayerList instance; 
    private PlayerList(){...} 
    public PlayerList getInstance() { 
     if(instance==null){ 
      ... 
     } 
     return instance; 
    } 
} 

하지만 싱글이기 때문에이 나쁜

3.Dependency 주입

class Game { 
    private PlayerList playerList; 
    public Game(PlayerList list) { 
     this.list = list; 
    } 
    public PlayerList getPlayerList() { 
     return playerList; 
    } 
} 

이 좋은 것 같지만 게임 외부 개체 인 (PlayerList 볼 필요가있는 경우는,하지 입니다 일반적인 경우) 위의 방법 중 하나를 사용하여 Game 클래스를 전역 적으로 사용할 수있게해야합니다. 그래서 난 그냥 문제가 다른 레이어를 추가. 실제로 아무 것도 해결하지 못했습니다.

최적의 솔루션은 무엇입니까? (현재 싱글 톤 접근법 사용)

답변

1

의존성 주입 개념은 종속성을 주입하기위한 이름 상태와 같습니다. 따라서 플레이어 목록에 대해 알아야 할 오브젝트가 무엇이든간에 함께 주입됩니다. 일반적으로 종속성 조회 나 다른 메커니즘으로 전환하기 전에 가능한 한 광범위하게 종속성 주입을 사용하는 것이 좋습니다. 이것은 또한 다른 레벨이나 다른 확장 기능에 대한 다른 플레이어 목록을 갖기 위해 나중에 게임을 확장 할 수도 있습니다.

+0

k,하지만 PlayerList 인스턴스를 다른 곳에서 사용하려면 어떻게해야합니까? – Manu

+2

다시 삽입하십시오. Spring과 같은 프레임 워크 (자바 프로그래밍을 제공한다)를 사용하면 훨씬 쉽게 작업 할 수있다. 서비스 나 싱글 톤 자체가 아니기 때문에 플레이어리스트를 합리적으로 삽입 할 수없는 것은 일종의 팩토리에 의해 만들어지며, 플레이어리스트에는 아주 잘 삽입 될 수 있고 생성 된 객체에 전달 될 수 있습니다. 그러나 각 객체에 PlayerList를 삽입하면 결국 캡슐화와 정보 숨기기에 대한 생각이 달라집니다. –

1

GameList 외부에서 PlayerList가 필요하다면 Game이 잘못된 클래스일까요? 다른 객체에 PlayerList가 필요한 경우 목록을 삽입해야하거나 Game 클래스 대신이 클래스로 목록을 이동해야합니다.

게임, PlayerList 및 다른 클래스의 수명이 다른 경우 팩토리를 사용하여 그룹으로 묶는 것이 좋습니다. 자세한 내용은 Google Testing Blog article을 확인하십시오.

+0

1) 어쩌면 게임이 이것에 대한 잘못된 클래스이지만, 여전히 다른 클래스에 넣으면 문제가 여전히 남아 있습니다. 이제 게임 클래스에서 사용할 수 없습니다. 2) PlayerList를 필요한 모든 클래스에 전달하는 것은 의미가 없으므로 클래스가 deffrent 팩토리 클래스로 만들어집니다. – Manu

4

그래서 DI 컨테이너가 라이프 사이클을 관리합니다. 플레이어 목록을 컨테이너 수명주기의 관점에서 보자. 구성 요소에 대한 완벽한 테스트 기능을 제공하고 컨테이너 (사용자가 아닌)가 손을 더러워 지도록합시다.

+0

+1 - 너는 머리에 못을 박았다! – TrueWill