2011-11-01 5 views
2

나는 C#으로 파고 들었지만 해결할 수없는 문제에 봉착했습니다.C#, 컨테이너 클래스 디자인 패턴?

금융 백 테스트 및 거래 엔진을 설계했으며 그 중 일부로 "전략 컨테이너"를 구현하고 싶습니다. 이 전략 컨테이너는 두 가지 목적을 수행해야합니다. (1) 수학 계산을 수행하는 다른 전략의 인스턴스를 보유하고, (2) 전략 인스턴스에 새로운 틱 데이터를 전달하고 전략 인스턴스에서 특정 정보를 다시 받기 위해 접근자를 제공합니다.

위에서 언급 한 다른 전략은 기본 클래스에서 파생 된 고유 한 클래스 여야합니다. 나는 그 전략들 내에서 완전히 다른 작업을 수행하기를 원한다. 따라서 그것들을 하나의 기본 클래스에서 파생 된 별도의 클래스로 설계하는 것이 실현 가능할 것이라고 생각했다. 한 가지 합병증은 Strategy Container에 포함 된 각 전략 클래스의 인스턴스가 여러 개 필요하다는 것입니다. 각 전략 클래스는 또한 주식 기호 목록을 보유하고 각 기호는 전략 인스턴스를 가져와야합니다.

전략 컨테이너의 또 다른 중요한 점은 각 전략 인스턴스를 만들고, 인스턴스화하고 나중에 호출 할 수 있다는 것입니다.

난 당신이 내가 설계 및 구현에 대해 갈 수있는 방법이 아이디어의 어떤 종류의 몇 가지를 물어보고 싶은게이 :

  • 무엇 전체 최고의 디자인 패턴을 것입니까?
  • 각각의 전략에 대해 다른 클래스를 생성한다면 분명히 다른 유형으로 끝날 것입니다. 어떻게 전략 컨테이너 내의 모든 컨테이너/콜렉션을 보유 할 수 있습니까?
  • 리플렉션이나 다른 방법을 통해 어떻게 끝낼 지 모른 채 각 단일 전략 인스턴스의 메서드를 만들고 인스턴스화하고 호출 할 수 있습니까? 나는 전략의 이름과 유형을 알고 주식 기호의 이름을 안다.
  • 나는 전략에 이름 (클래스 이름 =?)을 제공하고 각 전략에 대해 주식 기호 목록을 제공하고자하는 전략을 제공하기 만하면됩니다. 전략 컨테이너는 목록이 제공되는 전략 유형의 각 전략에서 각 기호에 대한 인스턴스를 작성하고 이후에 계산을 수행 할 수 있도록 새 인용 부호를 각 인스턴스에 제공하는 "RunStrategy (Quote quote)"메소드를 호출합니다.
  • 하나의 목표는 각 전략 클래스의 인터페이스를 최대한 깨끗하게 유지하는 것입니다. 대부분의 표준 (반복적 인) 기능은 파생 된 기본 클래스에서 구현됩니다.

전체 소스 코드는 요구하지 않지만 아이디어를 위해 어떻게이 제품을 설계해야하는지, 그리고 위의 각 사항을 어떻게 달성 할 수 있는지 생각해보십시오. 이것은 나 자신을 위해 무언가이고 어떤 상업적인 제품으로도 바꾸지 않을 것이다. 나는 수학적 비트와 조각을 구현하는 코드를 작성하는 것에 매우 익숙하지만 디자인 패턴과 시스템 아키텍처에 익숙하지 않다.

편집 : 그래이 머터 (Graymatter), 나는 약간 놀았고 내가 찾고있는 것을 정확하게 제공 한 것 같습니다. 고마워.

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<IStrategy> container = new List<IStrategy>(); 

     container.Add(new StrategyOne()); 

     container[0].AddValue(50); 

     Console.ReadLine(); 
    } 




} 

public interface IStrategy 
{ 
    void AddValue(int value); 
} 


public class StrategyOne : StrategyBase 
{ 
    public override void Calculates() 
    { 
     Console.WriteLine("This is my value: " + myValue); 
    } 

} 

public class StrategyBase : IStrategy 
{ 
    protected int myValue; 

    public void AddValue(int value) 
    { 
     Console.WriteLine("Run Strategy in Base"); 

     myValue = value; 

     Calculates(); 
    } 

    public virtual void Calculates() 
    { 

    } 
} 

답변

4

이 유형의 시스템에는 인터페이스를 사용해야합니다. 인터페이스는 전략과의 계약이며 인터페이스에 대해 여러 가지 다른 구현을 할 수 있습니다. 컨테이너에는 인터페이스가 포함됩니다.

뭔가 같은 :

public class StrategyOne : IStrategy 
{ 
    void RunStrategy(Quote quote) 
    { 
    } 
} 

컨테이너가 될 수있다 :

List<IStrategy> container = new List<IStrategy>(); 
+0

저 아이디어를 가지고 조금 놀아 보겠습니다. 실험을 마치고 답해 드리겠습니다. 정말 감사드립니다. –

+0

당신은 대답을 upvoting하여 자신의 의견을 평가 표시 할 수 있습니다. 나는 너를 대신했다. – Jason

+0

나는 아직 투표를 할 수없는 것 같아요, 오늘 합류했습니다 ... 죄송합니다. –

1

음, 디자인 밖으로 등장한다

public interface IStrategy 
{ 
    void RunStrategy(Quote quote); 
} 

그런 다음 구현은 다음과 같이 될 것이다 요구 분석/처리의 나는이 패턴이나 그 패턴을 사용하기로 결정한 다음 도메인에 어떻게 적용되는지 확인하려고하지 않습니다.

기본 클래스 다시 이것은 기본 클래스에 의해 수행되어야하는 일반적인 기능에 의해 보증되어야한다

에서 파생, 그렇지 않으면, 인터페이스 당신이 필요합니다. 전략 패턴은 모든 전략이 공통 데이터 구조에서 작동하는 공통 인터페이스로 정의됩니다.

제 제안은 디자인에 대한 사전 판단을 포기하고 도메인 요구 사항과 모델링에 전적으로 초점을 맞추는 것입니다. 좋은 디자인은 이제 막 밖으로 나옵니다.

+0

공정한 점수를받습니다. 그러나, 내가이 작품을 어떻게 완성했는지 감안할 때 어떻게 설계 할 것인가? 나는 원하는 기능을 아주 자세하게 설명했다고 생각했다. 그렇지 않으면 올바른 것으로 수정하십시오. –

+0

첫 번째 단계는 틱 데이터를 정의하고 그것에 대해 수행 할 수있는 연산과 연산을 정의하고 다른 계산 알고리즘을 식별하는 것입니다. 일단 모든 작업을 완료했다면 인터페이스, 구현 및 상속을 구성하여 원하는 결과를 얻을 수있는 가장 좋은 방법이 분명해야합니다. – Jason

+0

모든 것이 완벽하게 구현되고 완료되었습니다. 앞서 언급했듯이 필요한 것은 다른 전략 클래스를 유지하고 반복하는 디자인입니다. 틱 데이터는 틱 구조체에 보관됩니다. 메모리 내 데이터베이스는 일부 전략에 액세스해야하는 시간 시리즈를 제공합니다. 모든 것이 완료되고 잘 작동합니다. 이제 모든 전략 인스턴스를 보유하고이를 호출 할 수있는 컨테이너를 디자인해야합니다. –