总结:
对象 A 具有抛出异常的方法 { m1, m2, ... };验证后,其中一些方法将不再为人所知throw
。在 OO 中对验证阶段的这种进展进行建模,其中,当检查运行并返回肯定结果时,对象被“提升”到对其方法的可靠性更高的置信度,并且不再对客户端进行异常检查
完整版:
您能否建设性地批评这种设计选择:
接口描述对象“类”的能力。要“成为”一个这样的对象,实例支持接口协议就足够了,该协议仅建立“尝试”一定数量的事物的能力(实现抛出异常的方法)
上述例子的一个简单的存在形式是所有操作都可以尝试但预计会有很多失败的阶段(未受过教育的野蛮人是一个人,因为他可以尝试人类的所有任务,但没有人会在他们中的任何一个的成功上打赌)
基本接口的子类型保持相同的功能,但表示高级验证的完成,以便保证其某些操作始终成功。这种“提升”和演员阵容遵循对内部状态和合同先决条件的检查,以“升级”对象的顺序
您能否指出相应的模式或反模式(如果您想阻止我采用这个想法),它们捕获了通过验证阶段进行的对象的相同概念,有关基本操作可靠性的信息随着渐进式检查?
我试图通过接口层次结构对此进行建模,其中操作都在具有相关检查异常的基本接口中,但存在异常从方法签名中消失的子类型(子接口)。
在这里发布之前,我考虑了装饰器模式,但它在许多层面上都无法将耳朵标记对象的原理建模为“在某一点上得到验证”。我还考虑了“组合而不是继承”,其中有关验证阶段的元数据(枚举?)被组合到对象中并switch
继续编辑。
主要目标是:
当对对象的给定“样本”一无所知时,让客户检查异常
当对象已发送到验证层并以“已检查且正常工作”的形式返回时,客户不必承担检查异常的责任。使用高阶接口意味着:“这使用起来既快速又安全”
允许客户选择立即尝试使用该对象,但处理可能发生的奇怪情况,或者在尝试调用其方法之前将其转发给验证缓慢的委托。当然,委托返回对象的高阶接口转换以表示可靠性
接下来是幽默的演绎,即使设计困境对我来说实际上是最重要的:
interface CivilisedMan extends Man {
@Override
void act();
}
interface Man {
void act() throws UnreasonableBehaviourException;
}
class UnreasonableBehaviourException extends Exception {
public UnreasonableBehaviourException(String embarrassingCircumstance) {
super(embarrassingCircumstance);
}
}
public class StackOverflow {
public static void main(String[] args) {
Man williamConnollyJr = new Man() {
@Override
public void act() throws UnreasonableBehaviourException {
throw new UnreasonableBehaviourException("F*rt!");
}
};
CivilisedMan harryPotter = new CivilisedMan() {
@Override
public void act() {
System.out.println("Swish and flick.");
}
};
try {
williamConnollyJr.act();
} catch (UnreasonableBehaviourException unreasonableBehaviourException) {
System.out.println(unreasonableBehaviourException.getMessage());
}
harryPotter.act();
}
}
如果需要,我可以放弃这个设计并重新开始,但我需要一些备份参考来做到这一点......
注意:这种行为模式在生活中经常发生。你拿起一个新物体,对它一无所知,并且对如何扔它/旋转它/变形它/...你检查它和“尝试它”的次数越多,你就越能建立信心关于该对象对每个设想的动作的适用程度...