【问题标题】:Who should decide? The caller or the business logic of method? Architecture style谁应该决定?调用者还是方法的业务逻辑?建筑风格
【发布时间】: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&lt;Hotel&gt;

我为什么问这个问题:

现在我有另一个扩展 Hotel 的课程。 public class HotelDetail extends Hotel HotelDetail 现在也是 Page 对象中的一个属性。

而且我还必须调用fillPageWithHotels 方法。但现在我不需要Hotel 而是HotelDetail 实例。

调用者无法决定他需要Hotel 还是HotelDetail

  • 所以在方法内部你需要做决定 if(decisionIsHotel){ new Hotel()} else {new HotelDetail()} 并将其交给页面。 (我个人不喜欢的)
  • 或者该方法现在应该是通用的吗?表示从方法参数中取出Page 并具有通用返回类型。 public &lt;T extends Hotel&gt; T fillPageWithHotels(List&lt;DummyInfo&gt; 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


    【解决方案1】:

    在我看来,管理方法参数的状态并不是一个好主意。

    如果方法是类的一部分,我们可以简单地删除第一个参数:

    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));
    

    如果调用者不能决定他需要什么类型,他就不能指定泛型。

    【讨论】:

    • 感谢您的回答。用另一种方法更新了我的答案。你怎么看?
    • 正如我所说,如果此方法的用户无法决定他需要哪个 Hotel 实现作为返回类型,那么泛型将毫无用处。 OOP 原则之一是“编程到接口而不是实现”
    • 我之前的评论适用于你最初的目标“调用者不关心页面信息是如何设置的”。
    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多