Von Event- und Network Based Components – Softwarearchitektur mit Flow

Diesen Monat hat Ralf Westphal in der dotnetpro einen Artikel über Event Based Components veröffentlicht. Dazu mal ein bisschen auf seinem Blog rumgestöbert und das hier gefunden. Es geht mir dabei nicht um irgendeine Geschäftsanwendung oder sowas in der Art, sondern vielmehr um die Logik für ein Computerspiel. Die Leute, die sich in der Spieleentwicklung auskennen werden wissen, dass es da immer einen Game-Loop gibt. Also eine Update Methode, die immer aufgerufen wird. Jetzt mal weitergedacht: Was wenn ich an dieses Update eine Sammlung oder eine Schicht von EBC´s ranhänge, bei denen direkt irgendwelche Updates immer ausgeführt werden. Also ganz kleine Einheiten, wie zum Beispiel prüfen ob eine Taste gedrückt ist, und dann ein Event feuern. Das sind meine Inputs, also meine Update Einheiten. Dann aktivieren die logische Einheiten, wie zum Beispiel dann irgendeine Funktion, dass sich Spielfiguren bewegen und so weiter. Das ganze kann sich ja auch auf sehr viele Schichten von EBC`s aufteilen, die wieder miteinander verknüpft sind. Irgendwie erinnert mich das an neuronale Netze. Oder zumindest einfach  an ein Netz. Es werden inputs definiert, und dann steuert sich der Ablauf nur noch über Events, und dann? Ja dann könnte es zum Beispiel Draw Einheiten im Netz geben, die bei der Draw Methode abgefragt werden, und deren Zustand dann eben gezeichnet wird. Es war mir schon ewig ein Problem wie man eigentlich diese zwei Sachen Update und Draw verbindet, und dabei noch eine anständige Architektur hat. Eine Möglichkeit sind Game Objects oder Entities, die einfach alles vom Baum bis zum Schwertkämpfer darstellen als universelle Basisklasse mit universeller Funktionalität. Das lässt sich aber mit so einem Netz deke ich besser hinbekommen, man kann solche Sachen ja als größere zusammengefasste Funktionseinheiten implementieren, kein Problem… Ich stelle mit das ungefähr so vor:

So schön wandert jetzt der Flow hier durch, und auf ein Event können sich beliebig viele, oder auch gar niemand registrieren, man muss dann eben vor dem Aufruf prüfen ob eine Registrierung vorliegt. Ich nenne meine „neuen“ Bausteine jetzt Network Based Components(NBC`s). Hier bietet sich natürlich(wie von Ralf Westphal auch erkannt) eine schöne Möglichkeit asynchron anzusetzen. Warum denn nicht die Events asynchron verschicken, was heißt verschicken und Events, dann nehmen wir doch gleich Ports von der CCR(Concurrency and Coordination Runtime) und schicken uns die Nachrichten so, oder noch besser: AppSpace(auch von Ralf Westphal). Spiele einfach übers ganze Intenet laufen zu lassen mit dem einen Teil der Logik auf dem einen dem anderen Teil auf dem anderen Rechner. Mal sehen was draus wird, auf jeden Fall sehr spannend das Thema! Wahrscheinlich nur bedingt einsetzbar wenn es um Geschäftsanwendungen geht, aber hier schaut das richtig gut aus.

EDIT: Bitte mal hier nachschauen, ich möchte nicht sagen es ist die optimale Lösung, aber es macht vieles einfacher(zum Beispiel bei Geschäftslogik)