2009-07-04 8 views
2

나는 각 'ProductionLine' 여러 'Stages'이있는 제약 회사를위한 소프트웨어를 개발하고, 각 스테이지 'Machines'다 대다 관계에 대한 클래스를 어떻게 디자인해야합니까?

는 이제 단계와 그 기계를 (의 흔들림을 멀리 ProductionLine을두고 기록하는 세 개의 테이블을 유지하고 가정에 여러 가정합시다 토론).

(2) 기계 (생산 공장이 가질 수있는 모든 가능한 기계를 나타내는 기본 데이터) (

(1) 단계 (모든 생산 라인이 가질 수있는 모든 가능한 단계를 나타내는 기본 데이터) 3) StageMachines (무대에 할당 된 기계 수를 나타냄)

무대는 여러 대의 기계를 가질 수 있으며 기계는 여러 단계의 일부가 될 수 있습니다. 그러나 Machine 클래스에는 Stages 목록이 없어야하며, bussiness problem 도메인과는 관련이 없습니다.

가 나는 다음과 같은 클래스를 디자인했다 :

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; 
     } 
    } 

지금 나는 dillemma에 직면하고있다 :

(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) 나는 내 코드에서이 대다 관계를 유지하는 방법? 'StageMachine'이라는 세 번째 클래스를 만들어야합니까? 그렇게 할 경우 Stage 객체를 만들 때 머신을 어떻게 저장해야합니까?

아무에게도 해결책을 줄 수 있습니까?

*** 스테이지의 머신을 검색 할 때 nTier에서 어떻게 매핑해야합니까?

What is a good design pattern in C# for classes that need to reference other classes?

이 링크는 클래스 설계 문제에 대해 설명하지만, 저장에 응답하고 NTier 디자인에 내 Stage 객체의 기계의 메커니즘을 검색하지 않습니다.

답변

0

당신은 그것이 bussiness의 문제 도메인 무관 accoring에이 사촌

이 ... 기계가 클래스, 단계의 목록이 안된다고 말했다했습니다.

그렇다고해서 단에서 대 기계 관계까지 일대일 관계가 필요한 것은 아닙니다. 그렇다면 당신이 가진 것이 충분할 것입니다.

+0

번호 사촌 : 내 솔루션과 같이 될 것입니다. 그러나 기계 객체를 만들 때 어떤 객체가 속한 것인지 알 필요가 없습니다. –

+0

나중에 알 필요가 있다면 Machine.GetStages() 메서드를 호출하여 List 을 반환해야합니다. –

+0

예. Stage 객체를 만들 때. –

0

다음 작업을 수행 할 경우

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

같은 시스템 데이터를 나타내는 두 개의 다른 개체와 종료됩니다.대신, 당신이 그렇게, 컴퓨터 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 클래스 모두에서 중복 목록을 유지할 필요없이 스테이지와 머신 간의 양방향 트래버스를보다 쉽게 ​​수행 할 수 있습니다.

+0

StageMachine의 문제 - 클래스는 별도의 ID를 유지 관리해야합니다. –

1

비즈니스 문제와 관련이 없지만 실제로는 기계가 컬렉션에 가장 잘 표현 된 스테이지와 연결되어 있습니다. O/R 매퍼를 사용하는 경우 가장 쉬운 방법은 Machine에서 Stage 컬렉션을 구현하는 것이지만 공개적으로 노출시키지 않는 것입니다. 이렇게하면 나중에 기계가 사용되는 단계의 수를 나타 내기 위해 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. 
} 
관련 문제