Entfernen von hartcodierten Werten und defensivem Design gegen YAGNI

10

Zuerst ein bisschen Hintergrund. Ich codiere eine Suche von Alter -> Rate. Es gibt 7 Altersklammern, daher besteht die Nachschlagetabelle aus 3 Spalten (Von | Bis | Rate) mit 7 Zeilen. Die Werte ändern sich selten - es handelt sich um gesetzlich vorgeschriebene Sätze (erste und dritte Spalte), die seit 3 ​​Jahren gleich bleiben. Ich dachte mir, dass der einfachste Weg, diese Tabelle zu speichern, ohne sie fest zu codieren, in der Datenbank in einer globalen Konfigurationstabelle als einzelner Textwert mit einer CSV besteht (also "65,69,0,05,70,74,0,06" ist, wie die Ebenen 65-69 und 70-74 würden gespeichert). Relativ einfach zu analysieren und dann zu verwenden.

Dann wurde mir klar, dass ich zur Implementierung eine neue Tabelle erstellen, ein Repository zum Umschließen, Datenschichttests für das Repo, Komponententests für den Code, der die CSV in der Tabelle nicht flach macht, und Tests für die Suche selbst erstellen müsste. Der einzige Vorteil all dieser Arbeit besteht darin, dass die Nachschlagetabelle nicht fest codiert wird.

Wenn Sie mit den Benutzern sprechen (die derzeit die Nachschlagetabelle direkt verwenden - indem Sie sich eine Hardcopy ansehen), ist die Meinung so ziemlich, dass "die Preise sich nie ändern". Offensichtlich ist das nicht richtig - die Raten wurden erst vor drei Jahren erstellt und in der Vergangenheit hatten Dinge, die sich "nie ändern", die Angewohnheit, sich zu ändern. Um dies defensiv zu programmieren, sollte ich die Nachschlagetabelle definitiv nicht speichern die Anwendung.

Außer wenn ich an YAGNI denke . Die von mir implementierte Funktion gibt nicht an, dass sich die Raten ändern. Wenn sich die Raten ändern, ändern sie sich immer noch so selten, dass die Wartung nicht einmal in Betracht gezogen wird, und die Funktion ist nicht kritisch genug, dass bei einer Verzögerung zwischen der Ratenänderung und der aktualisierten Anwendung alles beeinträchtigt würde.

Ich habe so ziemlich entschieden, dass nichts von Wert verloren geht, wenn ich die Suche hart codiere, und ich bin nicht allzu besorgt über meine Herangehensweise an diese spezielle Funktion. Meine Frage ist, habe ich als Fachmann diese Entscheidung richtig begründet? Das Hardcodieren von Werten ist ein schlechtes Design, aber die Mühe, die Werte aus der Anwendung zu entfernen, scheint gegen das YAGNI-Prinzip zu verstoßen.

BEARBEITEN Um die Frage zu klären, bin ich nicht besorgt über die tatsächliche Implementierung. Ich mache mir Sorgen, dass ich entweder schnell etwas Schlechtes tun und es mit YAGNI rechtfertigen kann, oder dass ich einen defensiveren Ansatz mit hohem Aufwand wählen kann, der selbst im besten Fall letztendlich nur geringe Vorteile hat. Kommt meine Entscheidung, ein Design zu implementieren, von dem ich weiß, dass es fehlerhaft ist, als professioneller Programmierer einfach auf eine Kosten-Nutzen-Analyse?

