Wann sollte ich Daten fest codieren und externe Daten laden?

36

Ich bin ungefähr tausend Codezeilen lang, um mein eigenes 2D-Weltraumspiel zu entwickeln, das Netzwerke zufällig generierter Sternensysteme erstellt und sie mit einer zufälligen Auswahl von Planeten, Stationen, Schiffen und Waffen bevölkert.

Es wird möglicherweise Hunderte von verschiedenen Stationen / Schiffen / usw. geben, die das Spiel verwenden muss - also hier ist, was ich mich gefragt habe. Sollte ich die Zeit aufwenden, um einen "softcoded" -Datenlader zu erstellen, der alle diese Informationen in (zum Beispiel) XML-Dateien speichert und daher später etwas einfacher zu ändern ist, oder sollte ich einfach mit dem arbeiten, was ich habe mache gerade jetzt - Hardcodierung aller Objekte in die Hauptmaschine des Spiels.

Ich bin die einzige Person im Projekt, und wie gesagt, es ist nur ein Hobby, das ich in meiner Freizeit außerhalb der Universität mache. Aber würde die Community empfehlen, in die Schaffung eines zusätzlichen Systems zur Speicherung von Daten in zusätzlichen Dateien zu investieren?

Was sind die Vorteile einer solchen Softcodierung von Daten gegenüber einer einfachen Hardcodierung über Konstruktoren? Gibt es einen langfristigen Vorteil, wenn externe Dateien geändert werden können? Wenn ich nicht nach Mods für das Spiel suche, sind externe Dateien erforderlich? Wenn es nur eine Hobby-Sache ist, auf die ich in ein paar Wochen oder Monaten verzichten könnte, sollte ich dann Zeit damit verschwenden?

Singular1ty
quelle
10
Der Begriff, nach dem Sie suchen, lautet "Data Driven", und ja, es ist auf lange Sicht viel schneller, neue Stationen zu erstellen und mit XML-Dateien (oder einem anderen Format wie JSON) zu liefern, als dies bei einem kleineren Projekt der Fall ist . Später können Sie sie entfernen und bearbeiten, ohne den Code berühren und neu kompilieren zu müssen. Dies spart ein zweites Mal.
Patrick Hughes
@PatrickHughes Während Sie meine Antwort tippen, haben Sie sie bereits in einen Kommentar eingefügt!
MartinTeeVarga
1
Wenn wir versuchen, "Soft-Codierung" als realen Begriff zu legitimieren, schlage ich eine feste Codierung als "Verwendung einer hartcodierten Eingabe in eine weichcodierte Datenmatrix" vor.
Sean Middleditch
1
@ Singular1ty diese Seite ist eher nachsichtig als einige andere SEs. Ich denke, Ihre Frage ist für den Status "Gute Diskussion" qualifiziert.
Seth Battin
2
@ Singular1ty Ah, hier ist es. Konnte es nicht finden, als ich meinen ersten Kommentar gepostet habe. blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Seth Battin

Antworten:

62

Ja. Sie sollten ein System implementieren, um Inhalte außerhalb Ihres Hauptmoduls zu laden.

Überschriften für prägnante Antworten.

Nein, es verbraucht nicht zu viel Zeit.

Ich denke, die Frage, ob es sich um eine gültige Zuteilung Ihrer begrenzten Zeit handelt, ist umstritten. schon allein deshalb, weil es nur ein kleiner Teil der gesamten Projektzeit sein wird.

Sie werden Hunderte (Tausende) Stunden für ein abgeschlossenes Spielprojekt aufwenden. Vielleicht nicht auf einem Pong-Klon, aber sicherlich für Ihr komplexes Weltraumspiel. Vergleichen Sie das mit einem Konfigurationsdatei-Reader. Das Implementieren eines Systems, um XML in den Hauptkonstruktor zu leiten und anschließend den Spielprozess neu zu starten, dauert möglicherweise 10 oder 20 Stunden. Selbst wenn Sie 50 oder 100 benötigen, ist dies ein winziger Bruchteil der gesamten Projektzeit.

Das spart Zeit

Es ist kein Zeitaufwand; Es ist eine Zeitinvestition. Und es wird sich auszahlen.

Workflow ist wichtig, und ein Konfigurationsladeprogramm verbessert Ihren Workflow. Indem Sie ein System erstellen, mit dem Sie Konfigurationen im Handumdrehen bearbeiten können, sparen Sie unzählige Neuerstellungen. Sie können sich das Spiel ansehen, während es ausgeführt wird, XML optimieren und es in Sekundenschnelle erneut überprüfen. Oder Sie können sich den Code ansehen, eine Codezeile (unter Tausenden) finden, seine Werte äußerst sorgfältig bearbeiten (schließlich befinden Sie sich in Ihrer Haupt-Engine), neu erstellen, ausführen, das Spiel wieder in den Testzustand versetzen und sich anstrengen Erinnern Sie sich daran, wie es vor der Änderung aussah, und prüfen Sie, ob Ihre Änderung den von Ihnen beabsichtigten Effekt hatte. Vorausgesetzt, dass nichts in Ihrem Motor kaputt geht, ist Ihr Zug sicherlich gestört.

