> die Matches sind mir soweit klar.
> Wie w�rdest Du die AND/OR Verk�pfung implementieren?
> Wo und wie w�rdest Du die Rekursion gestalten?
Pseudocode(Methodennamen der xml-API stimmen nicht etc.):
foreach (xmlnode rule in xmldoc.getNodes("/configuration/Rules/Rule")
{
if(EvaluateNode(rule, "AND")) //implizites AND
{
schleife abbrechen und aktion aus rule anwenden.
}
}
bool EvaluateNode(xmlnode node, string operator)
{
bool ret = operator=="AND"? true : false;
foreach (xmlnode subnode in node.children)
{
bool result;
switch(subnode.nodename)
{
case "Match":
result = EvaluateMatchNode(subnode);
//matches sind klar
break;
case "and":
result = EvaluateNode(subnode, "AND");
//rekursion
break;
case "or":
result = EvaluateNode(subnode, "OR");
//rekursion
break;
}
ret = operator=="AND"? ret&&result : ret||result;
}
return ret;
}
- Beim operator w�rde man nat�rlich lieber einen eigenen enum-typ
verwenden...
- Zur Optimierung kannst Du noch kurzschluss-AND/OR implementieren, d.h. bei
AND wird beim ersten ergebnis mit false abgebrochen und false zur�ckgegeben,
beim OR wird beim ersten true abgebrochen und true zur�ckgegeben, so dass
weniger matches ausgewertet werden m�ssen.
- Idee: <Match name="Cookies.Wert" ..> etc. => wenn nur ein einfacher Name
angegeben wird, wird im ganzen Request danach gesucht, ansonsten die
UnterCollections Cookies,Form,Headers,Querystring,ServerVariables, aber auch
Session etc..
<Match name="Session.UserType" type="string" value="Admin"/>
- Idee: Neuer type f�r direkte Vergleiche etc.
<Match name="Form.Passwort" type="operator:=="
value="Form.PasswortWiederholung"/>
- Eine weitere Optimierung: Du kannst so ne Art Vorkompilierung beim ersten
Laden der Rules machen (und diese cachen), indem Du Dir Hashtables
erstellst, die angeben welche regel was braucht und dann schl�gst du nach
und kannst vielleicht von vornherein einige regeln ausschliessen, die du
nicht testen brauchst, weil einfach die n�tigen parameter gar nicht aktuell
da sind. Bei der vorkompilierung musst Du aufpassen, dass nur wirklich
n�tige parameter aufgenommen werden, wenn es also z.B. Ein OR gibt, wird der
parameter nur dann wirklich ben�tigt, wenn er in allen OR-Zweigen
vorkommt...
Gruss,
Claudius
_______________________________________________
Framework.net Mailingliste, Postings senden an:
[email protected]
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/framework.net