2009-07-03 13 views
0

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?

Répondre

1

Une autre option aurait pu être d'utiliser quelque chose comme l'évaluation de code dynamique PublicDomain.

Ceci pourrait permettre à l'extrait de se lire et d'être analysé dynamiquement au moment de l'exécution. Brancher des formules via une interface graphique et les enregistrer, les charger et les évaluer serait assez facile dans ce cas.

+0

Je vais vérifier, mais je ne peux pas utiliser open source. : '( J'ai ajouté la limitation aux exigences – Wilhelm

+1

N'a pas lu la licence Son domaine public, duh! – Wilhelm

Questions connexes