{"id":3326,"date":"2011-08-03T15:48:16","date_gmt":"2011-08-03T13:48:16","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=3326"},"modified":"2011-08-25T10:21:59","modified_gmt":"2011-08-25T08:21:59","slug":"wie-ich-auszog-ein-spiel-zu-programmieren-2-das-mvc-entwurfsmuster","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/wie-ich-auszog-ein-spiel-zu-programmieren-2-das-mvc-entwurfsmuster.htm","title":{"rendered":"Wie ich auszog, ein Spiel zu programmieren (2): Das MVC-Entwurfsmuster"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/wie-ich-auszog-ein-spiel-zu-programmieren-2-das-mvc-entwurfsmuster.htm#comments'>6 Kommentare.<\/a>)<\/small> <\/div><p>(<a href=\"https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/wie-ich-auszog-ein-spiel-zu-programmieren-1.htm\">Fortsetzung hiervon.<\/a> Ich f\u00fcrchte, diesmal noch technischer.) Wir haben: Ein halbwegs fertiges Modell f\u00fcr ein generisches Brettspiel, mit einem Spielbrett beliebiger Gr\u00f6\u00dfe, bestehend aus rechtwinklig angeordneten Feldern (die, falls man das mal braucht, verschiedene Zust\u00e4nde annehmen k\u00f6nnen). Und wir haben Spielfiguren, die auf diesen Feldern stehen<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_2.png\" alt=\"\" title=\"spiel_mvc_2\" width=\"510\" height=\"369\" class=\"aligncenter size-full wp-image-3325\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_2.png 510w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_2-150x108.png 150w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/> <\/p>\n<p>Was noch fehlt, sind Spielregeln und irgendetwas Sichtbares. Und das habe ich nach dem Bauprinzip <strong>Model-View-Controller<\/strong> gel\u00f6st, das explizit im Lehrplan f\u00fcr die 11. Klasse steht. Da ich in meinem zweij\u00e4hrigen Notstudium nichts von Entwurfsmustern geh\u00f6rt hatte, musste ich mich erst mal schlau machen. In den beiden Schulb\u00fcchern, die ich heranzog, stand das jeweils sehr \u00e4hnlich, aber nicht ganz gleich, und nur m\u00e4\u00dfig verst\u00e4ndlich. Die <a href=\"http:\/\/www.isb.bayern.de\/isb\/index.asp?MNav=6&#038;QNav=5&#038;TNav=1&#038;INav=0&#038;Pub=1312\">ISB-Handreichungen zu Informatik<\/a> stellten wieder andere Aspekte in den Vordergrund, Wikipedia auch, und \u00fcberhaupt gibt es MVC in verschiedenen Abwandlungen, die f\u00fcr Programmierer eine gr\u00f6\u00dfere Rolle spielen als f\u00fcr Informatiklehrer und -sch\u00fcler.<\/p>\n<p>(Sehr anschaulich dargestellt ist MVC in den Programmierbeispielen dieses <a href=\"http:\/\/www.java-forum.org\/allgemeines\/91829-mvc.html\">Threads eines Java-Forums<\/a>. Wenn man die Beispiele kopiert und in einem eigenen Projekt ausprobiert, kapiert man schnell, worum es geht.)<\/p>\n<p>Jedenfalls erkl\u00e4re ich jetzt <em>mein<\/em> MVC.<\/p>\n<h4>Erstens: Das Model.<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model.jpg\" alt=\"\" title=\"mvc_model\" width=\"550\" height=\"64\" class=\"aligncenter size-full wp-image-3328\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model.jpg 550w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model-150x17.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/p>\n<p>Das Model stellt quasi das Spielmaterial dar. Es besteht aus Objekten (Spielfiguren) mit bestimmten Zust\u00e4nden (Position, Gesundheitszustand). Das Model stellt Methoden zur Verf\u00fcgung, mit denen man diese Zust\u00e4nde ver\u00e4ndern kann. Detaillierter ist das <a href=\"https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/wie-ich-auszog-ein-spiel-zu-programmieren-1.htm\">im letzten Beitrag<\/a> beschrieben.<\/p>\n<h4>Zweitens: Model &#8211; und View als Darstellung.<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model_view.jpg\" alt=\"\" title=\"mvc_model_view\" width=\"550\" height=\"296\" class=\"aligncenter size-full wp-image-3329\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model_view.jpg 550w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model_view-150x80.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/p>\n<p>Damit man das Modell auch anschauen kann und nicht blind Schach spielen muss, gibt es mindestens einen View (eine Ansicht). Der View stellt die Inhalte des Modells f\u00fcr den Benutzer grafisch dar. Er ist quasi die Ausgabeeinheit unseres Projekts. Immer, wenn sich am Modell etwas Nennenswertes \u00e4ndert, schickt es Informationen an den View, der diese Informationen dann (sofern n\u00f6tig) grafisch umsetzt.<\/p>\n<p>Bei mir sieht das dann in der Rohform so aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_3.jpg\" alt=\"\" title=\"spiel_mvc_3\" width=\"550\" height=\"381\" class=\"aligncenter size-full wp-image-3332\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_3.jpg 550w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_3-150x103.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/p>\n<p>Das ist ein 5&#215;5-Spielfeld mit drei Figuren verschiedener Art darauf. Die einzelnen Felder sind von zweierlei Typen. Rechts sind Kn\u00f6pfe und Informationen, die interessieren uns jetzt noch gar nicht. <\/p>\n<p>Ich habe oben gesagt, dass es mindestens einen View gibt. Tats\u00e4chlich gibt es oft mehrere Ansichten, bei mir bisher zwei: die grafische Darstellung und eine Art schriftliche Mitprotokollierung. Das kennt man ja auch vom Schach, dass da die Z\u00fcge aufgeschrieben werden.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_4.png\" alt=\"\" title=\"spiel_mvc_4\" width=\"400\" height=\"106\" class=\"aligncenter size-full wp-image-3333\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_4.png 400w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_4-150x39.png 150w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Sp\u00e4ter m\u00f6chte ich den Text nat\u00fcrlich noch etwas epischer verfassen. &#8212; Aber auch mehrere gleichzeitige grafische Views sind bei einem Spiel denkbar: eine Ansicht von oben und eine von der Seite, der \u00dcbersichtlichkeit halber. Oder ein View f\u00fcr Spieler 1 und ein zweiter f\u00fcr Spieler 2, bei dem jeweils die Typen der gegnerischen Spielfiguren ausgeblendet sind, wie man das f\u00fcr <a href=\"http:\/\/en.wikipedia.org\/wiki\/Stratego\">Stratego<\/a> br\u00e4uchte. Deshalb ist MVC \u00fcblicherweise so angelegt, dass man leicht neue Views hinzuf\u00fcgen kann, ohne am Model auch nur das Geringste \u00e4ndern zu m\u00fcssen (=> Beobachter-Entwurfsmuster).<\/p>\n<p>Knackpunkt bei dem Verh\u00e4ltnis zwischen Model und View(s) ist der, dass man vorher klarmachen und festhalten muss, welche Botschaften das Model an den View schicken kann. In meinem Fall sind das bisher:<\/p>\n<ul>\n<li><code>figurBewegt(Spielfigur s)<\/code><br \/>\n(wohin, das kann man die Figur dann ja selber fragen)<\/li>\n<li><code>figurGe\u00e4ndert(Spielfigur s)<\/code><br \/>\n(und zwar den Zustand, abh\u00e4ngig davon \u00e4ndert sich dann vielleicht auch das verwendete Symbol)<\/li>\n<li><code>feldtypAendern(int x, int y, Feldtyp typ)<\/code><br \/>\n(das mit den Koordinaten ist zwar nicht optimal, aber lassen wir das)<\/li>\n<li><code>figurGeschlagen(Spielfigur sieger, Spielfigur verlierer)<\/code><br \/>\n(das brauche ich eigentlich nur f\u00fcr die epische Textausgabe, damit ich dann solche S\u00e4tze protokollieren kann wie: &#8222;Die heldenhafte Sonja hat Sigurd im fairen Kampf bezwungen&#8220;)<\/li>\n<\/ul>\n<p>Damit kann ich alle bisher denkbaren \u00c4nderungen am Modell an die Views \u00fcbermitteln. Was die damit machen, ist dann deren Sache &#8211; darum soll sich das Team k\u00fcmmern, dass die Ausgabe programmiert. Je nach Zustand und Art der Spielfigur wird ein bestimmtes Bildchen f\u00fcrs Spielbrett ausgew\u00e4hlt (und eventuell durch ein anderes ersetzt, wenn sich der Zustand \u00e4ndert); je nach Typ des Felds wird eine bestimmte Farbe oder ein bestimmtes Hintergrundbildchen f\u00fcr das Feld ausgew\u00e4hlt. Aber das kann man machen, wie man will, solange der Benuter versteht, was gemeint ist. Ansonsten schreibe ich hier nichts dazu, wie ich den View programmiert habe. (N\u00e4mlich ziemlich schlampig, aber das muss das Modell ja nicht wissen und ich kann es unabh\u00e4ngig davon sp\u00e4ter mal verbessern.) Die grafische Darstellung interessiert mich selber n\u00e4mlich auch wenig. Aber die Sch\u00fcler stehen total drauf.<\/p>\n<h4>Drittens: Model &#8211; und View als Benutzereingabe.<\/h4>\n<p>Ich will ja nicht nur zuschauen, wie sich das Modell in seinen Eigenschaften ver\u00e4ndert, ich will ja auch eingreifen k\u00f6nnen in das System, \u00fcber Tastatur oder Maus. Ich will Kn\u00f6pfe dr\u00fccken k\u00f6nnen! Auch darum k\u00fcmmert sich der View. Hier zieht die Maus gerade Peterkin, den Kletterer, auf ein neues Feld:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_5.jpg\" alt=\"\" title=\"spiel_mvc_5\" width=\"550\" height=\"384\" class=\"aligncenter size-full wp-image-3334\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_5.jpg 550w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_5-150x104.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/p>\n<p>Dabei k\u00fcmmert sich der View \u00fcberhaupt nicht darum, ob das ein legaler Zug ist oder nicht. Und wenn beim Schach der Bauer drei Felder auf einmal nimmt oder der K\u00f6nig sich mitten ins Schach begibt, das ist dem View egal. Ausnahme wohl: Wenn man die Figur auf einen Ort ganz au\u00dferhalb des Spielbretts oder gar des ganzen Fensters zieht, dann sollte der View das schon als Quatsch erkennen. Der View nimmt ansonsten nur Benutzereingaben entgegen und schickt sie weiter &#8211; an jemanden, der sich darum k\u00fcmmert.<\/p>\n<h4>Viertens: Model, View und Controller<\/h4>\n<p>Das ist dann der Controller:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model_view_controller_1.jpg\" alt=\"\" title=\"mvc_model_view_controller_1\" width=\"550\" height=\"296\" class=\"aligncenter size-full\" \/><\/p>\n<p>Der Controller empf\u00e4ngt \u00fcber den View, was der Benutzer gerne an Ver\u00e4nderungen am Modell h\u00e4tte (Bewegen einer Figur, Einzahlung aus Konto). Das hei\u00dft aber noch nicht, dass diese Ver\u00e4nderungen immer auch durchgef\u00fchrt werden. Sonst w\u00e4re das mit dem Kontostand einfach.<\/p>\n<p>Auch den Controller kann durchaus ein ganz anderes Team programmieren als den View. Wichtig auch hier: Welche Informationen soll der View an den Controller schicken? Es sind letztlich \u00e4hnliche wie die, die wir oben schon hatten. Bei mir hei\u00dfen sie:<\/p>\n<ul>\n<li><code>boolean figurZiehen(Spielfigur s, int x, int y)<\/code><br \/>\n(welche Figur wohin gezogen werden soll)<\/li>\n<li><code>figurAendern()<\/code> und <code>feldAendern()<\/code> sind bei meinem Spiel <em>nicht<\/em> vorgesehen; der Spieler kann nicht aktiv den Typ eines Feldes oder den Zustand einer Spielfigur \u00e4ndern, das macht das Programm jeweils allein &#8211; das k\u00f6nnte man nat\u00fcrlich auch anders haben wollen.<\/li>\n<li>Ja, was soll der Spieler denn noch alles machen k\u00f6nnen, au\u00dfer Figuren ziehen? Alle m\u00f6glichen Kn\u00f6pfe dr\u00fccken und Men\u00fcpunkte ausw\u00e4hlen, aber das sind View-Interna, die gehen uns nichts an. Wichtig ist, welche Auswirkungen das jeweils haben soll. Also vermutlich brauchen wir noch:<br \/>\n<code>neustarten()<\/code><br \/>\n<code>spielstandSpeichen()<\/code><br \/>\n<code>spielstandLaden()<\/code><br \/>\n<code>punktestandAusgeben()<\/code><br \/>\n<code>passen()<\/code> (f\u00fcr ein Mehrspielerspiel, wenn das erlaubt sein soll)<br \/>\nund solche Sachen.<\/li>\n<\/ul>\n<p>Man muss also vereinbaren, dass der Controller, der zum View geh\u00f6rt, diese Informationen empfangen kann (=>Interfaces). Dann k\u00f6nnen View-Team und Controller-Team unabh\u00e4ngig voneinander arbeiten.<\/p>\n<h4>F\u00fcnftens: Model, View und Controller, und wieder Model<\/h4>\n<p>Was macht jetzt der Controller mit diesen W\u00fcnschen vom View? Er \u00fcberpr\u00fcft, wie er darauf reagieren soll. Zum Teil wei\u00df er das selber, meistens muss er aber das Model fragen. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model_view_controller_2.jpg\" alt=\"\" title=\"mvc_model_view_controller_2\" width=\"550\" height=\"296\" class=\"aligncenter size-full\" \/><\/p>\n<p>Deshalb ist jetzt auch ein dritter Pfeil eingezeichnet, vom Controller zum Model hin. (Nicht wundern, dass da kein Pfeil zur\u00fcckgeht. Die Pfeile geben nur an, wer wem Fragen stellen\/Arbeiten anschaffen kann &#8211; f\u00fcr die Antwortm\u00f6glichkeit zeichnet man keine Pfeile ein, da auf Fragen immer Antworten kommen, weil alle Objekte h\u00f6flich sind.)<\/p>\n<p>Sp\u00e4testens ab jetzt gibt es verschiedene Varianten der MVC-Bauweise. Das macht aber nichts. Wo stecken die Informationen zur Spiellogik, die Spielregeln? Bisher ist unser Model ja nur das Spielbrett, ohne jegliche Regeln. Demnach w\u00fcrden alle Regeln beim Controller sein: dass ein Bauer nicht drei Felder auf einmal ziehen kann oder dass ein K\u00f6nig sich nicht ins Schach bewegen darf. Kann man machen. <em>Herauskriegen<\/em>, ob das Feld, auf das der Spieler den K\u00f6nig ziehen will, gerade im Schach steht (von einer gegnerischen Figur bedroht wird), kann die Steuerung nur, indem sie das Model fragt. Denn nur das wei\u00df, welche Figur gerade wo steht. Man k\u00f6nnte manche Information \u00fcber die Zugm\u00f6glichkeit auch gleich ins Model legen, etwa wenn es Unterklassen zur Klasse Spielfigur gibt:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_6.png\" alt=\"\" title=\"spiel_mvc_6\" width=\"458\" height=\"310\" class=\"aligncenter size-full wp-image-3338\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_6.png 458w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_6-150x101.png 150w\" sizes=\"auto, (max-width: 458px) 100vw, 458px\" \/><\/p>\n<p>Man w\u00fcrde dabei f\u00fcr die Klassen K\u00f6nig, Dame, Springer und so weiter jeweils die abstrakte Methode <code>istErlaubt(alte Koordinaten, neue Koordinaten)<\/code> \u00fcberschreiben, die jeweils zur\u00fcckgibt, ob der Zug prinzipiell f\u00fcr diese Art Spielfigur erlaubt ist. Aber das ist eine Frage f\u00fcr sp\u00e4ter.<\/p>\n<p>Irgendwie entscheidet der Controller jedenfalls, wie mit dem Benutzerwunsch umgegangen werden muss. Er l\u00e4sst m\u00f6glicherweise das Model seinen Zustand \u00e4ndern, zum Beispiel eine Figur anders positionieren. Oder er \u00e4ndert den Zustand einer Figur von &#8222;gesund&#8220; auf &#8222;verwundet&#8220;. Diese \u00c4nderungen am Model leitet eben dieses sofort und schnurstracks an den View oder die Views weiter &#8211; wie oben schon unter &#8222;Zweitens&#8220; berichtet.<\/p>\n<h4>Sechstens: Model, View und Controller (endg\u00fcltig).<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_gesamt.jpg\" alt=\"\" title=\"mvc_gesamt\" width=\"550\" height=\"296\" class=\"aligncenter size-full\" \/><\/p>\n<p>Au\u00dferdem sagt die Steuerung auch dem \u00fcberwachten View Bescheid. Wenn der vom Spieler gemachte Zug zum Beispiel illegal war, sagt die Steuerung dem View, dass das als Text eingeblendet werden soll. Oder dass der Name des Spielers, der als n\u00e4chster am Zug ist, in einem Textfenster erscheinen soll. Oder dass der View eine Highscore-Liste darstellen soll (weil auf einen entsprechenden Knopf gedr\u00fcckt werden soll). Unklar ist mir noch, wie man bei einem illegalen Zug am besten vorgeht: soll die Steuerung dem View sagen, dass der das Bildchen wieder zur\u00fcck an den alten Ort stellen soll, oder soll die Steuerung dem Modell sagen, dass die entsprechende Spielfigur eine neue Position hat (die allerdings gleich der alten ist), damit das Model dem View sagt, dass er die Darstellung aktualisieren soll? Im zweiten Fall w\u00fcrde meine einfache Mitprotokollierung und auch eine eventuelle Zugz\u00e4hlung nicht mehr ohne Weiteres funktionieren, deshalb habe ich mich f\u00fcr die erste L\u00f6sung entschieden. Aber das sind jetzt krause Gedanken, die sicher niemand nachvollziehen kann, der nicht gerade ebenfalls am Basteln ist. Aber ich schreibe das ja auch f\u00fcr mich zum Erinnern.<\/p>\n<h4>Siebtens: Hausaufgaben.<\/h4>\n<p>Wozu das ganze? F\u00fcr das Programmierprojekt, das in 11 im Lehrplan steht. Zum \u00dcben: wie k\u00f6nnte ein einfaches Model f\u00fcr das Spiel Backgammon aussehen? Welche Botschaften muss das Model an den View schicken? Welche Botschaften muss View an Controller schicken? Welche Fragen muss das Model dem Controller beantworten k\u00f6nnen? Wenn man das entworfen hat, kann das Programmieren beginnen.<br \/>\nOder das gleiche Schiffe versenken. Da braucht man zwei verschiedene Views, f\u00fcr jeden Spieler einen. (Genauer: zwei verschiedene View-Objekte, die durchaus zur gleichen Klasse geh\u00f6ren k\u00f6nnen.) Auch Minesweeper kann man programmieren.<br \/>\nGar nicht ber\u00fccksichtigt ist bisher, dass man vielleicht mit dem Computer als Gegner spielen will. Das ist eine ganz andere Baustelle, aber auch nicht uninteressant.<\/p>\n<h4>Anhang: Umwege.<\/h4>\n<p>Ich bin selber nat\u00fcrlich nicht ganz so ordentlich vorgegangen und habe erst einmal drauflos programmiert. Zuerst habe ich das mit der Grafik so gel\u00f6st: Jede Figur bekam quasi als Partner eine grafische Darstellung seiner selbst. Die habe ich &#8222;Counter&#8220; genannt, weil bei Brettspielern so die kleinen Pappchips hei\u00dfen, die man auf die Spielfl\u00e4che legt. (Und sie erbt von JLabel.)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_7.png\" alt=\"\" title=\"spiel_mvc_7\" width=\"447\" height=\"252\" class=\"aligncenter size-full wp-image-3340\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_7.png 447w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_7-150x84.png 150w\" sizes=\"auto, (max-width: 447px) 100vw, 447px\" \/><\/p>\n<p>Das ging auch gut und war praktisch: Wenn das Model eine Spielfigur-\u00c4nderung an den View schickt, kann der View die Spielfigur einfach fragen, welches Bildchen dazu geh\u00f6rt. Und wenn \u00fcber den View ein Counter bewegt wird, kann man den fragen, welche Spielfigur dazu geh\u00f6rt, und das dem Controller melden. Zugegeben, mich hat von Anfang an gest\u00f6rt, dass das nicht sauberes MVC war. Denn \u00fcber die Verbindung Spielfigur\/Counter tauschten Model und View Informationen aus, die nicht \u00fcber die gemeinsame Schnittstelle liefen. Die Klasse Spielfigur (aus dem Model) war direkt verkn\u00fcpft mit der Klasse Counter (aus dem Model) &#8211; wenn sich am View-Entwurf etwas \u00e4nderte (die Klasse Counter n\u00e4mlich), mussten auch Elemente des Models angepasst werden (die Klasse Spielfigur). Ungeschickt. Und als ich dann sp\u00e4ter mal zwei grafische Views haben wollte, brach mein System zusammen. Wenn jede Figur 1 Counter hat, kann der nicht gleichzeitig an zwei Orten sein. Also zur\u00fcck zu sauberem MVC.<\/p>\n<p>(<a href=\"https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/fruechte-meiner-letzten-programmierarbeit.htm\">Fortsetzung hier.<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(6 Kommentare.) (Fortsetzung hiervon. Ich f\u00fcrchte, diesmal noch technischer.) Wir haben: Ein halbwegs fertiges Modell f\u00fcr ein generisches Brettspiel, mit einem Spielbrett beliebiger Gr\u00f6\u00dfe, bestehend aus rechtwinklig angeordneten Feldern (die, falls man das mal braucht, verschiedene Zust\u00e4nde annehmen k\u00f6nnen). Und wir haben Spielfiguren, die auf diesen Feldern stehen Was noch fehlt, sind Spielregeln und irgendetwas [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3328,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227],"class_list":["post-3326","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/mvc_model.jpg","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=3326"}],"version-history":[{"count":0,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3326\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/3328"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=3326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=3326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=3326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}