Giả sử tôi có các loại dữ liệu sau:Kế thừa và đóng gói các lớp học tập trong Java
class Customer {
String id; // unique
OtherCustData someOtherData;
}
class Service {
String url; // unique
OtherServiceData someOtherData;
}
class LastConnection {
Date date;
OtherConnData someOtherData; // like request or response
}
Bây giờ tôi cần phải nhớ khi mỗi người trong số các khách hàng kết nối với nhau của các dịch vụ.
tôi sẽ làm cho cấu trúc:
Map<Customer, Map<Service, LastConnection>> lastConnections;
Hoặc, để có thể tìm kiếm bằng id và không phải viết tất cả các bằng() và hashCode():
Map<String, Map<String, LastConnection>> lastConnections;
Bây giờ tôi có thể truy cập dữ liệu LastConnection của
LastConnection connection = lastConnections.get(custId).get(srvUrl);
Tất cả điều này có vẻ xấu xí, đặc biệt là tôi phải chuyển nó thành tham số cho hàng chục phương thức mong đợi ánh xạ bản đồ của LastConnections, s o Tôi đang nghĩ đến việc tạo các lớp học của riêng tôi mà sẽ giống như thế:
class CustomerConnections extends HashMap<String, LastConnection> {
}
class AllConnections extends HashMap<String, CustomerConnections> {
public LastConnection get(String custId, String srvUrl) {
return get(custId).get(srvUrl);
}
}
Ok, tôi đã học đã thừa kế đó là 3v1l, vì vậy chúng ta hãy cố gắng sáng tác:
class CustomerConnections {
Map<String, LastConnection> customerConnections;
LastConnection get(String srvUrl) {
return customerConnections.get(srvUrl);
}
... // all other needed operations;
}
class AllConnections {
Map<String, CustomerConnections> allConnections;
public LastConnection get(String custId, String srvUrl) {
return get(custId).get(srvUrl);
}
public CustomerConnection get(String custId) {
return allConnections.get(custId);
}
... // all other needed operations;
}
Vấn đề là Tôi không chắc chắn những gì sẽ là cách tiếp cận tốt nhất tôn trọng các nguyên tắc SOLID và tất cả các thực hành tốt nhất. Việc tạo các lớp không làm gì ngoại trừ việc mở rộng các bộ sưu tập đã tồn tại có vẻ như nhân các thực thể ngoài sự cần thiết, nhưng sẽ làm cho mã của tôi rõ ràng hơn (Đặc biệt là khi có các cấp tiếp theo - như Bản đồ của AllConnections theo tháng và vv). Bất kỳ hướng nào?
Ngoại trừ một số ít "tất cả các hoạt động cần thiết khác" bình luận ẩn đi một số lượng cực đoan của phái đoàn lò hơi. –
@Michael Điểm công bằng – butterchicken
Mặc dù bạn chỉ phải thực hiện việc này một lần. Bản đồ DelegatingMap Bản đồ có thể được sử dụng làm lớp cơ sở cho tất cả các phần mở rộng như vậy. –
paulcm