假设您需要实现一个业务功能,它会设置某种类型的配置文件。
但是,根据接收数据的方式,设置配置文件的实现方式会有所不同。
例如,参数可以直接传递给能够
的对象setProfile();
或者,必须发现参数,并且必须通过
传递给个人资料setProfile(String[] data, Blah blooh);
在这种情况下,最好的方法是什么?我的意思是,设计明智如何构建这个?
我正在考虑使用具有抽象方法的接口,这有效,但会引入一些噪音。不确定如何最好地构建它。
答案 0 :(得分:5)
我总是对有很多重载的方法感到紧张。在这种情况下,我更喜欢将方法参数视为消息而不是参数,并构建一个如下的方法:
setProfile(ProfileData data)
ProfileData
类可以包含所有setProfile
方法中常见的数据,您可以为专门的setProfile
操作创建派生类。
如果您使用的序列化技术可以根据其结构自动保留ProfileData
对象,则此方法特别有用。
答案 1 :(得分:3)
我会将实际的配置文件抽象到它自己的类层次结构中,以封装它并将Generics添加到setProfile()
。当然,它确实增加了一些复杂性,但因为它也引入了间接性,代码将更加分离,从长远来看应该证明是有用的。
此外,实际的功能可能完全在其自己的类层次结构中,以使该部分也可插入,这意味着您手中有Strategy Pattern。但是,决定采用这种方法需要更多地了解您正在构建的系统,并且可能不适合您正在构建的系统。
快速举例:
/**
* Interface for describing the actual function. May (and most likely does)
* contain other methods too.
*/
public interface BusinessFunction<P extends Profile> {
public void setProfile(P p);
}
/**
* Base profile interface, contains all common profile related methods.
*/
public interface Profile {}
/**
* This interface is mostly a matter of taste, I added this just to show the
* extendability.
*/
public interface SimpleProfile extends Profile {}
/**
* This would be what you're interested of.
*/
public interface ComplexProfile extends Profile {
String[] getData();
Blah blooh();
}
/**
* Actual function.
*/
public class ComplexBusinessFunction implements BusinessFunction<ComplexProfile> {
public void setProfile(ComplexProfile p) {
// do whatever with p which has getData() and blooh()
}
}
/**
* And another example just to be thorough.
*/
public class SimpleBusinessFunction implements BusinessFunction<SimpleProfile> {
public void setProfile(SimpleProfile p) {
// do whatever with the empty profile
}
}
答案 2 :(得分:0)
对于Get / Set方法,我总是将set方法保持为单个输入。这是一个简单的对象,可能是像kbirmington所建议的更复杂的对象。我认为我的做法不仅仅是任何真正的设计优势。
值得记住的是,如果配置文件数据有10个属性并且它们仅提供9个属性,那么根据这10个属性实际上缺少哪些属性,可能需要编写9种不同的方法。
至少对于单个结构,有一个输入,此外如果结构改变,方法不仅仅是其中的代码。
在这方面,你正在编程一个接口,这是一个很好的设计范例。