分类

时间:2015-12-27 01:05:23

标签: class architecture language-agnostic

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

由于设备只需要一个位置,我应该接受它,以便它可以在没有UFResponse的某些用例中初始化。 或者我应该传递整个响应,如果以后需要更多信息而不仅仅是位置?

伪代码中的

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

或:

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

甚至我应该在UFDevice中封装UFResponse,因为它目前仅用于创建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...);

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

1 个答案:

答案 0 :(得分:0)

这听起来像是界面分离的问题(https://en.wikipedia.org/wiki/Interface_segregation_principle)。 UFDevice是从UFResponse构造的,但它不需要UFResponse包含的所有内容。它只需要它的一部分,并且当UFResponse在不应影响UFDevice的区域发生变化时,你不希望UFDevice受到影响。

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

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

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

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

要真正了解这是否是针对您的案例的最佳方法,需要了解有关您的系统的更多信息,了解用例以及模块之间的界限。我建议观看Robert Martin关于界面分割原理和SOLID原则的视频(https://cleancoders.com/category/solid-principles