Meinung zum Quellcode-Stil (war :Experten Meinung gefragt)
-
Wie wär's mit Member-Variablen deiner Klasse?
-
Auf jedenfall ist deine Variablenbenennung ein klassisches Beispiel warum ich persönlich die Ungarische Notation gänzlich ablehne (Man kann Variablen auch so benennen das sie alle verstehen - noch kein Entwickler ist an etwas längeren Variablennamen gestorben).
Zudem schließe ich mich mit der Empfehlung der "Member-Variablen" nur an. Kann es sei das du mit dem Codegear C++ Builder angefangen hast, ohne die C++ Grundlagen verinnerlicht zu haben? Ich würde dir jedenfalls dazu raten ein entsprechendes Buch nochmal anzuschauen (Gerade der Teil in den Klassen und Objekte beschrieben werden).
-
Dann will ich auch mal meine zwei Pfennig beisteuern:
-
One function - one purpose
Ein Funktion/Methode sollte genau einen einzigen Zweck erfüllen. Ausserdem sollten Funktionen/Methoden nur in Ausnahmefällen länger als eine oder zwei Bildschirmseiten sein. Wenn sie zu lang werden, unterteil das Problem in Teilprobleme und lager die Teilprobleme in eigene Funktionen/Methoden aus. -
intuitiv verständliche Variablennamen
Für temporäre Variablennamen in Schleifen kann man ruhig Namen wie a,i oder x benutzen. Man sollte sinnvolle Namen benutzen, wenn der Schleifenrumpf länger ist oder verschachtelt ist. Über den Sinn oder Unsinn der Kenntlichmachung von Member variablen kann man streiten, grundsätzlich bin ich aber für ein Prä- oder Postfix für Member Variablen (zB. m_ voranstellen wie m_Open oder _ anhängen wie bei Open_). -
Vermeidung von Schleifen so weit wie möglich, stattdessen Benutzung von Funktionen der Standardbibliothek. Ich weiss nicht genau, von welchem Typ die Variable merken ist, aber wenn es ein Array aus std::string oder AnsiString ist kann man std::fill benutzen.
clearing = 0; while(clearing < 16800) { clearing++; merken[clearing] == ""; } // oder als Einzeiler std::fill( merken, merken + 16800, "" );
-
Vermeidung von C-style Arrays, stattdessen Container aus der STL benutzen (z.B. std::vector). Ausserdem zwischen signed und unsigned Datentypen unterscheiden.
-
RAII (Resource acquisition is initialisation) Idiom benutzen
Variablen werden bei ihrer Deklaration initialisiert:
// statt int m; .... m = s / 60; // besser unsigned int Minute = Sekunde / 60;
-
Vermeiden von C-style casts, stattdessen C++ casts benutzen. Die C-Style casts wandeln ohne zu Murren Äpfel in Birnen um, die C++ Pendants (static_cast, dynamic_cast und reinterpret_cast) sind da schlauer und erlauben keine ungültigen Umwandlungen bzw. warnen den Programmierer bei möglicherweise ungültigen Umwandlungen.
-
Vermeidung von überflüssigem bzw. verwirrendem Code:
int m; m = s / 60; m = (int) m; // überflüssig
Ist irreführend und bewirkt nichts. m ist vom Datentyp integer, ein expliziter C-style cast macht ihn nicht noch "mehr" integer. Wenn du Fließkommazahlen nach integer wandeln willst und dabei auf- oder abrunden willst benutz die entsprechenden Funktionen dazu (ceil/floor).
- Auswahl der richtigen Datentypen
In deinem Schnipsel verwendest du die Variablen paused und open als int. Wenn sie nur einen von zwei definierten Zuständen annehmen können sollten sie bool sein. Der Status des Players kann sicher mehrere Zustände haben (Idle, Playing, Paused), da bietet sich ein Aufzählungstyp an:
namespace PlayerState { enum PlayerState_t { psIdle, psPlaying, psPaused }; }
PS:
Beim erneuten Durchlesen ist mir nicht klargeworden, was der Codeausschnitt aus Punkt 3) eigentlich macht. Das sind 16800 Tests auf einen leeren String, wobei kein Ergbnis berücksichtigt wird. Damit kann ich einen weiteren Punkt anführen, der nur indirekt etwas mit deinem Code zu tun hat.- const Correctness
Deklariere Variablen, deren Inhalt in einer Funktion nicht geändert werden, const. Deklariere Methoden, die den Status eines Objekts nicht ändern, const.
Zu diesem Thema kann man seitenweise schreiben (Stichworte observable state, mutable members), vielleicht findet google ja einige Artikel.
-
-
Tim06TR schrieb:
Aber C++ Builder schlägt mir folgendes vor:
if () { }
und das finde ich persönlich grausig
Das zugrundeliegende Live-Template kann unter Ansicht|Templates nach Gusto bearbeitet werden.
Tim06TR schrieb:
s wie Sekunde
m wie Minute
h wie hour (da fällts aus der reihe --> Eng)Stürmer der Netzkultur.
Zum Stil an sich wurde eigentlich alles gesagt; du hast es ja auch selbst passend zusammengefaßt. Die Ausdauer meiner Vorredner beeindruckt mich, mein Ratschlag wäre jedoch: bitte stell den C++Builder zur Seite und lerne BASIC oder Python.
-
Doch ich hab zuvor C++ Programmiert, einfache Konsolen Programm nix großes.
Ich bin nie ganz Strukturiert mit dem Lernen Vorgegangen aber, das ist alles "nur"
als reinschauen gedacht. Ich werde bald mit MFC anfangen und dabei solls dann auch bleiben.
Ich kenne da ein ganz nettes Buch, dass ich mir kaufen werde.
Danke für die ganze Tipps und Meinungen. Ich wusste zwar dass mein Code grotte ist
aber was alles (alles) Schlecht ist wollte ich mir nochmal sagen lassen.
Ich habe auch vor später was in der Richtung zu machen, studieren etc.In der Schule werden wir ja Java machen
. Hab ich eigentlich kein interesse dran. Aber ich werde bei C++ bleiben, hoffentlich bringt mich Java dann nicht durcheinander.
PS: Kommt auf den Informatiker Lehrer an, evtl (kann ich || die Anderen die Informatik gewählt haben) dem Lehrer mehr beibringen als er uns. Ja das Angebot bei uns ist eher traurig. Die Leben noch in der Steinzeit.
-
Tim06TR schrieb:
Ich werde bald mit MFC anfangen und dabei solls dann auch bleiben.
Gerade dann solltest du dich mit der OOP mal ein wenig mehr auseinandersetzen. Das 'Classes' in MFC steht ja für Klassen, wenn mir nix Falsches erzählt wurde.
Da kann es also nicht schaden, wenn man zumindest weiß, wie man Klassenmember anlegt...
-
asc schrieb:
Auf jedenfall ist deine Variablenbenennung ein klassisches Beispiel warum ich persönlich die Ungarische Notation gänzlich ablehne (Man kann Variablen auch so benennen das sie alle verstehen - noch kein Entwickler ist an etwas längeren Variablennamen gestorben).
War ja klar, jetzt wird wieder auf der UN rumgehackt. Dabei ist sein Code doch nun wirklich kein Beispiel dafür.
ifstream checker; int panelanpassung; int iterahms; int s; int m; int h = 0; int idex = ListBox1->ItemIndex; idex = idex+1; length[1] = 0; length[2] = 0; zuruk = 0; clearing = 0;
Das sind größtenteils einfach schlechte Bezeichner, mit UN hat das aber nix zu tun.
Btw, wie kommst du eigentlich darauf, dass die UN was mit kurzen Variablenbezeichnern zu tun hat? Es geht doch da nur um ergänzende Angaben. Das heißt noch lange nicht, dass man alles hinter dem Präfix bis zum geht-nicht-mehr abkürzen muss (mach ich auch nicht).
std::string sDiesIstMeinNamensStringUndDerIstTrotzPraefixSuperLangUndGarNichtAbgekuerzt;
-
audacia schrieb:
lerne BASIC.
Visual Basic ist Verdammt einfach. Ich habe schon mal Visual Basic Programmiert.
Doch mir fehlt irgendwie die Kenntniss über das Nutzen von Basic. Wo braucht man Basic ?
-
Tim06TR schrieb:
audacia schrieb:
lerne BASIC.
Visual Basic ist Verdammt einfach. Ich habe schon mal Visual Basic Programmiert.
Doch mir fehlt irgendwie die Kenntniss über das Nutzen von Basic. Wo braucht man Basic ?Was für eine Frage! Du kannst mit VB schneller ans Ziel kommen, als mit C++, kannst weniger Fehler machen, die Syntax ist für Anfänger vielleicht leichter zu verstehen usw. Würdest du auch fragen, wozu man C# braucht? VB war übrigens zuerst da.
-
Zudem Code:
clearing = 0; while(clearing < 16800) { clearing++; merken[clearing] == ""; }
Muss ich zugeben ich weiß auch nicht mehr wozu das war.
Tja da sieht mans, ich glaube das war eine ursprüngliche Fehlerbehung im falle des wechsels der Playlist, kann glaub ich raus.
// Buh
// oh ein Kommentar
-
_matze schrieb:
Tim06TR schrieb:
audacia schrieb:
lerne BASIC.
Visual Basic ist Verdammt einfach. Ich habe schon mal Visual Basic Programmiert.
Doch mir fehlt irgendwie die Kenntniss über das Nutzen von Basic. Wo braucht man Basic ?Was für eine Frage! Du kannst mit VB schneller ans Ziel kommen, als mit C++, kannst weniger Fehler machen, die Syntax ist für Anfänger vielleicht leichter zu verstehen usw. Würdest du auch fragen, wozu man C# braucht? VB war übrigens zuerst da.
Auch wenn das keine Antwort auf meine Frage war.
Außerdem errinert mich das an "C ein Aprillscherz ?"
-
Tim06TR schrieb:
Doch ich hab zuvor C++ Programmiert, einfache Konsolen Programm nix großes.
Ich bin nie ganz Strukturiert mit dem Lernen Vorgegangen aber, das ist alles "nur"
als reinschauen gedacht. Ich werde bald mit MFC anfangen und dabei solls dann auch bleiben.
Ich kenne da ein ganz nettes Buch, dass ich mir kaufen werde.
Danke für die ganze Tipps und Meinungen. Ich wusste zwar dass mein Code grotte ist
aber was alles (alles) Schlecht ist wollte ich mir nochmal sagen lassen.
Ich habe auch vor später was in der Richtung zu machen, studieren etc.In der Schule werden wir ja Java machen
. Hab ich eigentlich kein interesse dran. Aber ich werde bei C++ bleiben, hoffentlich bringt mich Java dann nicht durcheinander.
PS: Kommt auf den Informatiker Lehrer an, evtl (kann ich || die Anderen die Informatik gewählt haben) dem Lehrer mehr beibringen als er uns. Ja das Angebot bei uns ist eher traurig. Die Leben noch in der Steinzeit.
Fass die Vorschläge als konstruktive Kritik auf und nimm sie dir zu Herzen. Niemand hat das alles von heute auf morgen gelernt, selbst nach 15 Jahren lernt man noch Sachen dazu, man muss nur wollen.
Im übrigen ist es fast egal, ob du Java oder C++ machst, die Algorithmen bleiben die Gleichen. Du musst dir nur darüber im Klaren sein, dass es zwei verschiedene Programmiersprachen sind, die zwar eine ähnlich Syntax haben, unter der Haube allerdings grundverschieden sind. Wenn du eine neue Programmiersprache lernst, fang bei den Grundlagen an statt sie auszulassen in den Gedanken, dass es bei einer anderen Programmiersprache genauso aussieht und das Verhalten wohl das Gleiche sein wird (Besonders Java Programmierer, die C++ programmieren sollen fallen da in die eine oder andere Fallgrube).
-
Teilweise wollte ich damit eigentlich sagen, dass ich die Grundlagen nur zu Hälfte drin hab, das liegt daran, dass ich mir keine Lernvorlage genommen habe
Ich kenne jemand der hat keine Grundlagen gelernt, und der hat gar keine Ahnung was er für Algorithmen schreibt, wenn ihr versteht was ich meine.
Der hat sofort mit VCL angefangen ohne irgendeine Vorkenntnis und er überhäuft mich mit Fragen ,dass ist also noch ein Stück härter, somit versteh ich schon
was ihr mir Mitteilen wollt.
-
Tim06TR schrieb:
_matze schrieb:
Tim06TR schrieb:
audacia schrieb:
lerne BASIC.
Visual Basic ist Verdammt einfach. Ich habe schon mal Visual Basic Programmiert.
Doch mir fehlt irgendwie die Kenntniss über das Nutzen von Basic. Wo braucht man Basic ?Was für eine Frage! Du kannst mit VB schneller ans Ziel kommen, als mit C++, kannst weniger Fehler machen, die Syntax ist für Anfänger vielleicht leichter zu verstehen usw. Würdest du auch fragen, wozu man C# braucht? VB war übrigens zuerst da.
Auch wenn das keine Antwort auf meine Frage war.
Außerdem errinert mich das an "C ein Aprillscherz ?"Ach, ich hatte 'wozu' statt 'wo' gelesen, sorry. Wenn du meinst, wo man VB einsetzt... tja, so genau kann ich dir das auch nicht sagen. Aber ich schätze, es gibt auch genug Software-Firmen, die ihr Zeugs in VB programmieren. Die Gründe dürften halt dieselben wie bei C# o.ä. sein.
Ich habe früher selbst mal was für Kunden in VB geschrieben. War ein schöner Einstieg in die Windows-Programmierung (war in meiner Ausbildung, wir haben eigentlich nur DOS-Anwendungen in Clipper geschrieben). Einige WinAPI-Funktionen habe ich dabei schon mal kennengelernt. Und es war halt möglich, quasi während des Einstiegs in die Sprache ein ordentliches (gar nicht sooo kleines) Programm zustande zu bringen, dass mehreren Kunden geholfen und auch gut gefallen hat. Mit VC++ hätte ich sicher ein Vielfaches der Zeit gebraucht...