2012-03-16 16 views
0

基本クラスとこの基本クラスを拡張する2つのクラスと、派生クラスの1つだけが別のオブジェクトとの関係を持つときに、ドメインをモデリングする方法。オブジェクト指向設計モデリング

例:

public abstract class Base 
{ 
    public abstract void method(); 
} 

public class1 extends Base 
{ 
    public void method() 
    { 
     do some stuff 
    } 
} 

public class2 extends Base 
{ 
    private Class3 class3;  

    public void method() 
    { 
     do other stuff 
    } 

    public Class3 getClass3(){...} 

    public void setClass3(Class3 class3){...} 
} 

はリスコフの原則を破るこのモデルか?私はclass3とのこの関係のためにこのように考えるので、この関係なしにモデル化する方法や、この関係をBaseに移動する方法を理解しなければなりません。 Class2を扱うプログラムの一部がClass3の関係を処理する場合、私はclass2へのキャストなしで基本クラスでは作業できません。

これは正しいと思われますか?

明確化...

学習モデルで考えてみましょう。私たちはコースとCourseClassesを持っています。私たちはまた、オンラインコースとpresencialコースを持つことができます。 Presencialコースでは、このトレーニングの費用に直面することがあります。だからコストはpresencial環境にのみ意味があります。 CourseClassesは、範囲の日付または正式な日付を持つことができます。

今日、私はこのモデルがあります:

Course 
{ 
    ... 
} 

public abstract class CourseClass 
{ 
    private Course course; 

    // getter and setter to course 

    public abstract Enrollment enroll(Person student); 
} 

public class QuantitativeCourseClass 
{ 
    public Enrollment enroll(Person student) 
    { 
     // enroll for quantitative 
    } 
} 

public class RangeCourseClass 
{ 
    public Enrollment enroll(Person student) 
    { 
     // enroll for range 
    } 
} 

は今、私はコストに対処する必要がありますし、この瞬間presencialコースまで私には重要ではありませんが、今、唯一的環境をpresencialしても意味がかかります。

私の問題は、courseClassにいくつかのものが必要なため、CourseClassオブジェクトをコストモジュールで処理する必要がありますが、QuantitativeCourseClassは事前認証環境には意味がないため、コストの関係はRangeCourseClassです。

liskovについての質問は、私のチームにこのモデルでいくつかの変更を加えるように説得する方法です。

+0

具体的な例を教えてください。私が見る限り、あなたはLSPを破ることはありません。 Class3を扱うことができますが、 "Base"とは関係ありません。それは依然としてBaseオブジェクトに加えて独自の他のメソッドです。クライアントクラスが "Base"または "Class2"オブジェクトを必要とするかどうかによって異なります。 – DPM

+0

extendsキーワードを忘れてしまったようです。また、私はまだQuantitativeとRangeの意味とコストと "presenciality"との関係が何であるか分かりません。コードにコストを含めることもできます。 – DPM

+0

問題を説明する多くのことを忘れてしまったため、説明が役に立たないようです。あなたのオブジェクトは他のものを継承しません。あなたは「プレセンス」が何を意味するのかを定義しませんでした。 –

答えて

0

あなたはLSP(Liskov Substitution Principle)の方向性を混同していると思います.LSPは(強い)行動型のサブタイプであり、強い行動型のスーパータイプではありません。だから、LSPはあなたの例に反して動作していませんが、例のために:

このモデルはLiskovの原則を破っていますか?この とクラス3との関係であると思いますので、 なしでモデル化する方法や、この関係をベースに移動する方法を理解する必要があります。 Class3との関係を扱うためにClass2を扱うプログラム があると、 は、クラス2へのキャストなしで基本クラスでは動作しません。

あなたのモデルはLSPを破壊していません。Class2(すなわち、Baseに存在しない部分)を扱う変数varを使用するプログラムの一部がある場合は、をvar2をClass2に宣言する必要があります。したがってダウンキャストは必要ありません。 LSPはvarもBaseとして動作することを保証しているので、明示的なアップキャストは必要ありません。

1

class3がbaseとは関係がない場合は、ベースには含めないでください。コンパイラがそれを強制するので、あなたはLSPを "中断"できません。ダウンキャスティングは好まれるものではありませんが、そのようにしてもLSPを破ることはありません。

継承の目的は、「is-a」関係を持つことです。猫は動物です。トヨタは車です。

あなたが話していることは、物事を楽にしたいからといって、トヨタのエンブレムを車のクラスに移動させることです。それはまったく良いデザインではありません。

つまり、基本クラスに移動するのは、特定のクラスにダウンキャストするよりもデザインが悪いです。

+0

私はClass3のrealtionshipをBaseクラスに移動しようとしていません。これは悪いことです。私の本当の問題は、 "明確化された"モデルの下です(申し訳ありませんが、私はこれを証明しています。コストはRangeCourseClassに関連しますが、CourseClassオブジェクトを処理する必要があります。この場合、instanceofをRangeCourseClassに使用する必要があります。それが問題です。 – Leo

0

私が理解しているように、問題のアスペクト(ジオメトリなど)を知らなくても問題を表示することはできません。だから、私はあなたのアーキテクチャの意味を理解できません。たとえば、有名なLSP違反の例: Square:Rectangle - "side"のときにうまく見えます。しかし、使用を開始していくつかの機能を置くと、その問題を見ることができます。

関連する問題