D'abord les exigences:Comment puis-je implémenter une usine de formules?
- par les exigences de gestion, je ne peux pas utiliser le code open source.
- J'ai besoin des utilisateurs pour définir leurs propres formules pour un projet.
- Mes utilisateurs ne savent pas comment coder.
- Les formules doivent être sauvegardées d'une manière ou d'une autre et être lues plus tard.
- J'ai besoin de déboguer les formules écrites, donc j'ai besoin de pouvoir les voir et les comprendre.
- Les formules utilisées sont assez spécialisées et spécifiques (formules actuarielles).
- Ajout de nouvelles formules (fonctionnalité) doit être fait de manière rapide et maintenable.
Qu'est-ce que j'ai fait?
I mis en œuvre une classe abstraite disons FormulaBase que toutes les formules héritent de:
Public MustInherit Class FormulaBase
Public MustInherit Function Formula(ByVal p as Parameters) as Result
Public MustInherit Function GetXML() as Text.StringBuilder
End Class
Puis j'ai créé des classes qui enveloppaient les formules comme celle-ci:
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
Puis j'ai créé une usine pour construire les formules, comme ceci:
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
J'utilise un peu plus de magie pour montrer les formules aux utilisateurs afin qu'ils ne voient pas le XML. Pour ajouter une nouvelle formule j'ai juste besoin de créer la classe wrapper, ajouter une propriété Shared XMLTag et un constructeur qui prend un XMLNode comme paramètre. Ensuite, j'ajoute une ligne à la méthode FormulaFactory.InitializeFormulas.
La question est, ¿Y at-il une autre façon je aurais pu aller?
Je vais vérifier, mais je ne peux pas utiliser open source. : '( J'ai ajouté la limitation aux exigences – Wilhelm
N'a pas lu la licence Son domaine public, duh! – Wilhelm