GWT 的 ActivityMapper 是不是违反了 Liskov 替换原则?
Posted
技术标签:
【中文标题】GWT 的 ActivityMapper 是不是违反了 Liskov 替换原则?【英文标题】:Does GWT's ActivityMapper violate the Liskov Substitution Principle?GWT 的 ActivityMapper 是否违反了 Liskov 替换原则? 【发布时间】:2012-01-12 05:04:56 【问题描述】:在我的 GWT 应用程序中,我有一个这样的类:
public class AppActivityMapper implements ActivityMapper
@Override public Activity getActivity(Place place)
if(place instanceof ThisPlace)
return new ThisActivity((ThisPlace)place);
if(place instanceof ThatPlace)
return new ThatActivity((ThatPlace)place);
if(place instanceof AnotherPlace)
return new AnotherActivity((AnotherPlace)place);
// you get the idea
ActivityMapper、Activity 和 Place 对象是框架的一部分,界面暗示这就是它的用途。
但是,根据Liskov Substitution Principle,接受类型但对子类进行类型检查以推断要采取什么行动的方法违反了原则。
GWT 的 ActivityMapper 接口本质上是否鼓励违反 LSP?还是有另一种我没有想到的符合 LSP 的方法来编码该方法?
【问题讨论】:
【参考方案1】:ActivityMapper
的作用是将Place
映射到Activity
,其中映射规则完全免费。
导致这种 if/else 级联的是 Java 不支持multiple dispatch,但在我看来,这并不意味着它违反了 LSP(或者至少,好吧,你在 Java 中别无选择,所以这不是问题;您可以使用访问者模式——这就是 Spring Roo 生成的——但这并没有改变太多东西)。
【讨论】:
经过更多阅读,我想违反 LSP 取决于您是否可以通过让客户端使用子类调用此方法来破坏客户端。这似乎实际上是映射方法的意图,所以在这种情况下,instanceof 的 if/else 级联可能不会自动违反 LSP。感谢您提及访问者模式......似乎有更多关于此方法的实现的讨论here。以上是关于GWT 的 ActivityMapper 是不是违反了 Liskov 替换原则?的主要内容,如果未能解决你的问题,请参考以下文章
如何知道一个对象对于 GWT 和 IE8 中的 RPC 是不是“太大”?