class PictureList {
void clear();
void load(json);
void clearAndLoad(json);
void draw();
}
一般来说,
clear
需要在load
之前调用。
仅创建 clearAndLoad
可以避免错误,并强制每次以正确的顺序连续调用两个函数。
但是该规则也有例外,因此
clean
和 load
保留在界面中,以应对仅需要调用一个的特定情况。
这使您可以保持控制并处理这些异常,如果出现错误,您可以集中精力使用
clean
和 load
(异常调用)
这很有效,但你的公共 API 现在很混乱。你有冗余,没有办法分辨什么是标准接口,哪个是“专家接口”。
同样在编程中,我们经常说“一个函数应该只做一件事”,在这种情况下,
clearAndLoad
打破了这个规则,但不会引入错误,因为输入clear(); load(json);
比输入clearAndLoad(json);
更容易出错
如何解决公共界面中常见功能和“不太常见”功能之间的分离?
对您的描述的重构是,
PictureList
应始终支持clear
和load
,并且对于特定类型的PictureList
,需要在clear
之前调用load
。
您可以通过使用基类
BasePictureList
来实现此功能,其中包含 PictureList
中除 clearAndLoad
之外的所有方法,并通过调用父级的 load
和 clear
来重写
load
方法的特定实现连续:
public class BasePictureList {
void clear() { // };
void load(json) { // };
void draw() { // };
}
public class SpecificPictureList extends BasePictureList {
@Override
public load(json) {
super.clear();
super.load(json);
}
}