Class 分班

Class 分班,class,architecture,language-agnostic,Class,Architecture,Language Agnostic,我有一个名为UFDevice的类,为了初始化它需要一个位置字符串。 我还有一个名为UFResponse的类,它提供了一个位置 因为这个设备只需要一个位置,所以我应该把它放进去,这样它就可以在没有UFResponse的用例中初始化。 或者我应该传递整个响应,以防以后它需要更多的信息而不仅仅是位置 在伪代码中: foundDevice(Data data) { response = new UFResponse(data); device = new UFDevice(respons

我有一个名为UFDevice的类,为了初始化它需要一个位置字符串。 我还有一个名为UFResponse的类,它提供了一个位置

因为这个设备只需要一个位置,所以我应该把它放进去,这样它就可以在没有UFResponse的用例中初始化。 或者我应该传递整个响应,以防以后它需要更多的信息而不仅仅是位置

在伪代码中:

foundDevice(Data data) {
    response = new UFResponse(data);
    device = new UFDevice(response);
}
或:

或者我甚至应该将UFResponse封装在UFDevice中,因为目前它仅用于创建UFDevices:

foundDevice(Data data) {
    device = new UFDevice(data);
}
未来的可能性包括:

//maybe in the future I have saved a favourite location so need to do:
loadFavourite(String location) {
    device = new UFDevice(location);
}

//or device needs more info
device = new UFDevice(location, color, ...20 more parameters...);

我应该在哪里划定分隔线?更重要的是,我将来如何为自己做出决定?

这听起来像是一个接口分离的问题()。UFDevice是从UFResponse构建的,但它并不需要UFResponse包含的所有内容。它只需要它的一部分,当UFResponse在不应该影响UFDevice的区域发生变化时,您不希望UFDevice受到影响

一种方法是让UFResponse从名为UFDeviceParams的接口继承,如果这有意义(可能是多重继承),那么UFDevice应该在其构造函数中获得对UFDeviceParams的引用

这允许基于整个UFResponse或基于更轻量级的UFFavoriteParams实例(也继承自UFDeviceParams)初始化UFDevice,该实例仅包含位置+颜色等

foundDevice(Data data) {
  response = new UFResponse(data);
  device = new UFDevice(response);
}

loadFavourite(String location) {
  params = new UFFavouriteParams(location);
  device = new UFDevice(params);
}
要真正了解这是否是适合您的案例的最佳方法,您需要更多地了解您的系统,了解用例和模块之间的界限。我建议观看Robert Martin关于界面分割原则和整体坚实原则的视频()

foundDevice(Data data) {
  response = new UFResponse(data);
  device = new UFDevice(response);
}

loadFavourite(String location) {
  params = new UFFavouriteParams(location);
  device = new UFDevice(params);
}