谁来决定?调用者还是方法的业务逻辑?建筑风格
Who should decide? The caller or the business logic of method? Architecture style
昨天我讨论了架构编码风格,以及方法的调用者或方法的逻辑是否应该决定某些事情。
目前是怎么做的(简体):
有一个 class 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);
}
第一个问题:这是一个好的设计还是方法 return 应该是 List<Hotel>
?
为什么我问这个问题:
现在我有另一个扩展酒店的 class。 public class HotelDetail extends Hotel
HotelDetail
现在也是 Page
对象中的一个属性。
而且我还必须调用 fillPageWithHotels
方法。但现在我需要的不是 Hotel
而是 HotelDetail
实例。
来电者无法决定他需要 Hotel
还是 HotelDetail
。
- 所以在方法内部你需要做决定
if(decisionIsHotel){ new Hotel()} else {new HotelDetail()}
并将其交给页面。 (我个人不喜欢的)
或者该方法现在应该是通用的吗?意味着从方法参数中输出 Page
并具有通用的 return 类型。
public <T extends Hotel> T fillPageWithHotels(List<DummyInfo> dummyInfos){}
?
或其他更好的code/architecture样式。
这个问题的最佳架构风格是什么?
编辑 1:
我的第一种方法:我不给 Page
作为方法参数,而是给一个泛型 return 类型:
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;
}
在我看来,管理方法参数的状态不是一个好主意。
如果方法是 class 的一部分,我们可以简单地删除第一个参数:
class Page {
...
public void fillPageWithHotels(List<DummyInfo> dummyInfos){
...
setHotels(hotels);
}
}
否则可能是实用方法:
class Factory {
public static List<Hotel> createHotels(List<DummyInfo> dummyInfos){
...
}
}
...
page.setHotels(Factory.createHotels(dummyInfos));
如果调用者不能决定他需要什么类型,则不能指定泛型。
昨天我讨论了架构编码风格,以及方法的调用者或方法的逻辑是否应该决定某些事情。
目前是怎么做的(简体):
有一个 class 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);
}
第一个问题:这是一个好的设计还是方法 return 应该是 List<Hotel>
?
为什么我问这个问题:
现在我有另一个扩展酒店的 class。 public class HotelDetail extends Hotel
HotelDetail
现在也是 Page
对象中的一个属性。
而且我还必须调用 fillPageWithHotels
方法。但现在我需要的不是 Hotel
而是 HotelDetail
实例。
来电者无法决定他需要 Hotel
还是 HotelDetail
。
- 所以在方法内部你需要做决定
if(decisionIsHotel){ new Hotel()} else {new HotelDetail()}
并将其交给页面。 (我个人不喜欢的) 或者该方法现在应该是通用的吗?意味着从方法参数中输出
Page
并具有通用的 return 类型。public <T extends Hotel> T fillPageWithHotels(List<DummyInfo> dummyInfos){}
?或其他更好的code/architecture样式。
这个问题的最佳架构风格是什么?
编辑 1:
我的第一种方法:我不给 Page
作为方法参数,而是给一个泛型 return 类型:
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;
}
在我看来,管理方法参数的状态不是一个好主意。
如果方法是 class 的一部分,我们可以简单地删除第一个参数:
class Page {
...
public void fillPageWithHotels(List<DummyInfo> dummyInfos){
...
setHotels(hotels);
}
}
否则可能是实用方法:
class Factory {
public static List<Hotel> createHotels(List<DummyInfo> dummyInfos){
...
}
}
...
page.setHotels(Factory.createHotels(dummyInfos));
如果调用者不能决定他需要什么类型,则不能指定泛型。