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 是不是支持 netty ByteBuf?

GWT添加jar而不是项目

如何知道一个对象对于 GWT 和 IE8 中的 RPC 是不是“太大”?

GWT-RPC 服务是不是应该使用 java.io.Serializable 作为参数类型?

互助县公安局关于启用新建违停抓拍系统监控的公告

如何在Intellij IDEA 2018.2中调试GWT 2.8.1作为java代码而不是java脚本