Denken Sie aus einer grundlegenderen comp-sci-Perspektive daran, dass der zeitaufwändigste Teil des Schreibens von Software nicht darin besteht, einige zusätzliche Tastenanschläge oder Leerzeichen zu verwenden. Es ist Wanzenjagd. Und wenn Sie etwas mehr Zeit aufwenden, um die Dinge durch das Schreiben von ausführlicherem Code klarer zu machen, sparen Sie sich später viel mehr Zeit. In Ihrem Fall führt das Schreiben eines Inhaltsimporters zu einem saubereren Code, der leichter zu lesen ist. Anstelle von Meilen und Meilen von fest codierten Werten bietet Ihre Quelle ein einfaches Laden von Dateien. Ebenso können Sie die Konfigurationsdatei lesen, ohne durch den Code der Game-Engine zu waten. Beide Teile sind leichter zu warten und zu debuggen.

Ein-Mitglieder-Teams profitieren am meisten

Wenn Sie einen Künstler damit beauftragt hätten, einen Teil dieser Inhalte zu erstellen, müssten Sie Tools erstellen, mit denen sie arbeiten können. Sie müssen Pixelbearbeitungen vornehmen und die Effekte schnell erkennen. Sie würden es nicht wagen, sie zu zwingen, Code neu zu erstellen, um jede Änderung zu sehen. Ihre Zeit ist teuer und Sie möchten sie nicht verschwenden.

Stellen Sie sich nun vor, der Künstler ist sehr ungelernter und langsamer (Programmierer) und hat viele andere Sorgen, weil er auch der Hauptprogrammierer und Musiker ist. Sie wollen diese Zeit definitiv nicht verschwenden, sonst wird das Projekt nie abgeschlossen. Und dieser beschissene Künstler wird die Ausbildung zum besseren Künstler hassen, weil er seine ganze Zeit damit verbringt, Asset-Strings in Code umzubenennen.

Tu dir das nicht an. Stellen Sie die Werkzeuge her, und Sie haben mehr Zeit, um ein Spiel zu machen.

Seth Battin
quelle
3
Wow, noch eine fantastische Antwort! Vielen Dank. Ich bin mit der Fähigkeit, Werte schnell zu ändern, einverstanden - und auch mit der Fehlersuche. Das Vergessen von ein oder zwei kleinen Dingen wird schnell zu einem Albtraum, und ich möchte alles tun, um das endlose Wiederholen derselben Codezeilen mit nur geringfügigen Änderungen zwischen Allianzen, Namen und Rumpf- / Waffenwerten zu reduzieren.
Singular1ty
Seth, willkommen in deiner neuen Berechtigungsstufe. Nutze deine enge und wiedereröffnende Stimme!
MichaelHouse
Ich weiß es zu schätzen, danke. Ich werde eine kurze Zeit warten, um sie zu benutzen. Ich habe eine gewisse Rep-Fluktuation von Up-Voting-Konten erhalten, die gelöscht wurden.
Seth Battin
10

Dies ist eine gute Frage und die beste Antwort, die ich geben kann, ist, dass nur Erfahrung Ihnen wirklich sagen kann, wann es eine gute Idee ist, den Weg zu beschreiten, der schwieriger / zeitaufwändiger ist. Wenn dir jemand sagt, du solltest es IMMER "richtig" machen, dann sind sie einfach falsch.

Sie verstehen bereits, dass es ein Kompromiss ist. Einerseits ist Hardcoding so verlockend, weil es schnell und einfach zu erlernen ist, aber auf lange Sicht werden das Hinzufügen von Funktionen und das Debuggen zum Albtraum. Auf der anderen Seite erfordert das Schreiben eines großartigen, flexiblen und erweiterbaren Systems eine hohe Anfangsinvestition, erleichtert aber auf lange Sicht das Leben um einiges.

