2011-12-03 7 views
1

は、私のようなクラスを持っているので:GWTのActivityMapperはLiskovの置換原理に違反していますか?私の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、活動、および場所のオブジェクトは、フレームワークの一部であり、インターフェースが、これはそれが使用されることを意図された方法であることを意味します。

しかし、Liskov Substitution Principleによれば、タイプを受け入れるが、サブクラスがどのようなアクションを取るべきかをタイプチェックするメソッドは、原則に違反します。

GWTのActivityMapperインターフェイスは、性質上、LSPの違反を奨励していますか?あるいは、私が考えていないそのメソッドをコード化する別のLSP準拠の方法がありますか?

答えて

1

ActivityMapperの役割は、をActivityにマッピングすることです。マッピングの規則は完全に自由です。
この種のif/elseカスケードは、Javaがmultiple dispatchをサポートしていないことを意味しますが、私の意見では、それがLSPに違反しているとは限りません(少なくとも、Javaでは他に選択肢がありませんそれは問題ではなく、訪問者のパターンを使用することができます。これはSpring Rooが生成するものですが、多くの変更はありません。

+1

さらに読むと、LSPを違反するかどうかは、クライアントがこのメソッドをサブクラスで呼び出すことによって中断できるかどうかによって決まると思います。これは実際にマッピング方法の意図であるようです。この場合、instanceofのif/elseカスケードが自動的にLSPの違反ではないかもしれません。訪問者パターンに言及してくれてありがとう...このメソッド(here)の実装についてもっと議論があるようです(http://stackoverflow.com/questions/5802747/eliminating-gwt-activitymapper-boilerplate)。 – Jay

関連する問題