コードの設計方法についてアドバイスが必要です。

私のシステムにはHW、プロセスが使用するための多くのデータからなる (ハードウェア) がいくつかあります。HW順番にChannel、多くのデータを持ついくつかがあります。
さらに、それぞれPlant(PlantHWおよびPlantChannel) に固有のデータがいくつかあります。これらはそれほど多くのデータではなく、 や ほど頻繁には使用されませHWんChannel。プロセスで何Plantを使用するかは、プロセスを開始する前にユーザーが選択し、実行中に変更されることはありません。ただし、ユーザーはプロセスをキャンセルして、別のPlant.
私の質問は、良い方法でバインドするHW方法です (方向は関係ありません)。疎結合で、パフォーマンスもOKで、わかりやすいものにしたいです。PlantHWChannelPlantChannel
HWまた、 orをすべて反復するのが最善かどうかもわかりませんPlantHW。2 つの選択肢の長所と短所:
繰り返すPlantHW
- 長所: プロセスは特定の目的のためのものであるため、最も論理的です。
Plant - 短所:
HW興味深いデータがすべて含まれており、常にPlantHW.
繰り返すHW
- 長所:
HWすべての興味深いデータが含まれています - 短所:論理的ではない
- 短所: プロセスは
Plant、対応するPlantHW/を取得するために選択されたものを知る必要がありPlantChannelます。
これを設計する方法についてアドバイスが欲しい。
編集
6 つのクラスには、プロセスで使用される設定とプロセス データが含まれています。それらはファイルから(バイナリシリアル化によって)読み取られ、プログラムが開始されます。
System- 共通システム設定Plant- プロセスは複数のプラントに対して実行できます。このクラスには、各プラントに固有のデータが含まれています。HW- ハードウェア機器の設定とプロセス データが含まれます。PlantHW- 特定のプラントのハードウェア機器の設定とプロセス データが含まれています。Channel- ハードウェア機器のチャネルの設定とプロセス データが含まれます。PlantChannel- 特定のプラントのハードウェア機器のチャネルの設定とプロセス データが含まれます。
たとえば、これを実行できるようにしたい ( iterate の代替を選択した場合HW):
void DoOperationsOnAChannel(HW hw, Plant selectedPlant)
{
// plantHw data is not often used
// var plantHw = GetPlantHW(hw, selectedPlant);
foreach(var channel in hw.Channels)
//Do operations based on hw, plantHw and channel
}
または( iterate の代替を選択した場合PlantHW)
void DoOperationsOnAChannel(PlantHW plantHw)
{
var hw = GetHW(plantHw);
foreach(var channel in plantHw.Channels)
//Do operations based on hw, plantHw and channel
}