2009-07-03 6 views
0

처음 요구 사항 :수식 팩토리를 구현하려면 어떻게해야합니까?

  • 관리 요구 사항에 따라 오픈 소스 코드를 사용할 수 없습니다.
  • 사용자가 프로젝트에 대해 자신의 수식을 정의해야합니다.
  • 내 사용자는 코드 작성법을 모릅니다.
  • 수식을 어떻게 든 저장하고 나중에 읽을 필요가 있습니다.
  • 작성된 수식을 디버깅해야하므로이를보고 이해할 수 있어야합니다.
  • 사용되는 수식은 매우 특수하고 특수한 수식입니다.
  • 새 수식 (기능성)을 추가하는 것은 신속하고 유지 보수가 가능한 방식으로 수행되어야합니다.

내가 한 것은 무엇입니까? 내가 구성하기 위해 공장을 만든 다음

Public Class SumFormula 
    Inherits FormulaBase 

    Public Shared ReadOnly Property XMLTag() As String 
     Get 
      Return "sum" 
     End Get 
    End Property 

    Private X As FormulaBase 
    Private Y As FormulaBase 

    Public Sub New(ByVal xmlText as Xml.XmlNode) 
     ' Code to obtain read the sum parameters form XML.' 
    End Sub 

    Public Overrides Function Formula(ByVal p as Parameters) as Result 
     Return X.Formula(p) + Y.Formula(p) 
    End Function 

    Public Override Function GetXml() as Text.StringBuilder 
     Return New Text.StringBuilder().Append("<sum>").Append(X.GetXml()).Append(Y.GetXml()).Append("</sum>") 
    End Function 
End Class 

:이 같은 수식을 포장 클래스를 만든 다음

Public MustInherit Class FormulaBase 
    Public MustInherit Function Formula(ByVal p as Parameters) as Result 
    Public MustInherit Function GetXML() as Text.StringBuilder 
End Class 

:

나는 추상 클래스의 모든 수식에서 상속 FormulaBase을 가정 해 봅시다 구현 수식은 다음과 같습니다.

Public NotInheritable Class FormulaFactory 
    Private Shared Formulas As Dictionary(Of String, Reflection.ConstructorInfo) = InitializeFormulas() 

    Private Shared Sub Add(ByVal collection As Dictionary(Of String, Reflection.ConstructorInfo), ByVal formula as Type) 
     ' Some code to extract the contructor and XmlTag from each class and add them to the dictionary.' 
    End Sub 

    Private Shared Function InitializeFormulas() As Dictionary(Of String, Reflection.ConstructorInfo) 
     Dim Collection As New Dictionary(Of String, Reflection.ConstructorInfo) 
     Add(Collection, GetType(SumFormula)) 
     Return Collection 
    End Sub 

    Public Shared Function ConstructFormula(xmlText as Xml.XmlNode) as FormulaBase 
     Return DirectCast(Formulas(xmlText).Invoke(New Object(){xmlText}), FormulaBase) 
    End Function 
End Class 

나는 더 많은 마법을 사용합니다. XML을 볼 수 없도록 사용자에게 수식을 보여줍니다. 새로운 수식을 추가하려면 래퍼 클래스를 만들고 Shared XMLTag 속성과 매개 변수로 XMLNode를 사용하는 생성자를 추가하면됩니다. 그런 다음 FormulaFactory.InitializeFormulas 메소드에 행을 추가합니다.

질문은, 내가 갈 수있는 다른 방법이 있습니까?

답변

1

또 다른 옵션은 PublicDomain의 동적 코드 평가와 같은 것을 사용했을 수도 있습니다.

이렇게하면 "스 니펫"을 단지 읽어 들이고 런타임에 동적으로 구문 분석 할 수 있습니다. 이 경우 GUI를 통해 수식을 연결하고 저장하고로드하고 평가하는 것이 매우 쉽습니다.

+0

나는 그것을 검사 하겠지만 오픈 소스를 사용할 수는 없다. : '( 요구 사항에 제한 사항을 추가했습니다. – Wilhelm

+1

라이센스를 읽지 않았습니다. 해당 공개 도메인, duh! – Wilhelm

관련 문제