2009-09-01 27 views
8

đây là một vấn đề tôi phải đối mặt với rất nhiều lần khi tôi đang thiết kế một ứng dụng mới tôi sẽ sử dụng một bài toán mẫu để giải thích nàytoàn cầu Nhà nước và Singletons Dependency Injection

nghĩ rằng tôi đang viết game.so đơn giản tôi muốn để giữ danh sách người chơi. tôi có vài lựa chọn ..

1.Use một lĩnh vực tĩnh trong một số lớp

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

nhưng điều này tình trạng toàn cầu

2.or tôi có thể sử dụng một singleton

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

nhưng điều này là xấu bởi vì nó là một singleton

tiêm 3.Dependency

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

này có vẻ tốt, nhưng nó không phải là, nếu có đối tượng bên ngoài trò chơi cần phải nhìn vào PlayerList (đó là trường hợp thông thường) tôi phải sử dụng một trong các phương pháp trên để làm cho lớp Trò chơi có sẵn trên toàn cầu. vì vậy tôi chỉ cần thêm một lớp khác vào sự cố. đã không thực sự giải quyết bất cứ điều gì.

giải pháp tối ưu là gì? (hiện tại tôi đang sử dụng phương thức Singleton)

Trả lời

1

Ý tưởng đằng sau việc tiêm phụ thuộc là tên gọi để đưa vào các phụ thuộc. Vì vậy, bất cứ điều gì đối tượng cần biết về danh sách người chơi sẽ được tiêm với nó. Thông thường, việc sử dụng tiêm phụ thuộc càng nhiều càng tốt trước khi chuyển sang tra cứu phụ thuộc hoặc một số cơ chế khác. Điều này cũng sẽ làm cho nó có thể mở rộng các trò chơi sau này để có danh sách cầu thủ khác nhau cho các cấp độ khác nhau hoặc bất cứ phần mở rộng bạn có thể suy nghĩ về.

+0

k, nhưng phải làm gì khi tôi muốn sử dụng phiên bản PlayerList ở một số nơi khác? – Manu

+2

Bạn sẽ lại tiêm nó. Một khung công tác như Spring (miễn là bạn lập trình Java) sẽ làm cho việc này dễ dàng hơn nhiều cho bạn. Bất kỳ thứ gì không phải là dịch vụ hay singleton và do đó không thể được tiêm hợp lý với PlayersList sẽ được tạo ra bởi một số loại nhà máy mà lần lượt có thể được tiêm với PlayerList và có thể truyền nó cùng với các đối tượng mà nó tạo ra. Tuy nhiên, nếu bạn kết thúc việc đưa PlayerList của bạn vào mỗi đối tượng, bạn nên có một số suy nghĩ thứ hai về thiết kế của bạn đặc biệt là đóng gói và ẩn thông tin. –

1

Nếu bạn cần Danh sách phát bên ngoài Trò chơi, có thể Trò chơi là lớp sai cho điều này? Nếu bất kỳ đối tượng nào khác cần PlayerList, hoặc là họ cần phải có Danh sách được tiêm là tốt, hoặc có thể bạn nên di chuyển danh sách đến lớp này thay vì lớp Game.

Nếu bạn có thời gian hoạt động khác nhau cho Trò chơi, Danh sách người chơi và các Lớp khác, cũng có thể xem xét sử dụng một Nhà máy để nhóm chúng. Kiểm tra số Google Testing Blog article để biết chi tiết.

+0

1) có thể Trò chơi là lớp sai cho điều này, nhưng vẫn còn nếu tôi đặt bên trong lớp khác, vấn đề vẫn còn đó. Bởi vì bây giờ tôi không thể sử dụng nó trong lớp trò chơi. 2) thông qua PlayerList cho tất cả các lớp học yêu cầu không có ý nghĩa, sin họ được thực hiện trong lớp Nhà máy deffrent. – Manu

4

Đó là lý do DI Containers quản lý vòng đời. Hãy để Playerlist trở thành một singleton về vòng đời của container. Cung cấp cho bạn đầy đủ khả năng thử nghiệm của các thành phần và cho phép các container (không phải bạn) có được bàn tay của mình bẩn.

+0

+1 - Bạn đánh vào đầu! – TrueWill

Các vấn đề liên quan