Warum ist es schlecht, etwas in der Sprache X zu schreiben, als ob Sie ein Programm in der Sprache Y schreiben, um ein gemeinsames Codierungsparadigma zu verwenden? [Closed]

25

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?

[1] Entwickeln Sie schnell und fehlerhaft, korrigieren Sie dann Fehler oder gehen Sie langsam und vorsichtig mit jeder Codezeile um?

Onno
quelle
5
Sie könnten besser dran sein, den Leuten in der C ++ Lounge diese Frage zu stellen. Ziehen Sie zuerst Ihren Flammenschutzanzug an.
Robert Harvey
48
C ++ Leute sind eine ungewöhnliche Rasse unter Programmierern. Ihr Java-Toolkit ist eine vernünftige, verständliche Toolbox mit vertrauten Werkzeugen in einer gepolsterten Ledertasche, die in jeder Werkzeugmacherei verwendet werden kann. C ++ ist ein kompletter Werkzeugschuppen mit einer Trennsäge, einer Bohrmaschine und einigen Werkzeugen, die niemand kennt. Alle diese Werkzeuge können von der C ++ - Masse wie Ninjas gehandhabt werden. Es belästigt sie, wenn jemand hereinkommt und ein Werkzeug an der falschen Stelle zurück ins Regal legt. Sie sind die "Maßnahme zweimal, einmal schneiden" der Programmierer.
Robert Harvey
13
Vielleicht ist es die gleiche Reaktion, die Sie auf Java-Code haben würden, der wie FORTRAN geschrieben wurde: Alle Codes in einer einzigen Klasse, keine Sammlungen, nur Arrays mit fester Größe, mit separaten intVariablen, um die tatsächliche Länge zu verfolgen.
Kevin Cline
14
Wenn Sie C ++ wie Java schreiben, werden Sie wahrscheinlich viel zu viele Heap-Zuweisungen haben, wodurch Ihr Programm schlechter abschneidet als es könnte. Sprachen werden in der Regel so entworfen und optimiert, dass bestimmte Muster gefördert werden. Wenn Sie diese Muster auflösen, verschlechtern sich die Bedingungen für Sie.
Gort the Robot
5
Sie haben Code online gepostet, um Hilfe zu erhalten. Mir ist klar, dass Sie nicht alle Rückmeldungen zu Ihrem Stil erwartet haben, aber möchten Sie überhaupt keine Hilfe? Du nimmst das Gute mit dem Schlechten. Programmierer müssen nach Fehlern im Code suchen. es ist was wir tun.
JeffO

Antworten:

26

Ohne den fraglichen Code zu sehen, gibt es einige Möglichkeiten, Java-Code in C ++ zu schreiben, von denen einige schlechter sind als andere.

  1. Im Extremfall wird der Quellcode wie in Java angelegt: alles in einer Datei, alles in der Klassendefinition usw .:
    class HelloWorldApp {
    public:
        void main() {
            cout << "Hello World!" << endl;
        }
    };
    So würde der Java-Quellcode aufgebaut sein. In C ++ ist dies technisch gesehen legal, aber alles in die Header-Datei und alles inline zu setzen (indem es in der Klassendeklaration definiert wird), ist schrecklich und wird Ihre Kompilierungsleistung beeinträchtigen. Tu es nicht.
  2. Übermäßig OO - Um es zu vereinfachen, in Java ist es das Königreich der Nomen , in dem alles ein Objekt ist. Guter (dh idiomatischer) C ++ - Code verwendet mit größerer Wahrscheinlichkeit freie Funktionen, Vorlagen usw., anstatt zu versuchen, alles in ein Objekt zu packen.
  3. Kein RAII - Sie haben dies bereits erwähnt - mit Zeigern und manueller Bereinigung anstelle von intelligenten Zeigern. C ++ bietet Ihnen Tools wie RAII und Smart Pointer, so dass guter (dh idiomatischer) C ++ - Code diese Tools verwendet.
  4. Kein fortgeschrittenes C ++ - Die Grundlagen von Java und C ++ sind ähnlich genug, aber sobald Sie sich mit fortgeschritteneren Funktionen (Vorlagen, C ++ - Algorithmenbibliothek usw.) befassen, beginnen sie auseinander zu gehen.

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:

  • Wenn ein Prototyp-Code nicht alle möglichen Ausnahmen und alle möglichen Eckfälle behandelt, ist dies zu erwarten. Lass es funktionieren, dann lass es robust funktionieren. Kein Problem.
  • Wenn ein Prototypcode in einem schlechten Stil oder einem schlechten Design geschrieben ist (schlecht für die gegebene Sprache und ihre Redewendungen, ein grundlegend schlechtes Design für das Problem usw.), dann, es sei denn, Sie schreiben ihn als Wegwerfartikel Proof-of-Concept, Sie gewinnen nichts.

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.

