Gibt es eine bessere Strategie, als sich auf den Compiler zu verlassen, um Fehler abzufangen?

8

Ich programmiere seit einiger Zeit in C und C ++, obwohl ich sagen würde, dass ich weit davon entfernt bin, ein Experte zu sein. Seit einiger Zeit verwende ich verschiedene Strategien, um meinen Code zu entwickeln, z. B. Komponententests, testgetriebenes Design, Codeüberprüfungen usw.

Als ich meine ersten Programme in BASIC schrieb, tippte ich lange Blöcke ein, bevor ich feststellte, dass sie nicht ausgeführt werden würden und ein Albtraum zum Debuggen waren. Also habe ich gelernt, ein bisschen zu schreiben und es dann zu testen.

Heutzutage schreibe ich oft wiederholt ein kleines Stück Code und benutze dann den Compiler, um alle Fehler zu finden. Das ist in Ordnung, wenn es einen Tippfehler aufgreift, aber wenn Sie anfangen, die Parametertypen usw. anzupassen, damit es kompiliert wird, können Sie das Design vermasseln. Es scheint auch, dass sich der Compiler in den Entwurfsprozess einschleicht, wenn er nur zur Überprüfung der Syntax verwendet werden soll.

Hier besteht die Gefahr, dass ich mich zu sehr auf den Compiler verlasse, um meine Programme zu verbessern. Gibt es bessere Strategien als diese?

Ich erinnere mich vage an einen Artikel über ein Unternehmen, das eine Art C-Compiler entwickelt hat, in dem in einer zusätzlichen Header-Datei auch die Prototypen angegeben wurden. Die Idee war, dass Inkonsistenzen in der API-Definition leichter zu erkennen sind, wenn Sie sie zweimal auf unterschiedliche Weise definieren müssen.

Koan
quelle
Verlassen Sie sich darauf, dass der Programmierer Fehler abfängt ... durch Analyse, Verständnis, Testen und Kompilieren.
Dietbuddha

Antworten:

13

Passen Sie die Dinge nicht an, damit sie kompiliert werden. Passen Sie die Dinge an, um richtig zu sein . Wenn es so "entworfen" wurde, dass die Parametertypen nicht übereinstimmen, hat der Designer keine Ahnung, was sie tun.

Wenn Sie sich nicht auf den Compiler verlassen möchten, verbessern Sie Ihre Sprachkenntnisse. Studieren Sie die Struktur von Definitionen und Deklarationen und überprüfen Sie vor dem Kompilieren, was Sie auf Fehler schreiben. Und verwenden Sie Codeüberprüfungen.

Diese Idee mit zusätzlichen Prototypen klingt schlecht. Wenn Sie es einmal falsch entwerfen, was kann verhindern, dass das zweite Design falsch entworfen wird? Und wenn Sie verschiedene Formate / Paradigmen / usw. für dasselbe verwenden, werden Sie wahrscheinlich die Leute verwirren. Ich würde sicherstellen, dass jeder das primäre Format versteht, damit Sie sich darauf konzentrieren können, das Design beim ersten Mal richtig zu machen, anstatt die Designarbeit zu verdoppeln, um Fehler zu erkennen. Wie alles andere sollten Designs überarbeitet werden, aber ich denke nicht, dass es viel Sinn macht, es zunächst zweimal zu tun.

Matthew Read
quelle
Ich denke, der Designer (ich) hat sich nicht richtig an den Parameter der anderen Funktion erinnert, wahrscheinlich weil ich an eine frühere Version des Designs denke.
Koan
Die zweite Header-Datei wurde nicht in Standard C geschrieben, und ich denke, sie hatte die Form von Prototypen höherer Ebene. Die Idee war, dass wenn Ihre zwei unterschiedlichen Definitionen dasselbe definieren, Ihr Design mit größerer Wahrscheinlichkeit korrekt ist. Es waren nicht zwei Standard-C-Header-Dateien, sondern unterschiedliche "Typisierung".
Koan
Aber das war in der Implementierungsphase, richtig? So oder so ändern Sie es einfach, um dem Design zu folgen, oder ändern Sie das Design, um korrekt zu sein ... machen Sie den Compiler nicht nur glücklich;). Ich werde meine Antwort aktualisieren, um Ihre Erklärung der Prototypen widerzuspiegeln.
Matthew Read
Ich verstehe Ihren Standpunkt und ich denke, es ist eine gute Antwort, aber zu welchem ​​Zeitpunkt sagen Sie "Whoa, ich muss die gesamte Implementierung stoppen und wieder das richtige Design finden", weil "nur das Design ändern" auch schnell erledigt werden kann schnell, gründlich oder zu gründlich ...
Koan
Das ist eine wirklich schwer zu beantwortende Frage. Ich denke, es ist mehr ein erfahrungsbasiertes Gefühl als alles andere, außer wenn Sie auf das seltene "whoa, wir haben dieses Problem völlig missverstanden, müssen das Design neu machen" stoßen.
Matthew Read
4

