0

ORMテクノロジーを使用してすべてのデータを格納するために使用される汎用モデルがあります。このモデルは、「何かをする」ために時々別のモデルに変換する必要があります。現在、私はこの(簡略化された)アプローチを使用しています。このアプローチでは、汎用モデルは重量をキログラムで保存し、ターゲットモデルは重量をポンドで保存します。

public class GenericModelClassA
{
    public virtual double Weight { get; set; } 
}

public interface IModelX
{
    double Weight { get; set; }
}

public class ModelXClassA : GenericModelClassA, IModelX
{
    private const double WeightConversionFactor = 2.20462;

    public override double Weight
    {
        set
        {
        base.Weight = value / WeightConversionFactor;
        }
        get
        {
        return base.Weight * WeightConversionFactor;
        }
    }
}

これは問題へのまともなアプローチですか?クエリ/ビュー/変換/操作(QVTO)へのモデル駆動型変換(MDT)言語について聞いたことがあります。私のアプローチはあまりにも素朴ですか?MDT言語をお勧めしますか?フィードバック/意見をいただければ幸いです。

どうもありがとう。

キリスト教徒

4

2 に答える 2

1

これが私のやり方です。

ドメイン

public class Weight
{
   public Weight(decimal miligrams) { InMiligrams= miligrams;}

   public decimal InMiligrams {get;private set;}

   public decimal InGrams { get { return InMiligrams*1000; }}

   /* other conversions as properties */
}

永続性

 public class StorageModel
 {
     public virtual decimal Weight {get;set;}
 }

マッピング

ドメイン->永続性

storage.Weight = weight.InMiligrams;

永続性->ドメイン

weight = new Weight(storage.Weight);

永続性レイヤーとドメインレイヤーは、内部的にすべての重みがミリグラム(またはその他の必要な測定単位)で表されることを認識しています。

于 2012-11-02T11:34:46.440 に答える
1

OOの観点からは、この状況で役立つ可能性のある明示的にモデル化されていない概念がいくつかあります。この場合、絶対量とその測定単位を数値で表し(オブジェクトではないため、責任を委任することはできません)、モデルオブジェクトでその変換の責任を吸収します。私の意見では、状況を表すより豊富なモデルを作成する必要があります。

  • クラスWeightUnit、サブクラスKiloおよびPound。
  • 絶対数と重量単位を持つクラス重量。言い換えると、「重み」は、値にその値に意味を与える重みの単位を加えたものです。
  • モデルクラスには重み変数があります。

私はC#に精通していないので、ここで我慢してください:

abstract public class WeightUnit
{
    abstract public function convertValueToKilo(float value);
    abstract public function convertValueToPounds(float value);
}

public class Kilo extends WeightUnit
{
    public function convertValueToKilo(float value) {return value;}
    public function convertValueToPounds(float value) {return value * 2.20462262;}
}

public class Pounds extends WeightUnit
{
    public function convertValueToKilo(float value) {return value / 2.20462262;}
    public function convertValueToPounds(float value) {return value;}
}

public class Weight
{
    protected WeightUnit unit;
    protected float value;

    public function Weight(float value, WeightUnit unit)
    {
      //set the internal state
    }

    public function toKilo()
    {
       return new Weight(this.unit.convertValueToKilo(this.value), new Kilo());
    }

    public function toPounds()
    {
       return new Weight(this.unit.convertValueToPounds(this.value), new Pounds());
    }
}

この実装の問題の1つは、重量単位が増えるにつれて、変換の量が爆発的に増加することです。このような場合、通常は「デフォルト」の単位(Kiloなど)を選択し、他のすべての単位はキロへの変換方法とキロからの変換方法を知っています。その場合、新しいユニットを追加するということは、1つのクラスと2つのメソッドを追加することを意味します。ただし、この二重変換を実行すると、丸め誤差が発生する場合があります。

HTH

于 2012-11-02T12:04:52.103 に答える