BEARBEITEN Obwohl alle Antworten sehr interessant waren, da ich denke, dass dies auf die Designentscheidungen einer Person zurückzuführen ist, denke ich, dass die besten Antworten @ Corbins und @EZ Harts waren, da sie Dinge ansprechen , die ich in der Frage nicht berücksichtigt hatte:

  • Die falsche Zweiteilung zwischen "korrektes Entfernen fest codierter Werte" durch Verschieben in die Datenbank und "effizientes Anwenden von YAGNI" durch Verwendung von fester Codierung. Es gab eine dritte Möglichkeit, die Nachschlagetabelle in die App-Konfiguration einzufügen, die nicht den richtigen Aufwand verursacht, und zwar ohne die Effizienz von YAGNI. Wir sind im Allgemeinen nicht auf Entscheidungen beschränkt, und es kommt dann auf eine Kosten-Nutzen-Entscheidung an.
  • Durch die Codegenerierung kann der Aufwand für das Verschieben der fest codierten Werte in die Datenbank verringert werden, und dies beseitigt auch meine überentwickelte Entscheidung, eine CSV in die Tabelle zu verarbeiten. Möglicherweise führt dies auch zu einem langfristigen Wartungsproblem mit dem generierten Code, wenn sich die grundlegenden Anforderungen für die Suchmethode ändern. Dies alles wirkt sich nur auf die Kosten-Nutzen-Analyse aus, und es ist wahrscheinlich, dass ich, wenn ich diese Automatisierung zur Verfügung gehabt hätte, nicht einmal daran gedacht hätte, so etwas hart zu codieren.

Ich markiere die Antwort von @ Corbin als richtig, da sie meine Annahmen zu den Entwicklungskosten ändert, und ich werde wahrscheinlich in naher Zukunft einige Tools zur Codegenerierung in mein Arsenal aufnehmen.

Rebecca Scott
quelle
Vergessen Sie nicht, wenn sich die Raten ändern und Sie nur fest codierte Werte haben, können Sie die historischen Datensatzberechnungen durcheinander bringen, wenn sich die Raten ändern (und dies unabhängig davon, was Ihr Kunde Ihnen sagt).
Andy

Antworten:

6

Sie haben einen Fehler in Ihrem Entwicklungsprozess gefunden. Wenn es schwierig ist, das Richtige zu tun (Tabelle erstellen, Repo, Repo-Tests, Abflachungstests ...), werden Entwickler einen Weg finden, dies zu umgehen. Dies beinhaltet normalerweise das Falsche. In diesem Fall ist es verlockend, Anwendungsdaten als Anwendungslogik zu behandeln. Tu es nicht. Fügen Sie stattdessen Ihrem Entwicklungsprozess nützliche Automatisierungen hinzu. Wir verwenden CodeSmith , um den langweiligen Code zu generieren, den niemand schreiben möchte. Nachdem wir eine Tabelle erstellt haben, führen wir CodeSmith aus und es werden die DAOs, DTOs und Stubs-Out-Unit-Tests für jede Tabelle generiert.

Abhängig von den von Ihnen verwendeten Technologien sollten Sie ähnliche Optionen haben. Viele ORM-Tools generieren Modelle aus einem vorhandenen Schema. Schienenmigrationen funktionieren in die entgegengesetzte Richtung - Tabellen aus Modellen. Die Metaprogrammierung in dynamischen Sprachen ist besonders stark bei der Eliminierung von Boilerplate-Code. Wenn Sie eine komplexe mehrschichtige Anwendung haben, müssen Sie etwas härter arbeiten, um alles zu generieren, was Sie benötigen, aber es lohnt sich. Lassen Sie sich nicht vom Gefühl "Wow, das ist ein Schmerz im Nacken" davon abhalten, das Richtige zu tun.

Oh, und speichern Sie Ihre Daten nicht in einem Format, das zusätzliche Verarbeitung (CSV) erfordert. Das fügt nur zusätzliche Schritte hinzu, die Ihre Aufmerksamkeit und Tests erfordern.

