Vor einiger Zeit stellte ich auf SO eine Frage zu etwas, das in C ++ geschrieben wurde, aber anstatt eine Antwort auf das vorliegende Problem zu bekommen, wurden die Kommentare zu meinem Codierungsstil verrückt, selbst als ich anzeigte, dass es sich um einen WIP- Code handelte und dass ich es später aufräumen wollte, als ich den Base Case laufen hatte. (Ich habe so viele Abwärtsstimmen bekommen, dass ich mich entschlossen habe, die Frage zu stellen, da mein Repräsentant auf SO bereits beinahe miserabel ist.)
Ich habe mich gefragt, warum die Leute eine so harte Linie vertreten: "Du bist ein Noob, mach dich selbst fertig". Mir wurde vorgeworfen, C ++ zu schreiben, als wäre es Java. Etwas, das ich nicht verstehen kann und das mich immer noch verblüfft.
Ich programmiere seit einigen Jahren in einigen OOP-Sprachen, wenn auch in Abständen. Ich wähle die zu verwendende Sprache im Hinblick auf die verfügbaren Bibliotheken und die optimale Ausführungsumgebung für den jeweiligen Auftrag. Ich übernehme Entwurfsmuster im OOP-Code und bin mir ziemlich sicher, dass meine Verwendung von Mustern solide ist und dass OO klugerweise ich meine eigenen halten kann. Ich verstehe die OOP-Toolbox, benutze die Tools jedoch nur, wenn ich denke, dass sie wirklich erforderlich sind, und nicht nur, um meine Fähigkeiten als Programmierer zu demonstrieren. (Was ich weiß, sind nicht erstklassig, aber ich denke, sind nicht auf n00b-Ebene).
Ich entwerfe meinen Code, bevor ich eine einzelne Zeile schreibe. Um Tests zu definieren, liste ich die Ziele einer bestimmten Klasse und die Testkriterien auf, die eingehalten werden müssen. Da es für mich einfacher ist, Sequenzdiagramme zu erstellen und dann Code zu schreiben, habe ich mich dazu entschlossen, meine Tests zu schreiben, nachdem die Schnittstelle offensichtlich geworden ist.
Ich muss zugeben, dass ich in dem Code, den ich in der Frage gepostet habe, immer noch Zeiger verwendet habe, anstatt intelligente Zeiger zu verwenden. Ich benutze RAII wann immer ich kann. Ich weiß, dass richtiges RAII Schutz vor Nullzeigern bedeutet, aber ich arbeite inkrementell. Es war in Arbeit und ich wollte es später aufräumen. Diese Arbeitsweise wurde aufs Schärfste verurteilt.
Meiner Ansicht nach sollte ich zuerst ein funktionierendes Beispiel haben, damit ich sehen kann, ob der Basisfall eine brauchbare Denkweise ist. Ich denke auch, dass das Aufräumen des Codes typisch für die Refactoring-Phase von Agile ist, nachdem der Basisfall bewiesen wurde. Ich muss zugeben, dass ich, obwohl ich langsam den Cxx-Standard erreiche, lieber das verwende, was ich verstehe, anstatt das Risiko einzugehen, Konzepte zu verwenden, die ich noch nicht im Seriencode beherrsche. Hin und wieder probiere ich neue Sachen aus, aber normalerweise spiele ich Projekte, die ich nur zu diesem Zweck zur Seite habe.
[edit] Ich möchte klarstellen, dass der Vorschlag von gnat [1] nicht in der Suche auftauchte, die ich durchgeführt hatte, bevor ich anfing, meine Frage zu stellen. Obwohl sein Vorschlag einen Aspekt der Frage abdeckt, beantwortet die Frage, mit der er verknüpft ist, nicht den Kern meiner Frage, sondern nur einen Teil davon. Meine Frage betrifft eher die Reaktion auf meinen Codierungsstil und die professionellen Aspekte des Umgangs mit unterschiedlichen Codierungsstilen und (offensichtlichen) Fertigkeiten. Mit meiner vorherigen Frage zu SO und seiner Antwort als ein typisches Beispiel. [/bearbeiten]
Die Frage ist dann: Warum jemanden verspotten, der nicht Ihren Codierungsstil verwendet?
Die für mich vorliegenden Angelegenheiten / Unterteilungen sind:
- Warum wäre es eine schlechte Programmierpraxis, in Prototypsituationen fehleranfälliger Code zu verwenden, wenn das Refactoring die Robustheit des Codes anschließend erhöht?
- Wie kann ein in C ++ geschriebenes Programm so sein, wie es in Java geschrieben wurde? Was macht es zu einem schlechten Programm (wenn man bedenkt, dass ich die Absicht des aktuellen Stils und der geplanten Arbeit zur Verbesserung angegeben habe?)
- Wie wäre ich ein schlechter Profi, wenn ich ein Konstrukt verwenden würde, das in einem bestimmten Programmierparadigma (z. B. OOP / DP) verwendet wird?
int
Variablen, um die tatsächliche Länge zu verfolgen.Antworten:
Ohne den fraglichen Code zu sehen, gibt es einige Möglichkeiten, Java-Code in C ++ zu schreiben, von denen einige schlechter sind als andere.
Mit Ausnahme von # 1 macht keines dieser Programme ein C ++ - Programm zu einem schlechten Programm, aber es ist auch nicht die Art von Code, an der ich als C ++ - Programmierer lieber arbeite. (Ich würde auch nicht gerne mit nicht-idiomatischem oder C-artigem Perl, nicht-idiomatischem Python usw. arbeiten.) Eine Sprache hat ihre eigenen Werkzeuge und Redewendungen und ihre eigene Philosophie, und guter Code verwendet diese Werkzeuge und Redewendungen, anstatt zu versuchen, sie zu verwenden der kleinste gemeinsame Nenner oder der Versuch, den Ansatz einer anderen Sprache zu reproduzieren. Das Schreiben von nicht idiomatischem Code in einer bestimmten Sprache / Problemdomäne / was auch immer macht jemanden nicht zu einem schlechten Programmierer, es bedeutet nur, dass er mehr über diese Sprache / Problemdomäne / was auch immer lernen muss. Und daran ist nichts auszusetzen. Es gibt eine sehr lange Liste von Dingen, über die ich mehr lernen muss, und insbesondere in C ++ gibt es eine Menge zu lernen.
In Bezug auf die spezielle Frage, ob fehleranfälliger Code mit der Absicht geschrieben werden soll, ihn später zu bereinigen, handelt es sich nicht um Schwarzweiß-Code:
Die Verwendung von RAII und intelligenten Zeigern als Beispiel für die Verwendung von rohen Zeigern im Vergleich zu intelligenten Zeigern in C ++ ist eine Grundvoraussetzung dafür, dass das Schreiben von Code auf diese Weise schneller sein sollte als das spätere Zurückgehen und Aufräumen. Wieder bedeutet dies nicht, dass jemand ein schlechter Programmierer ist, unprofessionell usw., aber es bedeutet, dass es mehr zu lernen gibt.
quelle
new
als Powertools betrachtet. Automatische Speicherung ist das Handwerkzeug.Jede Programmiersprache enthält eine Reihe von Redewendungen und Best Practices, die normalerweise zu elegantem, korrektem und performantem Code führen. Hier sind einige der schlechtesten Praktiken, die in einer anderen Sprache vollkommen in Ordnung sind:
for ($i = 0; $i < 42; $i++) { … }
in Perl schreiben , aber nicht in PHP(in Perl sollten Variablen deklariert werden und solche Schleifen sollten über einen Bereich iterieren)
new Foo()
ohne triftigen Grund in C ++ schreiben , aber nicht in Java(C ++ hat keine Garbage Collection, daher sollte RAII verwendet werden. Andernfalls verliert Noobs Speicherplatz)
zuordnen.
return null
in Scala, aber nicht in einer C-ähnlichen Sprache(weil Scala einen
Option
Typ hat)(weil Javas Stack schnell überläuft, während OCaml eine Tail-Call-Optimierung hat).
Es ist einfach, eine neue Sprache so zu benutzen, als wäre es etwas, das man kennt, und mit etwas Glück wird es sogar funktionieren. "Sie können Fortran in jeder Sprache schreiben". Sie sollten jedoch die spezifischen Funktionen der Sprache X nicht ignorieren, da die Chancen gut stehen, dass X einen gewissen Vorteil gegenüber U bietet.
„ Ich wähle die zu verwendende Sprache im Hinblick auf die verfügbaren Bibliotheken und die optimale Ausführungsumgebung für den jeweiligen Job. “ Ob diese Sprache X tatsächlich besser ist als die Sprache U für den jeweiligen Job, hängt auch davon ab, wie vertraut Sie mit dieser Sprache sind Wie lange wird es dauern, bis Sie sich mit dem Thema vertraut gemacht haben, um es richtig zu nutzen? Sie würden keine schwere Kettensäge nachgeben, nur weil sie das Holz am schnellsten schneidet, wenn Sie Ihr altes Stiftmesser wirklich wollen, weil es perfekt in Ihre Hand passt. Es sei denn, Sie möchten tatsächlich einen Baum fällen.
Bei Ihrer Frage geht es jedoch eher um ein kulturelles Problem : Das Erlernen aller Best Practices nimmt viel Zeit in Anspruch, und Neulinge stellen die meisten Fragen, während Gurus sie beantworten. Aber was für einen Guru offensichtlich ist, ist für einen Neuling nicht offensichtlich, und Gurus vergessen das manchmal. Als Neuling besteht die Lösung darin, nicht aufzuhören, Fragen zu stellen. Man kann jedoch die Offenheit zeigen, Best Practices zu lernen und anzuwenden, indem man z. B. versucht , den Code so weit wie möglich zu bereinigen, bevor er anderen gezeigt wird. Die meisten Sprachen verfügen über einige grundlegende bewährte Methoden, die leicht zu erlernen sind, selbst wenn die gesamte Lernkurve tatsächlich sehr lang ist.
Ein häufiges Problem besteht darin, dass Programmieranfänger Einrückungen oder andere Formatierungen ignorieren und dann verwirrt sind, weil ihr Programm nicht funktioniert. Ich wäre auch verwirrt, und der erste Schritt zum Verständnis eines Programms besteht darin, sicherzustellen, dass es perfekt angelegt ist. Dann werden einfache Fehler wie ein vergessenes Schlusszitat oder ein fehlendes Komma plötzlich offensichtlich. Ich vertraue darauf, dass Sie bereits eine gute Formatierung üben, und hier ist es eine Metapher für andere bewährte Methoden: bewährte Methoden verhindern Fehler, bewährte Methoden erleichtern das Auffinden von Fehlern, bewährte Methoden werden angewendet, bevor das Problem gefunden wird .
Es ist zu billig zu sagen, dass "Ich repariere es später", wenn es jetzt repariere, Ihr Problem gelöst hätte (auch, dass die sagenumwobene "Aufräumphase" möglicherweise nie eintrifft, also ist die einzig verantwortliche Option, es richtig zu machen erstes Mal). Der Versuch, Ihren Code so gut wie möglich zu machen, bevor Sie andere um Hilfe bitten, erleichtert es ihnen, über Ihren Code nachzudenken.
quelle
optional<T>
undNullable<T>
jeweils. Praktisch jeder verliert Speicher in C ++ ohne RAII, noob oder nicht.Ich bin kein Hardcore-C ++ - Entwickler, aber ...
Beachten Sie, dass ein Fehler in C ++ normalerweise "undefiniertes Verhalten" bedeutet. In einer sicheren Sprache ist das Schlimmste, was passieren kann, eine Ausnahme, die Ihr Programm sofort beendet. In C ++ haben Sie Glück, wenn Sie einen Segfehler bekommen. Es ist durchaus möglich, dass Ihr Programm auf subtile Weise etwas falsch macht. Es könnte sich auch für einen bestimmten Zeitraum korrekt verhalten und Bugs viel später manifestieren, oder es könnte sich die ganze Zeit korrekt verhalten, aber irgendwann all dein Gedächtnis aufzehren.
In jedem Fall ist es nur ein einziger Fehler, die Programmausführung komplett von der Strecke zu bringen und Neuland zu betreten. Es ist wahrscheinlich, dass der "Basisfall" für den Vollzeit-C ++ - Entwickler "keine Möglichkeit für undefiniertes Verhalten oder Speicherlecks" bedeutet.
Ich glaube nicht, dass es eine Antwort darauf gibt, die nicht großenteils spekulativ und eigensinnig sein wird. Wenn Sie meine Meinung dazu haben wollen, hat Java in der Regel ein paar Antimuster, wie zum Beispiel die Tatsache, dass alles ein Objekt sein muss. Wo in anderen Sprachen würden Sie einen Zeiger, Funktors oder Funktion übergeben, in Java finden Sie in der Regel Tonnen vacuous und eng-nützlich
ThingDoers
,FooFactories
undIFrobnicators
welche sind nur Funktionen in der Verkleidung.Wenn Sie in anderen Sprachen ein einfaches Tupel oder eine namenlose Struktur übergeben möchten, müssen Sie in Java, um auch nur zwei Objekte in einem einfachen Datencontainer zu bündeln, eine NamedThing-Klasse mit mehr als 30 Zeilen mit Setters, Getters und Javadocs vordefinieren. Das relative Fehlen von Funktionen in Java zwingt Programmierer dazu, objektorientierte doppelte Backflips auszuführen, um die Dinge manchmal zu erledigen. Der resultierende Code ist außerhalb von Java selten idiomatisch.
Hinzu kommt, dass Sie in C ++ ein sehr vereinfachtes Objektdiagramm benötigen, um den Speicher manuell zu verwalten. Normalerweise gehört ein Objekt genau einem anderen Objekt. In Java müssen Sie keine so strengen Auflagen einhalten, da der Garbage Collector sicherstellt, dass die Dinge bereinigt werden, wenn keine weiteren Verweise darauf vorhanden sind. Es besteht also definitiv das Risiko einer falschen Speicherverwaltung, wenn Sie nur Code von Java nach C ++ transliterieren.
Schließlich könnte es nur Elitismus sein. Ich werde nicht so tun, als würden sie die Mehrheit ausmachen, aber ich habe definitiv das Gefühl "Ich brauche keine Sprache, die meine Hand hält und mich davon abhält, dumme Dinge zu tun" bei einigen C ++ - Entwicklern gesehen. In ihren Augen ist C ++ eine "echte" Sprache, und wenn Sie mit ihren Eigenheiten nicht umgehen können, sind Sie kein "echter Programmierer".
quelle
Leicht vom Thema abweichende Antwort ...
Keine Sorge - dies ist ein weit verbreitetes "Verhalten" in jeder Expertengemeinschaft. Und seien Sie ehrlich, wenn Sie in einer beliebigen Sprache gut sind und einem Code begegnen, der "seltsam" ist, werden Sie ihn wahrscheinlich auch kritisieren. (weil, will lehren).
Ich bin in der Perl-Welt - wann sehen wir so etwas wie:
anstatt:
sicher wird es kommentieren - (lies: lehre den Autor) über die
join
Funktion.Wie auch immer, zu viel Kritik ist gar kontraproduktiv , und eines der besten Beispiel dafür ist die nächste: (packte aus: http://perl-begin.org/humour/#How_can_I_switch_off_the_T.V..3F )
(Dieses Bit wurde am 23. März 2011 anonym in einem Pastebot gepostet. Es wird nach einiger Bearbeitung hier für die Nachwelt platziert.) - ebenfalls leicht bearbeitet
quelle
Wenn Sie schnell und schmutzig mit dem Gedanken schreiben, später zu reparieren, besteht die Gefahr, dass Sie etwas vergessen, das Sie reparieren müssen.
In Java müssen Sie nicht darüber nachdenken, wem ein bestimmtes Objekt gehört, Sie geben nur die Referenz weiter und vergessen sie, als wäre es nichts. In C ++ muss jedoch klar definiert sein, wem das Objekt gehört und wer für die Bereinigung verantwortlich ist.
Du würdest nicht; C ++ ist eine Multiparadigmasprache, die OOP zwar recht gut unterstützt, aber auch viele andere Dinge kann. Das meiste läuft jedoch darauf hinaus, das richtige Werkzeug für den Job zu verwenden, anstatt den Hammer jedes Mal herauszuziehen, wenn Sie einen spitzen Dorn in ein Holz schlagen müssen.
Der Grund, warum Sie eine schlechte Resonanz erhalten haben, ist, dass die meisten SO-Nutzer Fähigkeiten danach beurteilen, wie idiomatisch Sie in der Sprache, nach der Sie fragen, codieren können. Die Leute, die mit C ++ vertraut sind, neigen dazu, auf die Nerven zu gehen, wenn sie schlechten Code sehen, der wie etwas aussieht, das sie in der Vergangenheit gebissen hat.
quelle