Das Ziel ist es, etwas fertig zu machen, und wenn Sie in der Entwicklung eines großartigen Systems festsitzen, wird das Ziel weiter zurückgehen und Sie verlieren die Motivation. Hardcodierung ist unter bestimmten Umständen in Ordnung, aber Sie müssen die Konsequenzen verstehen, die sich daraus ergeben. Hier sind einige Gründe, warum Hardcoding eine schlechte Idee ist:

  • Sie denken vielleicht, dass Ihr Projekt klein ist, aber es ist möglich, dass es wächst, wenn Sie weitere Funktionen hinzufügen. Wenn Sie mit der Hardcodierung beginnen, wird es eine Zeit kommen, in der die Energie, die erforderlich ist, um sie zu warten (sie mit neuem Material zu aktualisieren und die Vielzahl unvermeidlicher Fehler zu beheben), die anfänglichen Gewinne ernsthaft zu überwiegen beginnt.

  • Hardcodierung ist per definitionem projektspezifisch. Für das nächste Projekt müssen Sie wieder von vorne anfangen, möglicherweise müssen Sie die Daten erneut hartcodieren (weil Sie sich damit wohlfühlen werden). Wenn Sie die Zeit in ein anständiges Ladesystem gesteckt hätten, könnten Sie diese Arbeit und die Kopfschmerzen für alle zukünftigen Projekte überspringen.

  • Im Moment arbeiten Sie vielleicht alleine, aber es kann vorkommen, dass Sie jemand anderen in das Projekt einbeziehen möchten. Wirst du dir die Zeit nehmen, dein widerliches Parochialsystem zu erklären und eine Dokumentation dafür zu schreiben?

  • Beim Hardcodieren muss man oft wissen, was bestimmte magische Zahlen bedeuten, oder komplizierte Klassenabhängigkeiten. Vielleicht können Sie jetzt alles im Kopf behalten, aber warten Sie, bis Sie eine Weile nicht mehr mit dem Code zu tun haben. Auch mit umfangreichen Kommentaren ist eine schlecht gestaltete Struktur die Hölle, in die man zurückkehren kann.

Ich würde sagen, Sie sollten sich frei fühlen, hartes Code-Zeug nur für die kleinsten Details zu schreiben. Wenn Sie auch nur die geringste Vorstellung davon haben, dass das Element, an dem Sie arbeiten, von jemand anderem verwendet wird, viel größer wird oder in einem anderen Projekt verwendet wird, nehmen Sie sich jetzt die Zeit, es richtig zu machen.

Auf der anderen Seite ist es einfach und schnell, einen Prototyp wie ein Verrückter zu erstellen und bestimmte Dinge hart zu programmieren, sodass Sie sich ganz auf das Experimentieren konzentrieren können. Das hängt von Ihrem Arbeitsstil ab.

DaleyPaley
quelle
Danke für die Antwort. Ich stelle bereits fest, dass mein System ziemlich außer Kontrolle gerät. Aufgrund der Erweiterung der Java-Funktionen haben meine Klassen häufig zehn bis fünfzehn Konstruktorargumente, und ich vergesse immer, in welcher Reihenfolge sie ablaufen. Ich bin es gewohnt, schnelle und schmutzige Dinge zu tun, weil meine Aufmerksamkeitsspanne so kurz ist, aber Ich würde gerne einmal ein Projekt beenden. Und wenn ich später noch die Statistiken optimieren möchte, möchte ich mich nicht auf das Durchwühlen von tausend Zeilen fest codierter Objekte beschränken ...
Singular1ty
@ Singular1ty In diesem Fall hör auf, was du gerade tust. Es ist Zeit, wie verrückt umzugestalten. Vergessen Sie neue Inhalte und konzentrieren Sie sich auf die Verbesserung der vorhandenen Gesamtstruktur. Ich arbeite in einer Spielefirma und bin immer bestrebt, eine Atempause einzulegen und umzugestalten. Aber natürlich stößt es auf taube Ohren und wir knirschen am Ende immer wie verrückt und wateten durch von Insekten und Hackern befallene Sümpfe. Ho hum
DaleyPaley
8

Sie sprechen von datengesteuerter Programmierung .

Bei kleinen Projekten lohnt sich die Investition möglicherweise nicht, da es häufig viel wichtigere Funktionen gibt, die Sie verbessern können.

Eine datengesteuerte Programmierung kann jedoch SEHR einfach implementiert werden. Wenn Sie es ernst meinen, sollten Sie wahrscheinlich XML, JSON oder YAML verwenden, aber Sie können auch reine Textdateien verwenden.

Datengesteuerte Programmierung

Vorteile

  1. Ermöglicht Entwicklern den Zugriff auf und die Änderung von Spieldaten ohne Programmierkenntnisse
  2. Sie können Änderungen am Spiel vornehmen, ohne es neu kompilieren zu müssen . Dies ist nicht zu unterschätzen, da Sie auf diese Weise ein Spiel viel schneller entwickeln können. Gute Spiele kommen nach vielen Iterationen.

Nachteile

  1. Die Implementierung erfordert Zeit und Mühe.
  2. Dies kann die Komplexität des Programms erhöhen.
Nick Caplinger
quelle
Dies sind nur einige der Vor- und Nachteile, die mir derzeit einfallen. Lass es mich wissen, wenn du an mehr denkst!
Nick Caplinger
1
Ich habe deine Bearbeitung für meinen Titel genehmigt.
Singular1ty