Uitleg
Mijn vriendin promoveert en aangezien ik haar graag help met enkele computerdingen daaromtrent programmeer ik dus ook af en toe experimenten voor haar. Leerzaam, leuk en voor haar makkelijk omdat het makkelijk itereren is.
Experimenten van haar bestaan vaak uit een lading stimuli waar op gereageerd moet worden. Al naar gelang de respons hierop moet er iets anders gebeuren. Deze sequentie noem ik gemakshalve het protocol.
Alle stimuli zijn gelukkig simpel gedefinieerd en staan als csv in een file. Met behulp van een csv-library lees ik deze in en zet ik hem om in het model, welke bestaat uit een paar simpele C# classes.
Normaal gesproken programmeerde ik wat logica en maakte ik een nieuwe .exe voor haar en kon ze beginnen.
Protocollen worden complexer en mijn code steeds meer spaghetti. Tijd voor een goede refactorsessie
Probleem
Bij een protocol denk ik meteen aan een state-pattern en deze werkt dus ook goed in de praktijk. Ik gebruik simpele classes die allemaal een Interface implementeren. Als ze aangemaakt worden wordt de onEntry aangeroepen, als ze verlaten worden de onExit, en bij interactie een andere methode. De context van de states bevat alle nodige informatie om beslissingen te maken in die methodes. Omdat het relatief weinig states zijn is het snel opgezet. Echter voor elk protocol verschilt het Entry en Exit gedrag en het gedrag onder invloed van interacties.
Ik breek me al een tijdje het hoofd hoe ik dit netjes op kan lossen zonder al te veel te herhalen van code, mezelf in de toekomst in de voet te schieten en flexibel te zijn.
Beoogde oplossing
Ik kan de Entry, Exit en interactie methodes natuurlijk als delegate definieren (OnEntry, OnExit, OnReact ... etc) en dan in een protocol-klasse methodes linken aan deze delegates. Het is echter zo dat bij een state-change er een nieuwe instance gemaakt wordt van een state en de delegates dus verloren gaan. Dit kan ik natuurlijk oplossen door een static delegate te doen, maar dat voelt zo vies dat ik bang ben dat als er meer complexiteit bij komt kijken ik weer de sjaak ben.
Dus...
Aan jullie de vraag of er een elegante oplossing is om in het state-pattern de Entry, Exit en interactie methodes te variëren al naar gelang het protocol verandert.
Disclaimer:
Er bestaat open-source software hiervoor, zoals OpenSesame, maar ook betaalde software, zoals E-Prime. De protocollen zijn met zulke pakketten best te bouwen, maar kost onevenredig veel tijd als het wat complexer wordt en ik vind het leuk om dit uit te pluizen
. Bovenstaande pakketten zijn een fall-back mocht het allemaal niet lukken
Ik moet niet een hindernis gaan zijn voor het promotiewerk van mijn vriendin.
Mijn vriendin promoveert en aangezien ik haar graag help met enkele computerdingen daaromtrent programmeer ik dus ook af en toe experimenten voor haar. Leerzaam, leuk en voor haar makkelijk omdat het makkelijk itereren is.
Experimenten van haar bestaan vaak uit een lading stimuli waar op gereageerd moet worden. Al naar gelang de respons hierop moet er iets anders gebeuren. Deze sequentie noem ik gemakshalve het protocol.
Alle stimuli zijn gelukkig simpel gedefinieerd en staan als csv in een file. Met behulp van een csv-library lees ik deze in en zet ik hem om in het model, welke bestaat uit een paar simpele C# classes.
Normaal gesproken programmeerde ik wat logica en maakte ik een nieuwe .exe voor haar en kon ze beginnen.
Protocollen worden complexer en mijn code steeds meer spaghetti. Tijd voor een goede refactorsessie
Probleem
Bij een protocol denk ik meteen aan een state-pattern en deze werkt dus ook goed in de praktijk. Ik gebruik simpele classes die allemaal een Interface implementeren. Als ze aangemaakt worden wordt de onEntry aangeroepen, als ze verlaten worden de onExit, en bij interactie een andere methode. De context van de states bevat alle nodige informatie om beslissingen te maken in die methodes. Omdat het relatief weinig states zijn is het snel opgezet. Echter voor elk protocol verschilt het Entry en Exit gedrag en het gedrag onder invloed van interacties.
Ik breek me al een tijdje het hoofd hoe ik dit netjes op kan lossen zonder al te veel te herhalen van code, mezelf in de toekomst in de voet te schieten en flexibel te zijn.
Beoogde oplossing
Ik kan de Entry, Exit en interactie methodes natuurlijk als delegate definieren (OnEntry, OnExit, OnReact ... etc) en dan in een protocol-klasse methodes linken aan deze delegates. Het is echter zo dat bij een state-change er een nieuwe instance gemaakt wordt van een state en de delegates dus verloren gaan. Dit kan ik natuurlijk oplossen door een static delegate te doen, maar dat voelt zo vies dat ik bang ben dat als er meer complexiteit bij komt kijken ik weer de sjaak ben.
Dus...
Aan jullie de vraag of er een elegante oplossing is om in het state-pattern de Entry, Exit en interactie methodes te variëren al naar gelang het protocol verandert.
Disclaimer:
Er bestaat open-source software hiervoor, zoals OpenSesame, maar ook betaalde software, zoals E-Prime. De protocollen zijn met zulke pakketten best te bouwen, maar kost onevenredig veel tijd als het wat complexer wordt en ik vind het leuk om dit uit te pluizen
Engineering is like Tetris. Succes disappears and errors accumulate.