Ehrlich gesagt glaube ich, dass Ihr Ziel IMMER darin bestehen sollte, ein Programm zu schreiben, das beim ersten Mal kompiliert wird. Mir ist klar, dass dies schwierig ist und wahrscheinlich nicht häufig vorkommen wird, aber es sollte immer noch Ihr Ziel sein. Stellen Sie sich die Software als Stück Hardware vor. Stellen Sie sich vor, dass es unrealistisch teuer ist, Ihren Code neu zu kompilieren (wie das Wiederherstellen eines Boards). Ein Complier ist kein Debugger und sollte nicht als solcher behandelt werden.

Pemdas
quelle
+1 für "Der Compiler ist kein Debugger"
Joris Meys
Interessant. Ich habe mich immer viel wohler gefühlt, wenn ich einen Fehler gefunden habe, weil sie unweigerlich in meinem Code vorhanden sind. Ich habe sie nur noch nicht gefunden. Bei meiner Frage geht es jedoch nicht so sehr um das Debuggen. Ich suche nach Strategien zum Entwerfen oder Schreiben von Code, die bei der Erstellung von gutem Code effektiver sind. Wenn Ihr Compiler beispielsweise mehr als X nicht triviale Fehlermeldungen ausgibt, sollten Sie das Design anhalten und überdenken. oder so.
Koan
Ich denke, Ihre beste Wahl, um zu lernen, wie man guten Code schreibt, ist, ein Buch darüber zu lesen. Ich empfehle Code Complete. Es ist das Beste, was ich persönlich über Software im Allgemeinen gelesen habe.
Pemdas
Ich glaube, Sie versuchen, das Problem zu beseitigen, indem Sie es gar nicht erst haben. Das ist keine schlechte Sache, aber letztendlich wird es Probleme geben, die beim Kompilieren auftauchen, schließlich ist niemand perfekt.
Koan
1
Während ein Compiler kein Debugger ist, besteht eine meiner bevorzugten Methoden für bestimmte Refactorings darin, ihn so zu gestalten, dass alter Code nicht kompiliert wird (möglicherweise durch Umbenennen). Erleichtert das Auffinden von übersehenen Dingen.
SDG
3

Der Compiler kann nicht alle Fehler finden, daher macht es keinen Sinn, dies vorzutäuschen. Alles, was es finden kann, sind die Syntaxfehler und Tippfehler. Es ist gut genug, dass ich es diesen Teil des Jobs machen lasse (obwohl heutzutage die Umgebung 99% von denen selbst abfängt, bevor Sie jemals auf Kompilieren klicken), aber ich weiß genau, dass das nicht alle Fehler sind.

Das einzige Mal, dass ich mich auf diese Art von Informationen verlasse, um mir zu sagen, was ich schreiben soll, ist, wenn ich Dinge wie diese bekomme, die mir sagen, dass ein Double nicht automatisch in einen Float umgewandelt werden kann - wenn Sie Daten senden, erwartet Floats (und seitdem) Was ich gerade mache, ist mit der XNA-Bibliothek zu spielen, die genau dies tut) und die Quelle gibt Doppelte zurück (wie es bei der C # -Mathematikbibliothek der Fall ist), dann müssen Sie einfach konvertieren.

Loren Pechtel
quelle
1

Der Compiler ist ein Werkzeug. Wie bei allen Werkzeugen können sie missbraucht werden.

Wenn Sie zum ersten Mal mit einer Sprache beginnen, ist es nichts Falsches, den Compiler blind zum Testen Ihres Programms zu verwenden. So funktioniert Lernen von Natur aus, raten und überprüfen Sie. Dies bedeutet jedoch nicht, dass Sie weiterhin so codieren sollten.

Es liegt in Ihrem besten Interesse, die Sprache gut genug zu verstehen, damit Sie Ihr Programm in Ihrem Kopf zusammenstellen können. Dann müssen Sie weniger darauf warten, dass der Compiler fertig ist.

Ich sage, es ist wahrscheinlich am besten, wenn sich das Programm immer innerhalb weniger Zeilen / Codeblöcke befindet, um kompilierbar zu sein.

Jeremy Heiler
quelle
0

Die meisten modernen IDEs haben viele Compilerprobleme, und ich glaube, ich bin auch ziemlich darauf angewiesen.

Vielleicht zurück zu Textdateien und Kommandozeilen-Compilern?

ozz
quelle
Ich benutze keine IDE! Vielleicht sollte ich anfangen? Ich habe immer gedacht, ich sollte, aber nie einen gefunden, mit dem ich zufrieden war.
Koan