Εγω πάντως ειχα φτοιάξει το κάτι που το είχα βαπτίσει StateMachine.
Εν ολίγοις ουσιαστικά έφτοιαχνες κάτι που ήταν ένα συνολο από συνθήκες.
Ειχε διαφόρους τρόπους που έφτοιαχνες αυτές τις συνθήκες. Κατα βάση όριζες το source object, το property και το invalid value και αυτό με reflection ήξερε πάντα πως να μαθαίνει αν η τιμή του property άλλαξε.
Αυτό το αντικείμενο με τις συνθήκες, ειχε και ένα στοχο source/property στο οποίο ανάλλογα έθετε value αναλλόγως με το evaluation των παραπάνω συνθηκών.
Το πράγμα φυσικά ήταν εντελώς thread safe και συνεργαζόταν άψογα, με μια δευτερη βιβλιοθήκη για workers.
Εν ολίγοις με ένα εντελώς καθαρό τρόπο όριζες συνθήκες (ανα γραμμή) και σε άλλη μια τι θα συνέβαινε και πραγματικά το module έπαιζε απίστευτα καλά.
Για την ιστορία αυτό είχε φτοιαχθεί για dynamic φόρμες που κάθε μια είχε required πεδία, άλλα φορτωνόντουσαν δυναμικά από κάποιο worker και φυσικά ήθελες κουμπιά και άλλα να γινονται πχ enable/disable αναλλόγως.
Και πραγματικά κάθε κουμπί ήταν enabled μονο όταν έπρεπε και γενικά μια ολόκληρη φόρμα υπογόρευε το state των controls της, με τιποτα άλλο πέρα από την δημιουργία states και συνθηκών.
Μια παραπλήσια τεχνική έχω ακολουθήσει και σε WPF γιατι το παραπάνω παίζει μονο για Winforms και το έχω βαπτίζει Evaluation Machine καθώς κάνει evaluate το αν ένα Command είναι δυνατόν να εκτελεστεί ή όχι. Η λογική είναι ίδια. Ένα αντικείμενο στο οποίο εισάγονται συνθήκες. Η βασική διαφοροποιήσει ειναι ότι το evaluation κάνει evaluate μονο όποτε του πει το command και τότε απλά ρωτάει για τις τιμές, ενώ στο state αυτό αντιδρούσε πάντα όταν συνέβαινε κάτι σε κάποιο από τα αντικείμενα που έκανε monitor.
Η ευκολία με την οποία προστίθεται μια συνθήκη ή αφαιρείται είναι απίστευτη. Ουτε κοιτα το τάδε changed event ουτε τίποτα.
Μοναδικό του ελάτωμα είναι ότι τότε δεν ήξερα για το RulesEngine του .NET3.5