Ich habe in meiner Freizeit ein Android-Spiel entwickelt. Es benutzt die libgdx- Bibliothek, so dass ein Großteil der Arbeit für mich erledigt wird.
Während der Entwicklung habe ich für einige Verfahren achtlos Datentypen ausgewählt. Ich habe eine Hash-Tabelle verwendet, weil ich etwas in der Nähe eines assoziativen Arrays haben wollte. Vom Menschen lesbare Schlüsselwerte. An anderen Stellen verwende ich einen Vektor, um ähnliche Ergebnisse zu erzielen. Ich weiß, dass libgdx die Klassen vector2 und vector3 hat, aber ich habe sie nie benutzt.
Wenn ich auf seltsame Probleme stoße und nach Hilfe bei Stack Overflow suche, sehen ich viele Leute, die nur die Fragen reiben, die einen bestimmten Datentyp verwenden, wenn ein anderer technisch "richtig" ist. Wie die Verwendung einer ArrayList, da keine definierten Grenzen erforderlich sind, statt ein int [] mit neuen bekannten Grenzen neu zu definieren. Oder auch etwas Triviales wie dieses:
for(int i = 0; i < items.length; i ++)
{
// do something
}
Ich weiß, dass item.length bei jeder Iteration ausgewertet wird. Ich weiß jedoch auch, dass es niemals mehr als 15 bis 20 Artikel geben wird. Sollte es mich also interessieren, ob ich items.length bei jeder Iteration auswerte?
Ich habe einige Tests durchgeführt, um die Leistung der App mit der soeben beschriebenen Methode im Vergleich zur richtigen zu ermitteln. Befolgen Sie das Lernprogramm und verwenden Sie die genauen Datentypen, die von der Community vorgeschlagen wurden. Das Ergebnis: Gleiches. Durchschnitt 45 fps. Ich habe jede App auf dem Handy und dem Galaxy Tab geöffnet. Kein Unterschied.
Ich schätze, meine Frage an Sie lautet: Gibt es eine Schwelle, bei der es nicht mehr darauf ankommt, richtig zu sein? Ist es in Ordnung zu sagen - "Solange es die Arbeit erledigt, ist es mir egal?"
quelle
Antworten:
Sie schreiben ein Programm, um ein Problem zu lösen. Mit diesem Problem gehen bestimmte Anforderungen zur Lösung des Problems einher. Wenn diese Anforderungen erfüllt sind, ist das Problem gelöst und das Ziel erreicht.
Das ist es.
Der Grund, warum Best Practices eingehalten werden, liegt darin, dass einige Anforderungen mit Wartbarkeit, Testbarkeit, Leistungsgarantien usw. zu tun haben. Folglich haben Sie solche nervigen Leute wie mich, die Dinge wie den richtigen Codierungsstil benötigen. Es erfordert nicht viel mehr Anstrengung, Ihre T's zu überschreiten und Ihre I's zu markieren, und es ist eine Geste des Respekts für diejenigen, die Ihren Code später lesen und herausfinden müssen, was er tut.
Bei großen Systemen ist diese Art von Zurückhaltung und Disziplin unabdingbar, da man mit anderen gut spielen muss, um alles zum Laufen zu bringen, und die technische Verschuldung so gering wie möglich halten muss, damit das Projekt nicht unter seinem eigenen Gewicht zusammenbricht.
Am anderen Ende des Spektrums befinden sich die einmaligen Dienstprogramme, die Sie zur Lösung eines bestimmten Problems schreiben und die Sie nie wieder verwenden werden. In diesen Fällen sind Stil und Best Practices völlig irrelevant. Sie hacken das Ding zusammen, führen es aus und fahren mit dem nächsten fort.
Also, wie bei so vielen Dingen in der Softwareentwicklung, kommt es darauf an.
quelle
Es gibt ein altes weises Zitat: "Tritt nicht in die Fußstapfen der alten Weisen. Suche, was sie suchten." Es gibt Gründe für alle Regeln der "richtigen" Codierung. Es ist wichtiger zu wissen, warum diese Regeln existieren, als zu wissen, was diese Regeln sind.
Es gibt eine Regel, dass Sie einen Test, der wiederholt in einer for-Schleife wie dieser neu berechnet werden kann, nicht einfügen sollten. In den Fällen, in denen die Regel erfunden wurde, um Abhilfe zu schaffen (wo die Leistung wirklich anders wäre), ist dies sinnvoll. In diesem Fall gibt es nur eine richtige Antwort. In Ihrem Beispiel ist bekannt, dass es keinen Leistungsunterschied gibt und dass es nicht mehr als ein paar Dutzend Iterationen geben kann. In diesem Fall gibt es zwei richtige Antworten, entweder um die Regel trotzdem anzuwenden, da sie einfach ist und nichts verletzt und dabei helfen kann, gute Gewohnheiten zu entwickeln, oder um die Regel zu ignorieren, da es keinen Leistungsunterschied gibt, über den man sich Sorgen machen muss.
Ich bevorzuge die erste richtige Antwort und Sie scheinen die zweite zu bevorzugen. Da irren Sie sich nicht. Ich denke, Sie sind falsch in Ihrer Vorstellung, worum es bei "richtiger" Programmierung geht. Es geht nicht darum, einem zufällig ausgewählten Regelsatz zu folgen, der Ihnen nicht hilft und keinen Zweck hat. Wenn Sie die for-Schleife im Beispiel nicht korrigieren, gilt eine sehr gute Regel gegen vorzeitige Optimierung.
Beim richtigen Programmieren geht es darum, gute Regeln zu befolgen, die auf intelligente Weise Sinn machen.
quelle
Die richtige Betrachtungsweise ist die Minderung der Rendite: Vergleichen Sie den zusätzlichen Nutzen der Programmentwicklung mit den Kosten der zusätzlichen Entwicklung.
Eine nachlassende Rendite setzt ein, wenn der Grenznutzen geringer ist als der Grenzaufwand.
Können Sie ein Geschäftsmodell erstellen
items.length
, um denfor
Kreislauf zu verlassen? Kann diese Änderung in wirtschaftlicher Hinsicht sogar die Zeit rechtfertigen, die für die Rechtfertigung aufgewendet wurde? Da es keinen Unterschied in der Benutzererfahrung gibt, erhalten Sie auch für die Zeit, die Sie mit dem Messen verbracht haben, nie etwas (außer einer nützlichen Lektion, die Sie sich merken sollten). Die Benutzer werden das Programm nicht mehr mögen als sie, und infolge dieser Änderung werden keine weiteren Exemplare verkauft.Dies ist nicht immer einfach zu bewerten, da Geschäftsfälle mit Unbekannten und Risiken behaftet sind und daher leicht unüberlegten Faktoren ausgesetzt sind, die erst im Nachhinein offensichtlich werden. Vorgeschlagene Änderungen können völlig untrivial sein, so dass sie einen großen Unterschied machen.
Die Art des Denkens mit sinkenden Renditen kann eine Jagd nach Ausreden darstellen, keine Maßnahmen zu ergreifen, und es kann vermieden werden, Risiken einzugehen, die sich im Nachhinein als eine Reihe verpasster Möglichkeiten erweisen könnten.
Aber manchmal ist es offensichtlich, wenn man etwas nicht tut. Wenn ein Teil der Entwicklung ein Wirtschaftswunder erfordert, um die Entwicklungskosten zu decken (Break Even), ist dies wahrscheinlich eine schlechte Idee.
quelle
Wenn Sie sich nicht darum kümmern sollten, dass Ihr Code "richtig" ist
Wann ist der richtige Code zu schreiben?
quelle
Ist Leistung Ihr Hauptanliegen? Versuchen Sie das zu maximieren?
Wenn ja, gibt es eine grundlegende Lektion zu lernen, und wenn Sie dies tun, werden Sie einer der wenigen sein.
Überlegen Sie nicht, was Sie tun sollten, um es schneller zu machen - das ist zu vermuten. Wenn Sie sich fragen: "Soll ich diese oder jene Containerklasse verwenden?" Oder "Soll ich
length
in die Endlosschleife gehen?", Dann sind Sie wie ein Arzt, der einen Patienten sieht und versucht, zu entscheiden, welche Behandlung er ohne ihn geben soll Befragung oder Untersuchung des Patienten.Das ist zu raten. Jeder macht es, aber es funktioniert nicht.
Lassen Sie sich stattdessen vom Programm selbst mitteilen, wo das Problem liegt. Hier ist ein detailliertes Beispiel.
Siehst du den unterschied
quelle
Ihre Frage ist "solange es die Arbeit erledigt, ist es mir egal?"
Meine Antwort lautet: "Sie wissen nie, was mit Ihrem Code passieren wird." Ich war an so vielen Projekten beteiligt, die mit dem Motto "Hey, lass mich dieses schnelle Ding schreiben, um das Problem eines Benutzers zu lösen" begannen. Schreibe es, lege es da raus, denke nie wieder darüber nach.
Einmal verwandelte sich das, was ich geschrieben habe, in "Oh, jetzt möchte die gesamte Abteilung des Benutzers diesen Code verwenden". Bevor ich mich umdrehen konnte, verwendete das gesamte Unternehmen diesen Code und jetzt muss ich nachweisen, dass er eine Prüfung übersteht und für morgen ist eine Codeüberprüfung für 20 Personen geplant, die bereits von einigen Vizepräsidenten an unsere Kunden verkauft wurde. "
Mir ist klar, dass Sie "in Ihrer Freizeit nur ein Android-Spiel schreiben", aber Sie wissen nie, ob sich dieses Spiel durchsetzen und zu Ihrer Eintrittskarte für Ruhm und Reichtum werden wird. Schlimmer noch, dieses Spiel könnte Ihre Eintrittskarte für Infamie werden, weil es die Telefone der Leute immer wieder zum Absturz bringt. Möchten Sie die Person sein, die ein Jobangebot erhält, weil die Kinder eines anderen nicht aufhören können, Ihr Spiel auf ihren Handys zu spielen, oder möchten Sie die Person sein, die auf Nachrichtenbrettern wie diesem verunglimpft wird?
quelle
Die Antwort ist, dass es nie darauf ankommt und es immer darauf ankommt ....
Es spielt keine Rolle, denn Programmieren, ob richtig oder nicht, ist ein Weg, ein Ziel zu erreichen, kein Ziel an sich. Wenn dieses Ziel ohne "richtige" Programmierung erreicht wird, ist das in Ordnung (aus geschäftlicher Sicht ist es oft am besten, wenn das Ziel ohne Programmierung erreicht werden kann).
Es ist immer wichtig, denn eine korrekte Programmierung ist ein Werkzeug, mit dem Sie Ihre Ziele erreichen können. Die richtige Vorgehensweise ist lediglich die Erkenntnis, dass eine andere Vorgehensweise auf lange Sicht mehr Schmerzen verursacht als spart.
Was die Frage beantwortet, wann Sie es ignorieren können - wenn Sie sicher sind, dass ein anderer Weg auf lange Sicht einfacher sein wird (möglicherweise, weil es auf lange Sicht keinen geben wird).
Einmalige Tools werden in der Regel so schnell und schmutzig wie möglich ausgeführt, mit wenig oder gar keiner Fehlerprüfung oder anderen Überprüfungen, ohne Protokollierung von Ausnahmen, Ausschneiden und Einfügen von Code mit geringfügigen Änderungen oder gar keinen Änderungen anstelle von generischen Funktionen und so weiter .
Pass auf: Manchmal haben diese schnellen und schmutzigen Apps ihre eigene Ausstrahlung, was bedeutet, dass dich alle Abkürzungen in den ...
quelle
Tatsächlich wird items.length im endgültigen Code nicht bei jeder Iteration ausgewertet, da der Compiler es optimiert. Und selbst wenn dies nicht der Fall wäre, ist length ein öffentliches Feld im Array-Objekt. Der Zugriff darauf kostet nichts.
Es hängt wirklich davon ab, was Sie von Ihrem Endprodukt erwarten. Der Unterschied zwischen einem durchschnittlichen Produkt und einem großartigen Produkt liegt im Detail. Ein Auto wie Tata Nano und ein Auto wie Mercedes S "erledigen die Arbeit" - es bringt Sie von einem Ort zum anderen. Der Unterschied hängt in Details ab: Motorleistung, Komfort, Sicherheit und andere. Dies gilt auch für alle vorhandenen Produkte, einschließlich Softwareprodukte. Warum sollte zum Beispiel jemand an Oracle, IBM oder Microsoft für Oracle-Datenbanken, DB2 oder MS SQL Server zahlen, da MySQL und Postgre kostenlos sind?
Wenn Sie auf die Details achten und ein qualitativ hochwertiges Produkt erhalten möchten, sollten Sie sich um dieses Zeug (und natürlich auch um andere Sachen) kümmern.
quelle
Wenn Sie zu Hause für sich selbst programmieren, können Sie vielleicht ein paar Ecken abschneiden. und wenn Sie experimentieren und Dinge ausprobieren, ist dies völlig gerechtfertigt.
Aber pass auf dich auf. In dem Beispiel, das Sie angeben, müssen Sie diese Ecke nicht wirklich abschneiden, und Sie müssen vorsichtig sein. Dies könnte einen Trend auslösen und schlechte Angewohnheiten, die Sie zu Hause machen, könnten sich bei der Arbeit in Ihren Code einschleichen. Es ist weitaus besser, zu Hause gute Gewohnheiten zu üben und zu verbessern und sie bei der Arbeit in Ihren Code einfließen zu lassen. Es wird dir helfen und es wird anderen helfen.
Jedes Programmieren, das Sie tun und jedes Denken, das Sie über das Programmieren machen, ist Übung. Lohnt es sich, sonst kommt es zurück und beißt dich.
Schauen Sie aber auf die gute Seite. Sie haben danach gefragt, vielleicht wissen Sie ja schon, worauf ich hinaus will.
quelle
Wenn ein Möbelhersteller ein Möbelstück für die Verwendung herstellt, bei dem die Qualität nicht von größter Bedeutung ist oder bei dem die Qualität möglicherweise unbemerkt bleibt, sollten sie dann trotzdem versuchen, ihre Schnitte gerade zu machen und die Teile ordnungsgemäß zusammenzufügen?
Viele Menschen sehen Software als Handwerkskunst. Was wir bauen, sollte nicht nur eine Funktion erfüllen, sondern auch zuverlässig, wartbar und robust sein. Das Erstellen einer solchen Software erfordert Fachwissen, das aus der Praxis stammt.
Auch wenn die Wahl eines Schleifenkonstrukts für das, woran Sie heute arbeiten, keine Rolle spielt, wird die Tatsache, dass Sie immer danach streben, die richtigen Konstrukte zu verwenden, Sie mit der Zeit zu einem besseren Programmierer machen.
quelle