2

'ProductionLine'それぞれが複数'Stages'あり、各ステージが複数ある製薬会社向けのソフトウェアを開発しているとします。'Machines'

ここで、ステージとそのマシンを記録するために 3 つのテーブルを維持しているとします (議論を揺るがすため、ProductionLine は省略します)。

(1) ステージ(生産ラインが取りうるすべてのステージを表す基礎データ)

(2) マシン (生産工場が持つことができるすべての可能なマシンを表す基本データ)

(3) StageMachines (ステージに割り当てられたマシンの数を表します)

ステージには複数のマシンを含めることができ、マシンは複数のステージの一部になることができることに注意してください。しかし、Machine クラスは Stages のリストを持つべきではありません。なぜなら、それはビジネス問題のドメインによると無関係だからです。

次のクラスを設計しました。

public class Stage
    {
        private int _stageId;
        public int StageID
        {
            get { return _stageId; }
            set { _stageId = value; }
        }

        private string _stageName;
        public string StageName
        {
            get { return _stageName; }
            set { _stageName = value; }
        }

        private List<Machine> myVar;        
        public List<Machine> Machines
        {
            get { return myVar; }
            set { myVar = value; }
        }

        public static bool Save(Stage stage)
        {
            //save code goes here...
        }
    }


public class Machine
    {
        private int _machineId;
        public int MachineID
        {
            get { return _machineId; }
            set { _machineId = value; }
        }

        private string _machineName;
        public string MachineName
        {
            get { return _machineName; }
            set { _machineName = value; }
        }

        public Machine()
        {
        }

        public Machine(int id, string name)
        {
            _machineId = id;
            _machineName = name;
        }
    }

今、私はジレンマに直面しています:

(1) ステージを作成するとき、すべてのマシンからいくつかのマシンを選択してデータを保存する必要があります。私のコードでこれをどのように処理すればよいのでしょうか。次のコードを記述できるはずです。

Stage s = new Stage();
            s.Machines.Add(new Machine(1, "Machine#1"));
            s.Machines.Add(new Machine(2, "Machine#2"));
            s.Machines.Add(new Machine(3, "Machine#3"));

            Stage.Save(s);

(2) コード内でこの多対多の関係を維持するにはどうすればよいですか? という名前の 3 番目のクラスを作成する必要があります'StageMachine'か? その場合、Stage オブジェクトを作成するときにマシンをどのように保存すればよいですか?

誰でも私に解決策を教えてもらえますか?

*** 追加の質問は、ステージのマシンを取得するときに、nTier のどこでどのようにマッピングを行うべきかということです。

他のクラスを参照する必要があるクラスの C# での適切な設計パターンは何ですか?

このリンクでは、クラス設計の問題について説明していますが、NTier 設計のステージ オブジェクトのマシンの保存と取得のメカニズムには答えていません。

4

3 に答える 3

1

ビジネス上の問題とは無関係ですが、実際には、マシンには、コレクションによって最もよく表現されるステージへの関連付けがあります。O / Rマッパーを使用している場合、最も簡単な解決策は、ステージコレクションをマシンに実装することですが、公開しないことです。これにより、後で、マシンが使用されているステージの数を表すためにCountプロパティを公開するなど、他の利点が得られる場合があります。私の解決策は次のようになります:

public class Stage
{
    private List<Machine> _machines = new List<Machine>();

    public IEnumerable<Machine>
    {
        get { return _machines; }
    }

    public void AddMachine(Machine machine)
    {
        _machines.Add(machine);
        machine.AddStage(this);
    }

    public void RemoveMachine(Machine machine)
    {
        _machines.Remove(machine);
        machine.RemoveStage(this);
    }

    // etc.
}

public class Machine
{
    private List<Stage> _stages = new List<Stage>();

    internal void AddStage(Stage stage)
    {
        _stages.Add(stage);
    }

    internal void RemoveStage(Stage stage)
    {
        _stage.Remove(stage);
    }

    // etc.
}
于 2009-07-04T13:05:35.597 に答える
0

あなたはそれを言った

... Machine クラスには Stages のリストを含めるべきではありません。これは、ビジネスの問題ドメインによると無関係であるためです。

つまり、必要なのはステージからマシンへの 1 対多の関係だけということではないでしょうか? その場合、あなたが持っているもので十分でしょう。

于 2009-07-04T07:47:56.723 に答える
0

次の場合:

s1.Add(new Machine(1, "Machine#1");
s2.Add(new Machine(1, "Machine#1");

同じマシン データを表す 2 つの異なるオブジェクトが作成されます。代わりに、マシン ID を指定すると、マシンのリストまたは同じオブジェクト参照を提供する MachineFactory を持つことができます。

Machines.Add(New Machine(1, "Machine#1");
s1.Add(Machines[1]);
s2.Add(Machines[1]);

また

s1.Add(MachineFactory.GetOrCreate(1)); // maintains its own Machines[] internally

(ここで「工場」という用語が間違っている場合は申し訳ありません。基本的には、マシン ID ごとにシングルトンを作成する静的メソッドを使用できます。)

マシンからその親ステージにトラバースする必要はないと述べたので、OOP 用語での多対多に必要なのはこれだけです。別の StageMachine クラスを使用すると、簡単にするためにクラスをリレーショナル データベース構造に合わせて維持したり、Machine クラスと Stage クラスの両方で冗長なリストを維持する必要なく、ステージとマシン間の双方向トラバーサルをより簡単に行えるようにすることができます。

于 2009-07-04T07:58:33.173 に答える