【发布时间】:2016-06-10 07:24:04
【问题描述】:
昨天我讨论了架构编码风格以及方法的调用者或方法的逻辑是否应该决定一些事情。
目前是如何完成的(简化):
有一个类 Page 有一个 List<Hotel> 作为属性。
public class Page {
private String name;
private List<Hotel> hotels;
}
决定在方法中包含业务逻辑,以便调用者不关心页面信息是如何设置的。
public void fillPageWithHotels(Page page, List<DummyInfo> dummyInfos){
//business logic...
List<Hotel> hotels = new ArrayList<>();
for(DummyInfo di : dummyInfos){
//create a hotel instance and fill the infos of dummy inside hotel attributes
Hotel h = new Hotel(di.getName());
//many other information set to hotel attributes...
hotels.add(h);
}
//important part here. The List of hotels is set here to the page
page.setHotels(hotels);
}
第一个问题:这是一个好的设计还是该方法应该返回List<Hotel>?
我为什么问这个问题:
现在我有另一个扩展 Hotel 的课程。 public class HotelDetail extends Hotel HotelDetail 现在也是 Page 对象中的一个属性。
而且我还必须调用fillPageWithHotels 方法。但现在我不需要Hotel 而是HotelDetail 实例。
调用者无法决定他需要Hotel 还是HotelDetail。
- 所以在方法内部你需要做决定
if(decisionIsHotel){ new Hotel()} else {new HotelDetail()}并将其交给页面。 (我个人不喜欢的) 或者该方法现在应该是通用的吗?表示从方法参数中取出
Page并具有通用返回类型。public <T extends Hotel> T fillPageWithHotels(List<DummyInfo> dummyInfos){}?或其他更好的代码/架构风格。
解决这个问题的最佳架构风格是什么?
编辑1:
我的第一种方法:我不给 Page 作为方法参数,而是给一个通用返回类型:
public <T extends Hotel> List<T> fillPageWithHotels(Class<T> c, List<DummyInfo dummyInfos){
//business logic...
List<T> hotels = new ArrayList<>();
for(DummyInfo di : dummyInfos){
//create a hotel instance and fill the infos of dummy inside hotel attributes
T t = c.newInstance();
//many other information set to hotel attributes...
hotels.add(t);
}
return hotels;
}
【问题讨论】:
标签: java oop generics methods architecture