Corbin März
quelle
Ich würde nicht sagen, dass eine Rails-Migration Tabellen aus Modellen erstellt ... Rails-Migrationen beschreiben Änderungen an Tabellen. Durch Ausführen einer Migration wird die Datenbank geändert. Modelleigenschaften, die der Tabellenstruktur entsprechen, werden zur Laufzeit erstellt.
Kevin Cline
Das interessiert mich, ich hatte nicht daran gedacht, Teile der anfänglichen Bemühungen auf dieses Niveau zu automatisieren. Und diese Automatisierung würde bedeuten, dass ich eine vollständige Tabelle einrichten könnte, anstatt die CSV zu verwenden, um Zeit zu sparen. Was mich betrifft, ist die langfristige Wartung des generierten Codes. Indem ich es im Voraus generiert habe, bin ich früh davon ausgegangen, dass sich die Methode zur Suche niemals ändern wird. Ich denke, wenn dies eine Möglichkeit ist, sollte ich dies nur als Teil des Kosten-Nutzen-Verhältnisses berücksichtigen, um die reduzierten Kosten der Kesselplatte zu berücksichtigen. +1
Rebecca Scott
Die Frage war: "Soll ich Werte hart codieren, wenn mein Client sagt, dass sie sich nicht ändern?" und Ihre Antwort lautet "Nein, und tatsächlich sollten Sie einen ORM auf das Problem werfen." Ich bin nicht einverstanden. Es gibt einfachere Optionen, mit denen das OP eine Hardcodierung vermeiden kann. Es ist unethisch, große Ergänzungen an der Architektur vorzunehmen, um explizit als unnötig bezeichnete Dinge zu unterstützen. Es ist bedauerlich, dass viele Entwickler dazu neigen, solche Dinge zu tun. Und ich muss sagen, ich stimme zu 100% nicht mit Ihrem Vorschlag überein, nicht zuzulassen, dass das Gefühl, wow, das ist ein Schmerz im Nacken, Sie davon abhält, das Richtige zu tun. Diese Gefühle sind wichtig!
user1172763
10

Antwort von @ Thorbjørn Ravn Andersen: Die Berechnung / Suche an einem Ort zu halten, ist ein guter Anfang.

Ihr Denkprozess von Defensive vs. YAGNI ist ein häufiges Problem. In diesem Fall würde ich vorschlagen, dass es durch zwei weitere Dinge informiert wird.

Erstens - wie wurde die Benutzeranforderung dargestellt? Haben sie die Bearbeitbarkeit von Tarifen angegeben? Wenn nicht, ist die zusätzliche Komplexität Teil von etwas, das Sie in Rechnung stellen können oder nicht? (oder wenn Sie Mitarbeiter sind, können Sie Ihre Zeit stattdessen mit anderen Arbeiten verbringen?) Wenn ja, dann machen Sie auf jeden Fall weiter und liefern Sie, was vernünftigerweise verlangt wurde.

Zweitens, und vielleicht noch wichtiger, ist es unwahrscheinlich, dass die bloße Bearbeitbarkeit eine tatsächliche Anforderung angesichts einer Gesetzesänderung erfüllt. Wenn sich die Preise ändern, ist mit einem Stichtag und einer Vorher-Nachher-Verarbeitung zu rechnen. Wenn dieselbe Schnittstelle dann eine rückwirkende Bearbeitung von Ansprüchen durchführen muss, muss der korrekte Tarif möglicherweise auf der Grundlage des Datums des Inkrafttretens der Eingabe und nicht des tatsächlichen Datums ermittelt werden.

Kurz gesagt, ich stelle fest, dass eine tatsächlich bearbeitbare Anforderung durchaus recht komplex sein kann. Wenn sie also nicht oder bis sie konkretisiert wird, ist die einfache wahrscheinlich besser.

Viel Glück