Josh Kelley
quelle
11
gibt es idiomatisches perl?
Ratschenfreak
21
@Onno Wenn du fragst "Wie hämmere ich diese Schraube in die Wand, ohne dass sie verbogen wird?" Jeder wird dir sagen, dass du keinen Hammer benutzen sollst.
Sjoerd
9
@Onno In C ++ werden Zeiger und newals Powertools betrachtet. Automatische Speicherung ist das Handwerkzeug.
Sjoerd
9
@Onno: Sie müssen erkennen, dass C ++ - Programmierkurse dazu neigen, bei der Übernahme moderner Redewendungen zu verzögern, und was als gutes C ++ gilt, hat sich seit der Erfindung von C ++ ebenfalls enorm weiterentwickelt.
Bart van Ingen Schenau
7
Aufgrund der Geschichte von C ++ und der großen Anzahl von Programmierern, die die Sprache lernten, bevor viele der fortgeschritteneren Funktionen der Sprache auftauchten, gibt es eine Menge beschissenes C ++, das immer noch von Leuten geschrieben wird, die wie vor einem Jahrzehnt geschrieben haben. Bei Dingen wie RAII geht es darum, dass alle die modernen Methoden anwenden, damit wir nicht mehr dieselben vorhersehbaren Fehler sehen.
Gort the Robot
42

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:

  • Ich werde schreien, wenn Sie 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)
  • Ich werde weinen, wenn Sie 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)
  • Ich werde erschaudern, wenn Sie alle Ihre Variablen oben in Ihrer Funktion deklarieren, außer in C89, Pascal oder JavaScript.
  • Ich werde facepalm, wenn Sie alle Ihre Funktionen in Python, aber nicht in Java, einer Klasse
    zuordnen.
  • Ich werde weinen, wenn Sie return nullin Scala, aber nicht in einer C-ähnlichen Sprache
    (weil Scala einen OptionTyp hat)
  • Ich werde mich beschweren, wenn Sie einen rekursiven Algorithmus in Java schreiben, aber nicht in OCaml
    (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.

amon
quelle
Sie haben in einigen Punkten vollkommen Recht, aber am Ende sehen Sie nicht das Ziel. Du gehst davon aus, dass du Wissen erlangst, bevor du die Erfahrung hast, die das Wissen erlangt.
Onno
4
@Onno Meine wichtigsten Punkte (die die von Ihnen gestellten Fragen beantworten) sind, dass Sie Gewohnheiten nicht aus einer Sprache übernehmen können und davon ausgehen, dass dies in einer anderen eine bewährte Methode ist und dass der Versuch, von Anfang an sauberen Code zu schreiben, der Reinigung vorzuziehen ist es später auf. Bereinigen von Code - so gut es geht - ist ein Muss, bevor Sie andere um Hilfe bitten ( Tipps zu guten Code-Snippets finden Sie auf sscce.org ). Es ist inakzeptabel, Müllcode auf SO mit einem "Bitte beheben" abzulegen, insbesondere wenn Sie es besser wissen.
Amon
2
Aber in Bezug auf die Frage, auf die Sie hinweisen: Die Antwort von jm666 enthält einen wichtigen Punkt: Der Guru denkt: „Warum sollten Sie nach X fragen, wenn Sie selbst kein X-Guru werden möchten?“ Ich finde mich zu oft in dieser wenig hilfreichen Denkweise wieder . Ein möglicher Weg, dies zu entschärfen, besteht darin zu erwähnen, dass Sie sich noch ganz am Anfang der Lernkurve befinden und sich später damit befassen, aber diese unmittelbarere Frage vorerst zur Hand haben. Dies ist jedoch ein Kommunikationsproblem, kein Programmierproblem.
Amon
6
Sowohl C ++ und C # optional<T>und Nullable<T>jeweils. Praktisch jeder verliert Speicher in C ++ ohne RAII, noob oder nicht.
DeadMG
Ich finde, dass das Deklarieren von Variablen am Anfang eines Blocks Ihren Code in den meisten Sprachen leichter lesbar macht. Auf diese Weise wissen Sie genau, wo Sie suchen müssen, wenn Sie Hilfe benötigen, um sich daran zu erinnern, welche Typen all Ihre Variablen und solche sind.
Genießen Sie den
12

Ich bin kein Hardcore-C ++ - Entwickler, aber ...

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?

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.

Wie kann ein in C ++ geschriebenes Programm so sein, wie es in Java geschrieben wurde? Was macht es zu einem schlechten Programm?

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, FooFactoriesund IFrobnicatorswelche 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".

Doval
quelle
1
Vieles davon wird mit Java 8 gelindert - Lambdas reitet ein, um größtenteils den Tag zu retten :-)
Martijn Verburg
@MartijnVerburg Einverstanden, großer Schritt nach vorne. Aber technologische Probleme lassen sich leicht beheben! Alte Gewohnheiten sterben hart und Narben noch härter. Heck, einige Leute werden so weit gehen, sich zu beschweren, dass Java keine dieser "neuen" Funktionen benötigt und auf dem Weg ist, das nächste C ++ zu werden.
Doval
Ja, ich schüttle immer den Kopf - Java entwickelt sich absichtlich immer langsamer als andere Sprachen, da es ein langfristiges Arbeitstier ist. Die JVM kann jedoch etwas schneller vorwärts springen, wodurch Dinge wie Lambdas irgendwann in die Sprache gelangen.
Martijn Verburg
6

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:

$imax=$#array;
$str=""
for($i=0; $i<$imax; $i++) {
    $str = "$str" . $array[$i];
}

anstatt:

my $str = join '', @array;

sicher wird es kommentieren - (lies: lehre den Autor) über die joinFunktion.

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

Frage: Wie kann ich meinen Fernseher einschalten?

Was will das OP hören?

Zum Beispiel: Suchen Sie die Ein / Aus-Taste Ihrer TV-Fernbedienung und drücken Sie sie. Die Taste ist normalerweise rot und befindet sich in der obersten Zeile der Fernbedienung.

Die Antwort des #perl-Experten: Was meinen Sie zuerst mit "Einschalten"? Definiere es zuerst. Nopaste deinen Fernseher, deine Fernbedienung und auch das Wohnzimmer.

... nach einer Nopaste:

Dein Zimmer ist hässlich. Und der Fernseher sieht schrecklich aus. Verwenden Sie Mr. Clean auf dem Bildschirm und reinigen Sie zuerst Ihr Wohnzimmer. Verwenden Sie drei Reinigungsmops anstelle von zwei. Verwenden Sie HDMI und niemals Scart-Anschlüsse (?), Es sei denn, Sie möchten wirklich. Ihre TV-Fernbedienung hat nicht lesbare Tasten. Räumen Sie zuerst auf. Du bist ein Anfänger, also lies:

http://experts.blog/how_to_design_a_future_3D_TV.html http://experts.blog/the_basics_of_tv_repairing.html http://experts.blog/viruses_in_living_room_short_essay.html http://experts.blog/global_chip_replacement_guide.html

IRC-Gast: Aber ich möchte kein TV-Experte sein.

Antwort: Warum möchten Sie dann den Fernseher einschalten ?!

jm666
quelle
1
Diese Antwort ist nicht ohne Thema. Es erklärt genau, warum jemand den unkonventionellen Gebrauch einer Sprache kritisiert und warum diese automatische Kritik gelegentlich zu weit geht. Ich mag das.
Trichoplax
1

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?

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.

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?)

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.

Wie wäre ich ein schlechter Profi, wenn ich ein Konstrukt verwenden würde, das in einem bestimmten Programmierparadigma verwendet wird (z. B. OOP / DP)?

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.

Ratschenfreak
quelle
Ich kann sehen, dass das Vergessen, sich zu verbessern, für einige ein Problem sein kann, aber ich behalte eine lange Liste von Aufgaben und bin sehr diszipliniert, wenn es darum geht, Aufgaben für diese Art von Jobs zu erledigen. (Deshalb mag ich VS, es ist ziemlich gut im Arbeitsmanagement.) Das gleiche gilt für die Dokumentation. Ich schreibe keine Codezeile, bevor ich die Dokumentation dafür geschrieben habe. In Bezug auf die Eigentumsfrage denke ich, dass ich aufgrund der Sequenzdiagramme eine gute Vorstellung davon habe, wer Links zu wem hat.
Onno
1
@Onno: Ehrlich gesagt, niemand weiß oder kümmert es, wie gut Sie persönlich darin sind, den Überblick zu behalten. Die allermeisten Leute, die C ++ schreiben, das wie Java oder C aussieht, sind bei weitem nicht so akribisch. Es ist weitaus besser für sie, gleich beim ersten Mal zu lernen, wie man Dinge richtig macht, als sich selbst eine Notiz zu schreiben, um sie später zu reparieren, weil die Erfahrung zeigt, dass sie es praktisch nie wirklich tun.
CHAO