2015-12-27 25 views
0

我有一个名为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); 
} 

甚至我应该封装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...); 

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

回答

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

要真正知道这是否是您的案例的最佳方法,您需要了解有关您的系统的更多信息,了解用例以及模块之间的界限。我建议观看罗伯特马丁的视频上的接口分割原则和一般固体原则(https://cleancoders.com/category/solid-principles