sdg
quelle
1
+1 für Ihren zweiten Punkt. Ich versuche nicht zu erraten, was die gesetzgebenden Körperschaften in Zukunft tun könnten.
David Thornley
Mach es in einer Bibliotheksfunktion. Es ist in Ordnung, nur einen Benutzer zu haben. Wann und wenn sich Anforderungen ändern, haben Sie einen Ort, an dem Sie sich ändern können. (Möglicherweise müssen Sie eine Funktion hinzufügen, um nach dem Wert ab einem bestimmten Datum zu
suchen
Beste und vollständigste Antwort, +1
Andy
7

Machen Sie die eigentliche Suche zu einer Bibliotheksfunktion. Sie können dann den gesamten Code mithilfe dieser Suche in Ihrem Quell-Repository anzeigen, sodass Sie wissen, welche Programme aktualisiert werden müssen, wenn sich die Raten ändern.


quelle
Die Suche wird nur an einer einzigen Stelle implementiert (etwa in einer PensionRateLookupKlasse), die dann global verwendet wird. Ich würde das tun, unabhängig davon, ob es außerhalb der App gespeichert oder fest codiert ist. Auf diese Weise muss nur die Implementierung der PensionRateLookupKlasse beibehalten werden. Mein Problem ist, wie ich YAGNI verwendet habe, um zu dem Schluss zu kommen, dass eine Hardcodierung der Nachschlagetabelle akzeptabel ist.
Rebecca Scott
Vielen Dank für Ihre Antwort. Die Lookup-Implementierung an einem Ort zu halten, ist definitiv ein gutes Design.
Rebecca Scott
YAGNI ist nur gültig, wenn Sie neue Binärdateien versenden können, wenn sich die Preise ändern. Wenn Sie dies nicht können, aber die Konfiguration ändern können, machen Sie sie zu einem Konfigurationswert, der beim Start mit der aktuellen Textdarstellung als Standard gelesen wird.
Ich versende normalerweise wöchentlich eine neue Version, sodass das Aktualisieren der Suche kein Problem darstellt. Das Einfügen in die Client-Konfiguration ist tatsächlich schlimmer, da ich die Client-Konfiguration nicht mit einer neuen Binärdatei ändern kann. Die Alternative, wie ich sie sehe, besteht darin, sie in die Datenbank aufzunehmen, was viel Aufwand bedeutet.
Rebecca Scott
Was ist dann das Problem? Wenn sich die Preise ändern, aktualisieren Sie den Code und versenden an alle Kunden?
2

Lassen Sie mich sehen, ob ich Ihre Frage richtig gestellt habe. Sie haben zwei Möglichkeiten, eine Funktion zu implementieren: Entweder Sie codieren einen Wert fest und Ihre Funktion ist einfach zu implementieren (obwohl Ihnen der Hardcode-Teil nicht gefällt), oder Sie haben große Anstrengungen unternommen, um viele Dinge, die getan werden, zu "wiederholen" So können Sie Ihre Funktion auf saubere Weise entwickeln. Ist das korrekt?

Das erste, was mir in den Sinn kommt, ist: "Das Wichtigste an der Kenntnis der guten Praktiken ist, zu wissen, wann es Ihnen ohne sie besser geht."

In diesem Fall ist der Aufwand sehr hoch, sodass Sie dies auf saubere Weise tun können. Die Wahrscheinlichkeit eines Nebeneffekts dieser Änderung ist groß und die Rendite, die Sie erzielen würden, ist gering (wie Sie erklärt haben, ist dies wahrscheinlich nicht der Fall Veränderung).

Ich würde den Hardcode-Ansatz verwenden (aber darauf vorbereiten, in Zukunft flexibel zu sein) und im Falle einer zukünftigen Änderung dieser Rate die Gelegenheit nutzen, all diesen schlechten Designabschnitt des Codes umzugestalten. Die Zeit und die Kosten könnten also richtig geschätzt werden und die Kosten für die Änderung Ihres fest codierten Werts wären minimal.

Das wäre mein Ansatz :)

JSBach
quelle
Danke @Oscar. Der technische Teil davon ist def. richtig. Und ich stimme zu, wie Sie das Problem angehen würden, indem Sie es nur dann umgestalten, wenn es benötigt wird. Sie sagen also, dass wir als Profi unsere Designprinzipien auswählen können und sollten, die ausschließlich auf Kosten / Nutzen basieren? Macht Sinn.
Rebecca Scott
@ Ben Scott: Gern geschehen :). Ja, aus meiner Sicht wurden Designprinzipien erstellt / katalogisiert, nicht weil sie schön aussehen, sondern weil sie Vorteile wie "Sauberkeit", Flexibilität, Robustheit usw. bieten. Aber es gibt immer zwei Fragen: 1- Brauche ich das? ? 2- Erlauben mir meine Einschränkungen (Zeit, Technik usw.), sie umzusetzen? Dies führt mich normalerweise dazu, mein Designprinzip zu wählen. Überentwicklung ist auch schlecht;) ps: Wenn du denkst, dass es eine interessante Antwort ist, stimme sie bitte ab, damit andere Leute sie auch mit einer höheren Wahrscheinlichkeit lesen. Vielen Dank! :)
JSBach
upvoted ;-)
Rebecca Scott
2

Dies ist ein Element, das sich "nicht ändert", bis es dies tut. Es ist unvermeidlich, dass es sich ändern wird, aber diese Zeit kann ein bisschen weit weg sein.

