Erstelle ich eine Länderklasse, die eine Reihe von Städten enthält?
Sicher.
Enthalten die Städte viele Bauklassen, die meisten Klassen von Menschen?
Sicher.
Mache ich eine Pfadfindungsklasse, auf die der Spieler zugreifen kann, um sich fortzubewegen?
Sicher.
Alles, was Sie oben vorgeschlagen haben, scheint vernünftig. Auf lange Sicht ist es vielleicht nicht der beste Weg für Sie, aber das ist in Ordnung. Es ist für Sie offensichtlich sinnvoll zu wissen, da es das Organisationsmodell ist, das Ihnen zuerst einfiel. Es ist wichtig, dass Sie das nehmen und eine Implementierung daraus beginnen. Es wird Ihnen beide den Einstieg erleichtern und Sie über diese anfängliche "Design-Lähmung" hinwegbringen, die Entwickler zu Beginn einer Aufgabe häufig plagt, und Ihnen (wenn es sich in irgendeiner Weise als fehlerhaft herausstellt) ein oder zwei Dinge über die Vor- und Nachteile beibringen dieser besonderen Herangehensweise an Design.
Sie haben die Konzepte natürlich in Ihren Kopf genommen und sie nach einfachen Regeln in Code gruppiert:
- Unterscheidet sich dieses Konzept erheblich im Verhalten oder in den Daten von anderen Objekten, die ich bereits habe? (Länder und Menschen teilen, wenn überhaupt, nur sehr wenig aussagekräftige Daten oder Verhaltensweisen, daher sollten sie im Spiel durch unterschiedliche Typen dargestellt werden.)
- Muss ich dieses Konzept im Code überhaupt in nennenswerter Weise manipulieren (wenn Ihr Spiel mit einzelnen Personen zu tun hat, benötigen Sie möglicherweise diese
Person
Klasse, aber wenn sich das Spiel nur um sie insgesamt kümmert, wie in früheren Versionen von SimCity, Sie Möglicherweise werden dieser Typ oder Instanzen dieses Typs nicht benötigt, um eine 1: 1-Zuordnung der Bevölkerung einer Stadt zu erstellen int populationCount
.
- Benötigt dieses Konzept Zustand ? Wenn ja, sollte es irgendwie gekapselt sein, damit ich diesen Status (eine Klasse) anstatt einer Reihe freier Funktionen speichern kann. (Eine Pfadfindungsimplementierung verfügt nicht über ein analoges reales Objekt, erfordert jedoch die Verfolgung von Daten, z. B. welche Knoten in der Karte bereits berücksichtigt wurden. Dies geschieht besser über eine Klasse als durch Speichern in einem Bündel von versteckten Globalen und freistehenden Funktionen).
Die Beantwortung dieser Fragen ist zwar einfach, kann Ihnen jedoch bei der Entscheidung, ob und wie ein mentales Konzept in Quellcode umgewandelt werden soll, sehr zugute kommen. Vielleicht möchten Sie sich auch über die SOLID-Prinzipien des objektorientierten Designs informieren .
Beachten Sie, dass der in den Kommentaren gemachte Vorschlag eines Entitäts- / Komponentensystems ebenfalls ein gültiger Ansatz ist, obwohl ich ihn hier vermeiden würde, es sei denn, Sie planen Ihr Projekt kleiner ein (einfach, weil Sie möglicherweise zwei neue, große Herausforderungen in einem Projekt annehmen zu entmutigend sein und den Bildungsnutzen verwässern, den Sie sonst erhalten würden, wenn Sie sich nur auf einen konzentrieren). In einem komponentenorientierten Modell wird der "Typ" in den obigen Fragen impliziter: nicht der konkrete Typ im Code, sondern der implizite Typ, der durch die Sammlung von Komponenten definiert wird, die eine Entität bilden. Es können die gleichen Leitprinzipien gelten.