web-dev-qa-db-ja.com

動的オブジェクトを処理する設計問題

さまざまな形状の燃料タンクのアプリケーションを書いています。

実行時にのみ、エンドユーザーから正確なタイプの戦車を受け取るという設計上の問題があります。サーバー側で動的オブジェクトを作成/処理する方法がわかりません。

たとえば、タンクには3つの幾何学的タイプの頭部(円錐、皿、および平面)を含めることができます。ヘッドのタイプごとに異なる方法で検証する必要があります。

Headという名前の親クラスを作成しました。このクラスには、すべての幾何学的なタイプのヘッド(直径、厚さなど)に共通するすべてのパラメーターがあります。各子クラス(ConicalDishedおよびFlat)はHeadを拡張し、独自のインスタンス変数を持っています。

エンドユーザーは、たとえば、円錐形のヘッドを持つタンクを選択し、必要なすべてのパラメーターを入力して、検証のためにサーバーに送信します。

この段階で私は行き詰まっています。動的データの処理方法がわかりません。 Factory設計パターンを使用するように提案されました。しかし、すべてのクラスには異なる変数があるため、それが正しい方向だとは思いません。

コンストラクターなしのコードとget/setメソッド

public class Head {
    private float headThickness=0;
    private float headThicknessTolerance=0;

    private ShapeOfHead headShape;
    private float knuckleRadius=0;
    private int numberOfHeadPieces=4;
    private HeadSide headSide;

    private Figure8_1WeldingDetails headLongitudinalWeld;
    private Figure9_1WeldingDetails headCircumferentialWeld;

    private Bracing headBracing;
}

public class DishedHead extends Head {
    private float dishedHeadDepth;  
}

public class ConicalHead extends Head {
    private float conicalHeadHeight;
}
1
moshiko netzer

私はコンストラクタで検証することを好みます。その背後にある考え方は、オブジェクトが存在するためにオブジェクトの状態が有効であることを知っているということです。

おそらく、何らかの理由でクライアントで検証できない可能性があります。いいねこの検証されていないデータを保持する別のタイプを作成します。それを要求モデルと呼ぶ人もいます。 DTOと呼ぶ人もいます。それは、キー値ハッシュテーブルにすることができます。このデータ構造を何と呼ぶか​​は、サーバーが取得してファクトリーに渡し、検証済みのHeadオブジェクトを構築することです。

その後、ファクトリはConicalHeadまたはDishedHeadを返すことができます。

または、頭の高さが負のディッシュヘッドをモデル化することもできます。 FlatHeadタイプを作成する手間を省きます。

真剣に考えるのはデータではありません。これらのタイプが使用される方法です。このデータは非公開にする必要があります。カプセル化。しかし、Headに実行を指示できる便利なことがまだあるはずです。

このHeadの設計を決定する前に、使用コードを確認してください。または、あきらめて、たくさんのパブリックゲッターを与えることになります。

3
candied_orange

Factoryデザインパターンを使用するように提案されました。しかし、すべてのクラスには異なる変数があるため、それが正しい方向だとは思いません。

基本的に多型についての混乱はありますか?つまり、同じことを異なる方法で行います。これは、プロパティではなくメソッドに関するものです。

これは次のようなものです(警告:おそらく無効Java構文)

Head dishTank  = TankFactory.Create( headType.Dish );
Head flatTank  = TankFactory.Create( headType.Flat );

dishTank.Validate(); // dish-specific validation
flatTank.Validate(); // flat-specific validation

上記の「コードビハインド」は次のとおりです。

public enum headType { Dish, Conical, Flat }

public class TankFactory {
    public Head Create( headType thisKind ) {
        Head tanked;

        switch( thisKind ) {
           case headType.Dish : {
              tanked = new DishedHead( thisKind ) ;
              break;
           }

           case headType.Flat: {
              tanked = new FlatHead( thisKind )
              break;
           }

        } // switch

        return tanked;
    }
}

public class Head {
    public headType whatAmI;

    // ignore other properties 

    public Head( headType thisKind ) {
       whatAmI = thisKind;
    }

    public bool Validate() { ... } // this will be over-ridden
}


public class DishedHead extends Head {
  private float dishedHeadDepth;  

  public DishedHead(headType thisKind) {
    super( thisKind );
  }

  // class properties are in scope. Parameters not needed.
  public bool Validate() { dished specific code }
}


  public class FlatHead extends Head {
    private float flatHeadHeight;

    public FlatHead( headType thisKind ) {
       super( thisKind );
    }

    // class properties are in scope. Parameters not needed.
    public bool Validate() { flat head specific validation }
  }
0
radarbob