Ihre Begründung ist richtig. Zu diesem Zeitpunkt fragte der Kunde nicht nach der Möglichkeit, diese Preise einfach zu ändern. Als solches YAGNI.

Was Sie jedoch nicht möchten, ist der Code, der auf Ihre Raten zugreift und die in der Codebasis verteilten Ergebnisse interpretiert. Bei einem guten OO-Design müssen Sie die interne Darstellung Ihrer Raten in einer Klasse zusammenfassen und nur die eine oder zwei Methoden offenlegen, die zur Verwendung der Daten erforderlich sind.

Sie benötigen diese Kapselung, um Fehler beim Kopieren und Einfügen zu vermeiden, oder um ein Refactoring für den gesamten Code durchzuführen, der die Raten verwendet, wenn Sie eine Änderung an der internen Darstellung vornehmen müssen. Wenn Sie diese anfängliche Vorsichtsmaßnahme treffen, kann der kompliziertere Ansatz ein einfacher Austausch und ein Ersatz für die Version mit mehr Funktionen sein.

Rufen Sie dem Client außerdem die Einschränkung des aktuellen Designs auf. Sagen Sie ihnen, dass Sie im Interesse der Einhaltung des Zeitplans die Werte hart codiert haben - was eine Codierungsänderung erfordert, um sie zu aktualisieren. Auf diese Weise können sie, wenn sie aufgrund neuer Gesetze auf ausstehende Ratenänderungen aufmerksam werden, einfach die Nachschlagetabelle aktualisieren oder die zu diesem Zeitpunkt kompliziertere Änderung durchführen. Aber legen Sie diese Entscheidung in ihren Schoß.

Berin Loritsch
quelle
Danke @berin, ich habe SRP in der Frage nicht erwähnt, aber es war im Plan. Es ist ein guter Punkt, dem Kunden das Eigentum an dem Problem zurückzugeben.
Rebecca Scott
Schuldzuweisungen für den Fall, dass in Zukunft etwas schief geht, erscheinen mir nicht professionell.
Andy
@Andy, welcher Teil davon ist Schuldzuweisung? Indem sie dem Kunden die Designbeschränkungen präsentieren, haben sie die Möglichkeit, entweder die komplizierte Arbeit jetzt zu priorisieren und andere Dinge vom Tisch zu nehmen, die Frist zu verschieben oder das eingeschränkte Design jetzt zu akzeptieren, da andere Dinge auf dem Tisch für sie wichtiger sind. Sie geben Ihrem Kunden die Wahl über sein Produkt. Wenn Sie Ihren Kunden das Risiko / den Nutzen von Entscheidungen bewusst machen, die Sie in seinem Interesse treffen möchten, läuft das Projekt reibungsloser ab.
Berin Loritsch
@BerinLoritsch Aber diese spezielle Designentscheidung ist vergleichbar mit minderwertigen Teilen, die sagen: "Ich kann Klempnerspachtel verwenden, um dieses undichte Rohr zu verstopfen, das ist Ihre billigste Option!" Die Preise werden sich ändern. Es ist eine Selbstverständlichkeit und für einen Fachmann unverantwortlich, ein System zu bauen, das dies nicht zulässt. Und die Einsparungen sind im großen Schema der Projektkosten wahrscheinlich vernachlässigbar. Legen Sie die Daten in eine Tabelle; Der Code, mit dem die Suchdaten abgerufen werden, unterscheidet sich geringfügig. Die Logik, mit der ermittelt wird, welche Rate verwendet werden soll, ist in beiden Fällen gleich. Die einzige andere Entscheidung ist, wie man mit historischen Daten nach dem ...
Andy
Ratenänderungen, die normalerweise durch einfaches Kopieren der Rate in den entsprechenden Datensatz behandelt werden. Zu diesem Zeitpunkt ist kein Administrationsbildschirm erforderlich. Das System kann dann verarbeiten, wenn sich die Raten ändern, und es ist ein einfaches Skript, um sie zu ändern. Nichts davon sollte länger als ein paar Stunden dauern, verhindert jedoch, dass der Keller nächstes Jahr überflutet wird, wenn der Kitt ausfällt.
Andy
2

