처음 요구 사항 :수식 팩토리를 구현하려면 어떻게해야합니까?
- 관리 요구 사항에 따라 오픈 소스 코드를 사용할 수 없습니다.
- 사용자가 프로젝트에 대해 자신의 수식을 정의해야합니다.
- 내 사용자는 코드 작성법을 모릅니다.
- 수식을 어떻게 든 저장하고 나중에 읽을 필요가 있습니다.
- 작성된 수식을 디버깅해야하므로이를보고 이해할 수 있어야합니다.
- 사용되는 수식은 매우 특수하고 특수한 수식입니다.
- 새 수식 (기능성)을 추가하는 것은 신속하고 유지 보수가 가능한 방식으로 수행되어야합니다.
내가 한 것은 무엇입니까? 내가 구성하기 위해 공장을 만든 다음
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 메소드에 행을 추가합니다.
질문은, 내가 갈 수있는 다른 방법이 있습니까?
나는 그것을 검사 하겠지만 오픈 소스를 사용할 수는 없다. : '( 요구 사항에 제한 사항을 추가했습니다. – Wilhelm
라이센스를 읽지 않았습니다. 해당 공개 도메인, duh! – Wilhelm