2010年05月10日 10:49 "Antinomy"的内容
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath(); ...
这种典型的把钱包交给店员自己拿是比较普遍,关键问题我在使用DDD时也考虑过,如果我不让店员自己拿,那么在根实体中要增加一个方法如ctxt.getOptions_ScratchDir_AbsolutePath(),这个方法委托子对象去实现。这种重构就太频繁了,每次都要打开根对象,其实是破坏其封装,增加这种虚方法,这种做法显然比"把钱包交给店员自己拿"更荒唐一些,而且不符合“快直接”原则。
所以,出现这样矛盾,肯定是有什么地方出毛病,当然迪米特法则或SOLID原则不应该出问题,还是闲杂语言技术无法帮助我们迅速实现这个目标。
那么畅想一下,以后的语言如何解决这个矛盾呢?
一个想法就是:自动将getOptions().getScratchDir().getAbsolutePath()方法变为根对象ctxt的getOptions_ScratchDir_AbsolutePath(),也就是把一个有层次从抽象到细节的递归方式改为一个平面式的方法?这样好吗?不见得。
或者采取一种动态类型方法,凡是子对象的方法都自动成为根对象的方法?反正接口方式已经不合适,因为你不能让根对象和子对象实现同一个接口,也许Mixin或Trait这种混合组合方式或许可以。
还有一种纯粹以消息通讯,客户端调用根实体对象ctxt,发送的是一个getOptions().getScratchDir().getAbsolutePath()消息,那么ctxt接受到后,不一定是将自己的方法直接暴露给调用,而是在其子对象中自动寻找匹配的方法,委托其执行,这样效率就高多。
[该贴被banq于2010-05-10 12:10修改过]