Teilen Sie die Differenz auf und fügen Sie die Tarifdaten in eine Konfigurationseinstellung ein. Sie können das CSV-Format verwenden, das Sie bereits haben, Sie vermeiden den unnötigen Datenbankaufwand, und falls die Änderung jemals erforderlich sein sollte, sollte dies eine Änderung sein, die der Kunde vornehmen sollte, ohne sie neu kompilieren / neu installieren zu müssen und ohne Probleme zu verursachen in der Datenbank - sie können einfach die Konfigurationsdatei bearbeiten.

Normalerweise liegt die beste Antwort irgendwo in der Mitte, wenn Sie zwischen zwei Extremen wählen (YAGNI im Vergleich zu fest codierenden dynamischen Daten verletzen). Vorsicht vor falschen Dichotomien.

Dies setzt voraus, dass sich Ihre gesamte Konfiguration in Dateien befindet. Wenn es an einem schwierigen Ort wie der Registrierung ist, sollten Sie diesen Rat wahrscheinlich ignorieren :)

EZ Hart
quelle
Ich habe überlegt, es in einer Konfigurationseinstellung zu haben, es aber beiseite zu legen, da die Benutzer beim Bearbeiten einer CSV-Zeichenfolge nicht sehr technisch sind. Daher würde ich die Konfiguration für N Benutzer aktualisieren (da ich den gesamten IT-Support in erledige die Organisation auch), in Bezug auf den Aufwand wäre es einfacher, die Vorarbeit zu erledigen, um es in die Datenbank zu bekommen, die ich von einem Ort aus verwalten kann. Ich nehme an, wenn dies keine Überlegung wäre (wenn die Benutzer in der Lage wären, ihre individuelle Konfiguration zu verwalten), hätte ich dieses Problem nicht. Also ein sehr guter Punkt, danke.
Rebecca Scott
Wenn Sie dies mit den anderen Vorschlägen der zentralisierten Logik kombinieren, ist dies eine gute Antwort. Es ist absolut böse, die Suche wirklich zu hardcore zu machen, anstatt sie so zu gestalten, dass sie über die Konfiguration geändert werden kann. Immer wenn ein anderer Entwickler darauf stößt, wird er Sie dafür hassen. Selbst ein Ein-Mann-Entwicklungsgeschäft sollte überlegen, was passiert, wenn er von einem Bus angefahren wird, und es dem nächsten Entwickler leicht machen, die Werte ohne eine vollständige Softwareversion zu ändern. Nur wenn Sie den Client und alle anderen Entwickler hassen, sollten Sie ihn hardcore. Also im Grunde nie.
simbo1905
2

