0an*_*oid 5 java design-by-contract
我想知道好的合同在哪里结束,偏执狂开始了.真的,我只是不知道开发人员应该关心什么,他应该忘记什么:)
假设我有一个包含值的类,比如java.lang.Integer.它的实例由其他对象(MappedObjects)(一对多或多对多)聚合,并且经常在MappedObjects的方法中使用.出于性能原因,我还在TreeMap中跟踪这些关系(guava MultiMap,无所谓),以便能够快速迭代绑定到某些Integer键范围的MappedObjects.因此,为了使系统保持一致状态,我应该修改MappedObject.bind(整数整数)方法来更新我的Map,如:
class MappedObject {
public void bind (Integer integer) {
MegaMap.getInstance().remove(fInteger, this);
fInteger = integer;
MegaMap.getInstance().add(fInteger, this);
}
...
private Integer fInteger;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用这个最终方法制作抽象的MappedObject类,强制其他人继承它,但它很粗鲁.如果我将MappedObject定义为具有方法bind()的接口并提供骨架实现 - 其他开发人员可能稍后忘记将其包含在对象中并自己实现方法而不进行Map更新.
是的,您应该强迫人们使用您的代码做正确的事情。让人们做错事的一个很好的例子是 servlet 方法init( ServletConfig config ),它期望您自己存储 servlet 配置,但显然,很多人忘记存储配置,并且在运行他们的 servlet 时无法工作。
在定义API时,您应该始终遵循开放封闭原则,您的类应该对扩展开放,对修改封闭。如果您的类必须像这样工作,您应该只在有意义的地方打开扩展点,所有其他功能都不应该可供修改,因为这可能会导致将来出现实现问题。