Arise schreef op dinsdag 15 september 2009 @ 13:33:
Het dient voor een intern online enquete systeem, de if dient dan om vraagsprongen te kunnen programmeren. Bepalen dus of een bepaalde vraag al dan niet moet worden getoond, het verleden heeft al uitgewezen dat dit vaak erg complexe situaties zijn en tot nu toe zit ik dan maar wat manueel in de code te prutsen.
Klinkt als een small-scale business process management system. In de basis heb je een connected directed graph met nodes. Door zo'n node heen stappen kan gebruikersinteractie vereisen (een vraag die gesteld wordt) of de automatische evaluatie van één of andere expressie vereisen (beslissen wat de volgende vraag wordt) aan de hand waarvan het exit-path naar een volgende node gekozen wordt.
Wat ik zou doen is een paar simpele graph-traversal classes maken die om kunnen gaan met een IGraphNode interface. Vervolgens wil je met System.Reflection's InstanceFromAndUnwrap() uit een dynamisch inlaadbare assembly een concrete node (die IGraphNode implementeert) met gecompileerde logica kunnen laden. Op die manier hoef je helemaal niets in strings op te slaan of at runtime (toch nog gelimiteerde) custom expressie bomen evalueren, maar kun je gewoon dynamisch het juiste node type uit een assembly plukken.
Als die expressies namelijk zo complex worden als je claimt, dan wil je dat toch niet gaan configureren in strings,
want dat stinkt naar een anti-pattern.
Je schrijft dus verschillende eenheden aan business code uit in atomaire graph nodes en de opbouw van deze nodes naar een enquete graph kun je dan nog altijd in een XML file of in een database opslaan.
offtopic:
Dus ja: Van het hele ding zoals het nu uit gedacht is kun je inderdaad stellen dat het een slecht design is.