Ich dachte mir, dass der einfachste Weg, diese Tabelle zu speichern, ohne sie fest zu codieren, in der Datenbank in einer globalen Konfigurationstabelle als einzelner Textwert mit einer CSV besteht (also "65,69,0,05,70,74,0,06" ist, wie Die Ebenen 65-69 und 70-74 würden gespeichert.

Ich habe gerade eine DB-Tabelle erstellt. (Du hast darüber nachgedacht, einen ganzen Tisch in einem Archiv zu speichern, bist du verrückt geworden?)

Die Tabelle benötigt 2 Felder NICHT 3. Alter und Rate. Diese nächste Zeile enthält den oberen Wert! Sie normalisieren sich, ohne es zu wissen!

Hier ist die SQL, um die Rate für jemanden im Alter zu erhalten, der 67 Jahre alt ist.

Select * from RateTable where Age in (Select max(age) from RateTable where age <=67) 

Machen Sie sich nicht die Mühe, einen Wartungsbildschirm zu erstellen, da dieser außerhalb des Gültigkeitsbereichs liegt. Wenn sie später danach fragen, stellen Sie eine Änderungsanforderung und tun Sie es.

EDIT: Wie andere gesagt haben , den Code halten die die Rate, falls die ganze zentralisiert wird Rate Struktur chages.

Idioten
quelle
Hallo @Morons, danke für deine Antwort. Die Tabelle würde tatsächlich 3 Spalten benötigen. Es ist ein einziger Satz pro Bereich von Alter, min Alter bis max Alten (65 bis 69 - Jährigen auf 5% ist). Und ich speichere nur eine kleine Datenmenge für einen begrenzten Zweck. Was ist also falsch daran, eine Annahme bezüglich der Struktur zu treffen und eine CSV anstelle einer gesamten dedizierten Tabelle zu verwenden? Ich würde wahrscheinlich ein Zeilentrennzeichen hinzufügen und nach Zeile und Spalte teilen und die Spalten in die erforderlichen Felder ziehen. Dies wird immer viel mehr gelesen als geschrieben, damit ich mir keine Sorgen um einen vollen Tisch mache.
Rebecca Scott
Die nächste Zeile enthält den oberen Wert des Bereichs ... Dies ist eine Duplizierung von Daten. <69 und> 7 zu sagen ist dasselbe. Der einzige Grund für beide Werte ist, ob der Bereich Löcher haben kann. ... Ich sage, einen Tisch zu benutzen, weil das einfacher ist (und ein besseres Design). Ich verstehe nicht, warum Sie denken, dass das Speichern einer CSV in einer Tabelle Ihnen Zeit und Mühe erspart. Sie benötigen immer noch einen DB-Aufruf, um diese Zeichenfolge abzurufen, und müssen sie dann analysieren. Wie ich Ihnen oben gezeigt habe, können Sie die Rate mit einem einzigen DB-Aufruf erhalten.
Idioten
Ah wahr. Ich habe die Tabelle selbst ähnlich wie das Ausgangsmaterial gehalten ... und ich habe übersehen, dass das Alter die Obergrenze in Ihrer Antwort ist, weil ich die Sads hatte, die ich Ihnen gegeben habe.
Rebecca Scott
1
"Du demoralisierst, ohne es zu wissen!" - Zuerst dachte ich, dies sei ein Tippfehler und du meinst "denormalisieren", aber je mehr ich darüber nachdachte, desto mehr schien es, als ob du so oder so Recht hast :)
EZ Hart
@ez hart LOL wahr.
Rebecca Scott
1

Ich stimme den meisten Antworten zu. Ich möchte auch hinzufügen, dass die Konsistenz mit dem Rest der Anwendung wichtig ist. Wenn dies der einzige Ort im Code ist, der fest codierte Werte enthält, wird dies wahrscheinlich die Betreuer überraschen. Dies gilt insbesondere dann, wenn es sich um eine große, stabile Codebasis handelt. Wenn es sich um ein kleines Programm handelt, das von Ihnen verwaltet wird, ist die Entscheidung weniger wichtig.

Ich habe eine ferne Erinnerung daran, wie ich einen bekannten agilen / OOP-Typen (wie Dave Thomas oder Kent Beck oder jemanden) gelesen habe, der sagte, dass seine Faustregel für die Codeduplizierung zweimal und nur zweimal war: Refactor nicht, wenn Sie zum ersten Mal etwas seitdem duplizieren Sie könnten es immer nur zweimal in Ihrem Leben schreiben. Aber das dritte Mal ...

Damit ist die Frage nicht genau beantwortet, da Sie YAGNI befragen, aber ich denke, dies spricht für die allgemeine Flexibilität der agilen Regeln. Der Punkt der Agilität besteht darin, sich an die Situation anzupassen und voranzukommen.

Dave
quelle
Danke @ Dave, das ist hilfreich. Ich bin von Anfang an der einzige Betreuer, aber es ist eine große, relativ stabile Codebasis (Tausende von Dateien, über 100 Tabellen usw.) und ich bin immer noch überrascht (und bestürzt). Beständigkeit ist definitiv eines meiner zukünftigen Ziele.
Rebecca Scott
0

Harter Code in einer Funktion.

  • Wenn sich Werte ändern, können Sie dem Kunden erneut eine Rechnung stellen
  • Wenn sich die Werte ändern, muss sich wahrscheinlich das Tabellenformat ändern, und CSV verschwendet Zeit
  • Einfacher umzusetzen, höhere Chancen, mit dem aktuellen Vertrag im Budget zu sein
  • Kann leicht finden, wann es aktualisiert werden muss
EarlNameless
quelle
Lassen Sie mich diesen minderwertigen Wert installieren, damit ich Wiederholungsgeschäfte bekomme, wenn er mit Sicherheit in einem Jahr kaputt geht. Das klingt zwielichtig, weil es so ist.
Andy