2017-02-23 58 views
5

Khi tôi đang làm việc trên một dự án của tôi và phải sử dụng rất nhiều đối tượng lồng nhau, tôi trở nên rất không chắc chắn về thiết kế của mình về cấu trúc trong Java khi tôi muốn đặt một biến mẫu của một đối tượng lồng nhau sâu từ đối tượng trên. Nó cảm thấy như tôi bỏ lỡ một sự hiểu biết cơ bản có lẽ về thiết kế có cấu trúc trong Java. Bất kỳ cái nhìn sâu sắc trong này được đánh giá cao.Thiết kế java: các phương thức lặp lại của các đối tượng phụ

Hãy tưởng tượng tôi có một đối tượng có cấu trúc logic có các đối tượng con lồng nhau dưới dạng biến. Ví dụ:

Country 
    Capital 
    Palace 
     King 

Nếu bây giờ tôi muốn thiết lập một chuỗi tin biến 'nameOfKing' trong Vua từ đối tượng chính (Quốc gia), tôi sẽ phải xác định tất cả các phương pháp trong tất cả các tầng lớp thượng lưu của vua. Vì vậy, một cái gì đó như thế này:

public class Country { 
    private Capital capital; 

    public void setNameOfKing(String n) { 
     capital.setNameOfKing(n); 
    } 
} 

public class Capital{ 
    private Palace palace; 

    public void setNameOfKing(String n) { 
     palace.setNameOfKing(n); 
    } 
} 

public class Palace{ 
    private King king; 

    public void setNameOfKing(String n) { 
     king.setNameOfKing(n); 
    } 
} 

public class King{ 
    private String nameOfKing; 

    public void setNameOfKing(String n) { 
     this.nameOfKing = n; 
    } 
} 

để tôi có thể gọi country.setNameOfKing(n);. Bây giờ điều này là tốt nếu bạn chỉ có một vài biến, nhưng nếu các lớp King, Palace, Capital từng có nhiều biến và phương thức khác được định nghĩa và tất cả chúng phải được gọi từ Quốc gia. Điều gì sẽ xảy ra nếu Palace cũng chứa các đối tượng lớp khác như (chỉ cần tạo nội dung ngay bây giờ) ThroneRoom, Treasury, Queen, v.v. Điều đó có nghĩa là đối với hầu hết tất cả các phương thức trong các lớp con, người ta phải tồn tại trong lớp Country. có khả năng có nghĩa là bạn phải tạo ra một số lượng lớn các phương pháp đơn giản để thông qua thông tin để các đối tượng phụ dẫn đến một lớp nước rất lớn. Bây giờ tôi giả sử bạn có thể nói rằng King cũng có thể được định nghĩa trong chính quốc gia, loại bỏ các phương thức bổ sung trong Palace và Capital, nhưng nó vẫn có nghĩa là các phương thức phải tồn tại trong lớp Quốc gia và điều gì sẽ xảy ra nếu cấu trúc này có ý nghĩa như trong logic nhóm lại với nhau, những gì sẽ là cách tiếp cận tốt nhất cho việc này? Tôi không chắc là có cách nào tốt hơn, nhưng tôi không thể lay động cảm giác mình đang thiếu thứ gì đó ở đây.

+0

để 'getPalace setFoo().() 'Không phải là một lựa chọn? –

+0

Vì vậy, bạn có nghĩa là thay đổi methid trong lớp nước như thế này? 'capital.getPalace().setNameOfKing (n); 'Nó sẽ thay đổi thực tế rằng bạn có khả năng có thể có một số lượng lớn các phương thức trong lớp Quốc gia – lokipoki

Trả lời

4

Đây là vấn đề có trách nhiệm.

Tự hỏi mình: "Ai chịu trách nhiệm biết ai là vua?". Khi bạn là cung điện, bạn có trách nhiệm với nhà vua không? Rõ ràng là không. Nhà vua không được quản lý bởi cung điện của bạn, nhưng ông được gắn liền với quốc gia của bạn theo luật.

Truy vấn palace.setNameOfKing() cũng tương tự như yêu cầu nhà của bạn đặt tên cho trẻ sơ sinh của bạn. Ngôi nhà của bạn không có tính linh hoạt này và không được phép làm điều đó.

Cách đúng để làm điều đó là để lấy ví dụ King, và đặt tên của nó trực tiếp.


Bây giờ có một vấn đề với cách tiếp cận này: bạn có thể phải sử dụng nhiều getters để tìm dụ King. Nhưng bạn có thể giải quyết vấn đề này bằng cách tiếp cận chức năng của các Lớp học của bạn.

palace.getOwner() có thể trả về giao diện Owner với King implements Owner.

Các quy tắc tương tự có thể được áp dụng cho các lớp học khác của bạn.

+2

Vâng, đó là vấn đề trách nhiệm và tôi thậm chí còn đi thêm một bước nữa và thậm chí không cho phép đặt tên của nhà vua từ lý thuyết ở khắp mọi nơi bằng cách cung cấp một phương thức setter công cộng. –

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