さまざまな形状の燃料タンクのアプリケーションを書いています。
実行時にのみ、エンドユーザーから正確なタイプの戦車を受け取るという設計上の問題があります。サーバー側で動的オブジェクトを作成/処理する方法がわかりません。
たとえば、タンクには3つの幾何学的タイプの頭部(円錐、皿、および平面)を含めることができます。ヘッドのタイプごとに異なる方法で検証する必要があります。
Head
という名前の親クラスを作成しました。このクラスには、すべての幾何学的なタイプのヘッド(直径、厚さなど)に共通するすべてのパラメーターがあります。各子クラス(Conical
、Dished
および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;
}
私はコンストラクタで検証することを好みます。その背後にある考え方は、オブジェクトが存在するためにオブジェクトの状態が有効であることを知っているということです。
おそらく、何らかの理由でクライアントで検証できない可能性があります。いいねこの検証されていないデータを保持する別のタイプを作成します。それを要求モデルと呼ぶ人もいます。 DTOと呼ぶ人もいます。それは、キー値ハッシュテーブルにすることができます。このデータ構造を何と呼ぶかは、サーバーが取得してファクトリーに渡し、検証済みのHead
オブジェクトを構築することです。
その後、ファクトリはConicalHead
またはDishedHead
を返すことができます。
または、頭の高さが負のディッシュヘッドをモデル化することもできます。 FlatHead
タイプを作成する手間を省きます。
真剣に考えるのはデータではありません。これらのタイプが使用される方法です。このデータは非公開にする必要があります。カプセル化。しかし、Head
に実行を指示できる便利なことがまだあるはずです。
このHead
の設計を決定する前に、使用コードを確認してください。または、あきらめて、たくさんのパブリックゲッターを与えることになります。
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 }
}