Existiert schönes C++ in der Praxis?
-
Wie kann es sein, dass 99% des C++-Codes, den ich finden kann, kein RAII enthält, obwohl es hier im Forum als der einzige Existenzgrund für C++ angepriesen wird?
Hier mal eine Funktion aus Code::Blocks, einer Entwicklungsumgebung entwickelt von fähigen C++ern:
http://svn.code.sf.net/p/codeblocks/code/trunk/src/src/find_replace.cpp
int FindReplace::ReplaceInFiles(cbFindReplaceData* data) { if (!data) return 0; if (data->findText.IsEmpty()) return 0; EditorManager *editorMgr = Manager::Get()->GetEditorManager(); bool IsMultiLine = data->IsMultiLine(); // let's make a list of all the files to search in wxArrayString filesList; if (data->scope == 0) // find in open files { // fill the search list with the open files for (int i = 0; i < editorMgr->GetEditorsCount(); ++i) { cbEditor* ed = editorMgr->GetBuiltinEditor(i); if (ed) filesList.Add(ed->GetFilename()); } } else if (data->scope == 1) // find in project files { // fill the search list with all the project files if (data->searchProject<0) { cbMessageBox(_("No project to search in!"), _("Error"), wxICON_WARNING); return 0; } cbProject* prj = (*Manager::Get()->GetProjectManager()->GetProjects())[data->searchProject]; wxString target; wxString fullpath = _T(""); if (data->searchTarget >= 0) target = prj->GetBuildTarget(data->searchTarget)->GetTitle(); for (FilesList::iterator it = prj->GetFilesList().begin(); it != prj->GetFilesList().end(); ++it) { ProjectFile* pf = *it; if (pf) { if (target!=wxEmptyString && pf->buildTargets.Index(target)<0) continue; fullpath = pf->file.GetFullPath(); if (filesList.Index(fullpath) >= 0) // avoid adding duplicates continue; if (wxFileExists(fullpath)) // Does the file exist? filesList.Add(fullpath); } } } else if (data->scope == 2) // find in workspace { // loop over all the projects in the workspace (they are contained in the ProjectManager) const ProjectsArray* pProjects = Manager::Get()->GetProjectManager()->GetProjects(); if (pProjects) { int count = pProjects->GetCount(); for (int idxProject = 0; idxProject < count; ++idxProject) { cbProject* pProject = pProjects->Item(idxProject); if (pProject) { wxString fullpath = _T(""); for (FilesList::iterator it = pProject->GetFilesList().begin(); it != pProject->GetFilesList().end(); ++it) { ProjectFile* pf = *it; if (pf) { fullpath = pf->file.GetFullPath(); if (filesList.Index(fullpath) == -1) // avoid adding duplicates { if (wxFileExists(fullpath)) // Does the file exist? filesList.Add(fullpath); } } } // end for : idx : idxFile } } // end for : idx : idxProject } } else if (data->scope == 3) // replace in custom search path and mask { // fill the search list with the files found under the search path int flags = wxDIR_FILES | (data->recursiveSearch ? wxDIR_DIRS : 0) | (data->hiddenSearch ? wxDIR_HIDDEN : 0); wxArrayString masks = GetArrayFromString(data->searchMask); if (!masks.GetCount()) masks.Add(_T("*")); unsigned int count = masks.GetCount(); wxLogNull ln; // no logging for (unsigned int i = 0; i < count; ++i) { // wxDir::GetAllFiles() does *not* clear the array, so it suits us just fine ;) wxDir::GetAllFiles(data->searchPath, &filesList, masks[i], flags); } } // if the list is empty, leave int filesCount = filesList.GetCount(); if (filesCount == 0) { cbMessageBox(_("No files to search in!"), _("Error"), wxICON_WARNING); return 0; } bool advRegex=false; bool advRegexNewLinePolicy =! data->IsMultiLine(); int flags = 0; if (data->matchWord) flags |= wxSCI_FIND_WHOLEWORD; if (data->startWord) flags |= wxSCI_FIND_WORDSTART; if (data->matchCase) flags |= wxSCI_FIND_MATCHCASE; if (data->regEx) { flags |= wxSCI_FIND_REGEXP; if (Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/use_posix_style_regexes"), false)) flags |= wxSCI_FIND_POSIX; #ifdef wxHAS_REGEX_ADVANCED advRegex = Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/use_advanced_regexes"), false); #endif } wxRegEx re; #ifdef wxHAS_REGEX_ADVANCED if (advRegex) { if (data->matchCase) re.Compile(data->findText,wxRE_ADVANCED|(wxRE_NEWLINE*advRegexNewLinePolicy)); else re.Compile(data->findText,wxRE_ADVANCED|(wxRE_NEWLINE*advRegexNewLinePolicy)|wxRE_ICASE); } #endif bool replace = false; bool confirm = true; bool stop = false; bool wholeFile = false; bool all = false; int pos = -1; wxPoint LastDlgPosition; bool HaveLastDlgPosition = false; wxProgressDialog* progress = 0; wxString fileContents; wxString enc_name = Manager::Get()->GetConfigManager(_T("editor"))->Read(_T("/default_encoding"), wxLocale::GetSystemEncodingName()); wxFontEncoding def_encoding = wxFontMapper::GetEncodingFromName(enc_name); // keep a copy of the find struct cbFindReplaceData dataCopy = *data; int read_only_files_skipped = 0; for (int i = 0; i<filesCount && !stop; ++i) { cbEditor* ed = NULL; cbStyledTextCtrl* control = NULL; bool fileWasNotOpen = false; if (progress) { if (!progress->Update(i)) { if (cbMessageBox(_("Are you sure you want to stop replacing in files?"), _("Confirmation"), wxICON_QUESTION | wxYES_NO) == wxID_YES) break; else progress->Resume(); } } //Check if this file is already open EditorBase *eb = editorMgr->IsOpen(filesList[i]); if (eb) { //File was already open fileWasNotOpen = false; ed = editorMgr->GetBuiltinEditor(eb); if (ed) control = ed->GetControl(); } //If it's still NULL, open a new editor if (!control) { wxFile file(filesList[i]); if (!file.IsOpened()) continue; fileContents = cbReadFileContents(file, def_encoding); if (advRegex) { if (!re.Matches(fileContents)) continue; } else { int pos_str; if (!data->matchCase) pos_str = fileContents.Upper().Find(data->findText.Upper()); else pos_str = fileContents.Find(data->findText); if (pos_str == -1) continue; //TODO: handling to skip file if data->matchWord or data->startWord are set } //File was not open, i opened it. fileWasNotOpen = true; ed = editorMgr->Open(filesList[i]); if (ed) control = ed->GetControl(); } //Still NULL? if (!control || !ed) continue; if (control->GetReadOnly()) { read_only_files_skipped++; continue; } editorMgr->SetActiveEditor(ed); *data = dataCopy; bool replacementsWereMade = false; // If we fix the file's EOLs for multi-line S&R, we're actually modifying it. // What we really want to know is whether we actually did a replacement. // If not (and the file was not open in the first place), we can safely close the file. { // We should be checking if the data has EOLs before converting them. But searching is // just as expensive as doing the conversion itself, so we just convert. int eolMode = control->GetEOLMode(); data->ConvertEOLs(eolMode); if (IsMultiLine && data->fixEOLs) { control->BeginUndoAction(); //undo control->SetChangeCollection(false); control->ConvertEOLs(eolMode); control->SetChangeCollection(true); control->EndUndoAction(); } } control->BeginUndoAction(); // undo CalculateFindReplaceStartEnd(control, data, true); //reset bools wholeFile = false; if (!all) confirm = true; //Replace in this file while (!stop || wholeFile) { int lengthFound = 0; if (!advRegex) pos = control->FindText(data->start, data->end, data->findText, flags, &lengthFound); else { wxString text=control->GetTextRange(data->start, data->end); if (re.Matches(text)) { size_t start,len; re.GetMatch(&start, &len, 0); pos = start + data->start; lengthFound = len; if ((start==0) && (len==0)) //For searches for "^" or "$" (and null returning variants on this) need to make sure we have forward progress and not simply matching on a previous BOL/EOL find { text = text.Mid(1); if (re.Matches(text)) { re.GetMatch(&start, &len, 0); pos = start + data->start + 1; lengthFound = len; } else pos = -1; } } else pos = -1; } if (data->startFile && (pos > 0)) pos = -1; // Not found at the beginning of file if ((pos == -1) || (data->start == data->end)) break; if (confirm) { control->GotoPos(pos); control->EnsureVisible(control->LineFromPosition(pos)); } control->SetSelectionVoid(pos, pos + lengthFound); data->start = pos; data->initialreplacing = false; // special treatment only necessary the first time if (confirm) { ConfirmReplaceDlg dlg(Manager::Get()->GetAppWindow(), true); // dlg.CalcPosition(control); // TODO (thomas#1#): Check whether the existing code actually works with twin view // else, we need something like: // PlaceWindow(&dlg, pdlRelative); // NOTE (Tiwag#1#): dlg.CalcPosition doesn't work for me with dual monitor setup, // workaround : remember last dialog position, user can position // it outside of text where he wants // Move dialog to last position if already available, // else place it according to environments settings if ( HaveLastDlgPosition ) dlg.Move(LastDlgPosition); else dlg.CalcPosition(control); int ans = dlg.ShowModal(); LastDlgPosition = dlg.GetPosition(); HaveLastDlgPosition = true; switch (ans) { case crYes: replace = true; break; case crNo: replace = false; break; case crAllInFile: confirm = false; replace = true; wholeFile = true; break; case crSkipFile: confirm = false; replace = false; wholeFile = true; break; case crAll: replace = true; confirm = false; all = true; // let's create a progress dialog because it might take some time depending on the files count progress = new wxProgressDialog(_("Replace in files"), _("Please wait while replacing in files..."), filesCount, Manager::Get()->GetAppWindow(), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); PlaceWindow(progress); // now that we need no confirmation, freeze the app window Manager::Get()->GetAppWindow()->Freeze(); break; case crCancel: stop = true; break; default: break; } }// if if (!stop) { if (replace) { replacementsWereMade = true; int lengthReplace = data->replaceText.Length(); if (data->regEx) { // set target same as selection control->SetTargetStart(control->GetSelectionStart()); control->SetTargetEnd(control->GetSelectionEnd()); if (advRegex) { wxString text=control->GetSelectedText(); re.Replace(&text,data->replaceText,1); lengthReplace=text.Len(); control->ReplaceSelection(text); } else // replace with regEx support lengthReplace = control->ReplaceTargetRE(data->replaceText); // reset target control->SetTargetStart(0); control->SetTargetEnd(0); } else control->ReplaceSelection(data->replaceText); data->start += lengthReplace; // adjust end pos by adding the length difference // between find and replace strings int diff = lengthReplace - lengthFound; if (data->directionDown) data->end += diff; else data->end -= diff; } else { if (data->directionDown) data->start += lengthFound; else data->start -= lengthFound; } }// if }// while control->EndUndoAction(); // undo // If opened the file and no replacement was made, close the editor if (!replacementsWereMade && fileWasNotOpen) editorMgr->Close(ed, true); }// for if (read_only_files_skipped) { wxString msg; msg.Printf(_("Skipped %d read-only file(s)."), read_only_files_skipped); InfoWindow::Display(_("Warning"), msg); } // if we showed the progress, the app window is frozen; unfreeze it if (progress) Manager::Get()->GetAppWindow()->Thaw(); delete progress; AnnoyingDialog dlg(_("Replace in files"), _("Replace in files has finished all operations."), wxART_INFORMATION, AnnoyingDialog::OK); dlg.ShowModal(); return pos; }(Im gleichen File existieren mehrere dieser Funktionen, die grösstenteils das gleiche machen und gleich lang sind)
Das stimmt so ziemlich gut überein mit dem Stil aus anderen C++-Projekten (z.B. Firefox).
Existiert RAII&co. nur in Foren? Wieso findet man keinen "schönen Code" in Nicht-Spielzeug-C++-Projekten?
-
Also ich bemühe mich immer und überall gutes und schönes C++ zu schreiben. Egal ob für Uni, Arbeit oder Privat.
Aber oft klappt das nicht so wie es soll. Entweder man hat nicht genug Zeit oder man baut nur was zu Testzwecken ein oder es kommt ein Feature, wo man nichtmals weiss, wie man das auch nur halbwegs gut umsetzen könnte.
Und wenn dann keine Zeit für Refaktorisierungen bleiben, tja, dann wirds eben nicht so ganz gutes C++.Ich persönlich sehe auch gerade im OpenSource Bereich 2 große Probleme:
1.- viele OpenSource'ler kommen aus der C Ecke und mischen sehr viel C mit C++ (C with Classes)
2.- bestimmte (leistungsstarke) Konzepte sind auch nicht unbedingt für jedermann vereinbar. Will sagen, diese Konzepte erfodern Einarbeiten, gewisses Basiswissen und auch Disziplin (die ganze Smart-Pointer Geschichte sit manchmal so unendlich viel Tipparbeit :().Und wer weiss, ob nicht sogar eine eigener Memeory-Manager hinter dem Code sitzt, der alles aufräumt im Notfall.
-
Es ist halt schwierig. Die wenigsten lernen C++-Stil und es gibt imo auch wenig Material dazu. Softwareprojekte sind groß, viele C++-Codes aber nicht. Und dann ist eben der Mist, dass Java verbreiteter ist, was dazu führt, dass man ständig Java-Patterns findet, wenn man C++-Code umsetzen möchte (dennoch muss ich sagen, dass das manchmal einfach gut und okay ist ;)).
"Guter" C++-Stil ist halt nochmal schwieriger und unbekannter als irgendein C++. Wenn man von C kommt, muss man hart arbeiten, wenn man von Java kommt, muss man hart arbeiten und man kommt immer von irgendwoher, weil C++ keine Einstiegssprache ist. Und dann eben das Problem, dass es kaum Literatur zu großen Softwarearchitekturen mit C++ gibt (im Gegensatz zu anderen Sprachen), also müssen sich die Leute das irgendwoher aneignen.
Und woher? Da ist die Antwort oft Erfahrung. Braucht man in C++ aber mehr als überall sonst, also haben es durchschnittlich weniger Leute. Und selbst wenn das im Team einer hat, bringt das nichts, das muss schon jeder haben, sonst hat man keinen einheitlichen Stil und das ist oft schlimmer als irgendwelche Stile gemischt, auch wenn einer davon feinstes C++ ist.
Als ich nach chicen Codes suchte, fand ich Chrome ganz okay gelöst (wobei ich nicht weiß, ob die viel mit Templates arbeiten, obwohl das oft wohl ginge). Vielleicht ist das für OP auch was.
Abseits vom Thema:
Skym0sh0, was findest Du an Smartpointern so viel Schreibarbeit? mittypedefs undautokommt man doch ganz gut klar, finde ich. Und bei den ganzenunique_ptr-Einsätzen spart man sich doch auch dasdeletean Schreibarbeit.
-
Eisflamme schrieb:
Und bei den ganzen
unique_ptr-Einsätzen spart man sich doch auch dasdeletean Schreibarbeit.Nicht nur das. Man spart sich auch, den Poiner auf Gültigkeit zu überprüfen und kann mit einem einzelnen und übersichtlichen Befehl "moven".
Zum Einen könen wie schon gesagt kaum Leute ordentliches C++. Es gibt ja sogar noch Leute, die Strings mit strcmp, strcpy etc bearbeiten.Dass ganze Iteratorenkonzept ist auch für Neulinge völlig verwirrend. Ich habe erst nach langer Zeit intensiver Beschäftigung mit C++ die Vorteile verstanden und war bis dahin über die übersichtlichen Klassen der Irrlicht-Engine froh.
Viele großen Projekte starteten auch in der Vergangenheit, bevor es Konzepte dazu gab und sind zu komplex, um noch umgestellt zu werden.
Mit Glück haben sie die fast gleichen Klassen aus der boost-library, aber das Einbinden dieser ist auch immer ein erheblicher Aufwand und man schleppt möglicherweise große Mengen Ballast (ungenutzer Code) mit sich rum und bekommt riesige Dateien. Deswegen hat man bei vielen Dingen auch keine RAII Klassen bereit gestellt bekommen oder musste sie selbstständig implementieren.
SmartPointer, die RAII erst konsequent für Pointer implementiert haben, gibt es ja auch erst seit 2011, davor nur die blöden auto_ptr oder halt boost. Das gleiche gilt auch für viele andere Dinge, wie Threads.
Das einzig Blöde ist nur, dass sehr viel auf die schon ewig vorhandenen streams zugunsten von fopen, printf, fputs etc. verzichtet wird, aber das ist die gewohnheit, denn diese Funktionen gibt es oft sogar mit gleichem Namen in fast allen Sprachen.
-
Eisflamme schrieb:
mit
typedefs undautokommt man doch ganz gut klar, finde ich. Und bei den ganzenunique_ptr-Einsätzen spart man sich doch auch dasdeletean Schreibarbeit.Allein das ist schon etwas praxisfern. Wie lange gibts C++11 schon? Noch nicht so lang. Im Gegensatz dazu gibts viele C++ Projekte schon seit Jahrzehnten. Wir benutzen in der Arbeit kein C++11 (und keinen C++11 fähigen Compiler) und es wird sicher noch Jahre dauern, bis wir umsteigen. Und irgendwie hab ich das Gefühl, als ob jetzt alle so tun würden, als ob C++ erst mit C++11 eine schöne Sprache geworden wäre, obwohl sie auch davor immer C++ Fans waren.
Ansonsten hab ich mich natürlich auch schon öfter gefragt, warum man in der Praxis so wenig schönen C++ Code findet. Ich könnte wahrscheinlich tausend Gründe finden, warum unser Code nicht besonders schön ist und warum ich ihn trotzdem ganz brauchbar finde, aber mich würd trotzdem mal interessieren, warum die meisten anderen keinen schönen Code schreiben ^^
-
Mechanics schrieb:
Und irgendwie hab ich das Gefühl, als ob jetzt alle so tun würden, als ob C++ erst mit C++11 eine schöne Sprache geworden wäre, obwohl sie auch davor immer C++ Fans waren.
C++ ist halt deutlich schöner geworden, weil es übersichtlicher und intuitiver geworden ist. Man kann ein Array per initializer_list in der Parameterliste der Funktion erzeugen und muss nicht wie früher den Container vorher anlegen und die Werte einzeln einfügen und man hat endlich ein foreach.
Super Tux Card ist ein Programm, das ordentliches C++ verwendet, aber halt noch c++03.
Die Irrlicht-engine selber ist zwar ordentlich und schön designed, aber RAII fehlt hier auch, an templates mangelt es und auf die stl wird fast vollständig verzichtet (hatte damals aber auch Gründe).
-
Die Leute hier im Forum sind eher Hobby-Progger und programmieren nur ganz kleine Sachen. Jedes größere Projekt ist eklig - egal in welcher Sprache. Versprochen!
-
raii-man schrieb:
Die Leute hier im Forum sind eher Hobby-Progger und programmieren nur ganz kleine Sachen. Jedes größere Projekt ist eklig - egal in welcher Sprache. Versprochen!
Dem würde ich beidem einfach mal so widersprechen.
1.- die meisten hier arbeiten auch beruflich als Software-Entwickler. Es sind sicherlich einige Studenten/Schüler dabei. Einem Schüler kann man unterstellen, dass er von "richtiger" Entwicklung keine/kaum Ahnung hat. Aber schon bei einem Informatik Studenten kann man mit solch einer Behauptung auf die Nase fallen.
2.- Klar, Projekte sind ab einem gewissen Umfang per Definition schon komplex und groß. Aber das bedeutet nicht eklig. Sieh es eher als Herausforderung. Aber es wird sicherlich auch große Projekte geben, die sehr gut sind.
Ich meine, wir Programmierer streben doch alle dem Idealismus nach, gerade hier im Forum. Lauffähigkeit reicht nicht, Fehlerfreiheit und Schönheit des Codes muss genauso erfüllt sein.
Und zumindest mir geht es, dass ich bei total schlechten Code einen Würgereiz kriege und diesen refaktorisiere. Und wenn mir das verwehrt bleibt, dann sinkt meine Motivation ungemein und meine Arbeitskraft geht gegen nullptr. (<-- Höhö^^, Witz g'macht)
-
Skym0sh0 schrieb:
Und zumindest mir geht es, dass ich bei total schlechten Code einen Würgereiz kriege und diesen refaktorisiere. Und wenn mir das verwehrt bleibt, dann sinkt meine Motivation ungemein und meine Arbeitskraft geht gegen nullptr.
Das geht mir auch so. Wenn ich ein kleines Stück Code herunterlade, dann passe ich das an den Standard und meinen Programmierstil an. Bei großen Programmteilen wird natürlich nur die API oder gar nichts angepasst.
-
schöner Code gesucht schrieb:
Wie kann es sein, dass 99% des C++-Codes, den ich finden kann, kein RAII enthält, obwohl es hier im Forum als der einzige Existenzgrund für C++ angepriesen wird?
Ganz davon abgesehen das RAII mit Sicherheit nicht als der einzige Grund für C++ angepriesen wird, wirst du es sicherlich schwer haben, guten C++ Code zu finden (gerade im Internet). Die Gründe sind vielfältig:
1. Gerade im OpenSource-Bereich arbeiten viele Hobbyentwickler mit.
2. Je nach Altersstruktur im Projekt wird man wenig von Konzepten sehen, die erst in den letzten 10 Jahren stark an Bedeutung gewonnen haben.
3. Viele Lehrbücher sind von (Tut mir Leid für die harte Formulierung, trifft aber leider recht häufig zu) Fachidioten, die nach meiner Erfahrung entweder älteren Semesters oder zumindest keine großen Projekte betreut haben.
4. Viele C++ nur als erweitertes C ansehen.
5. Viele Projekte unter Zeitdruck und mit permanenten Stress für die Entwickler gebaut werden.schöner Code gesucht schrieb:
Hier mal eine Funktion aus Code::Blocks, einer Entwicklungsumgebung entwickelt von fähigen C++ern:
Darf ich mal dumm fragen, warum du annimmst, das die Entwickler "fähig" waren?
Für mich sieht dies nach Code aus der definitiv aufgetrennt gehört, von einigen anderen Problemen ganz abgesehen.
schöner Code gesucht schrieb:
Existiert RAII&co. nur in Foren?
Nein, auch wenn in Foren sicherlich mehr davon existiert als Außerhalb davon, alleine schon weil ein Forum wie dieses auch einen gewissen Lehrcharakter haben soll. Gerade wenn es darum geht sollte man den Code möglichst ideal gestalten, damit es überhaupt eine Chance hat sich festzusetzen.
Zudem hat man in einem Forum auch keinen Zeitdruck hinter sich, oder Menschen hinter sich, die nach dem Studium das Lernen eingestellt haben.
schöner Code gesucht schrieb:
Wieso findet man keinen "schönen Code" in Nicht-Spielzeug-C++-Projekten?
Oh, es gibt definitiv auch "schönen Code" in großen Projekten, auch wenn ich dir kein Beispiel zeigen kann (Closed Source). Ich kenne aber auch viel schlechten Code (Die Gründe hast du oben schon bekommen).
-
raii-man schrieb:
Die Leute hier im Forum sind eher Hobby-Progger...
Nach meiner Erfahrung sind hier einige langjährige Entwickler mit Berufserfahrung zu finden (Ich z.B. bin ca. 13,5 Jahre Vollzeit in der Branche tätig). Und kaum ein Projekt davon war unterhalb von etwa 1/4 Millionen Codezeilen (Dies soll nicht über die Qualität, sondern über die Größe eine grobe Aussage treffen), das größte bei etwa dem 20igfachen davon.
raii-man schrieb:
Jedes größere Projekt ist eklig - egal in welcher Sprache. Versprochen!
Falsch. Hier kommt es in erster Linie darauf an, wie das Projekt aufgezogen und strukturiert wurde. Zwar ist die Tendenz für schlechten Code in größeren Projekten nach meiner Erfahrung auch höher, aber auch große Projekte kann man in kleine Einheiten auftrennen und so sinnvoll beherrschbar machen.
Problematisch an großen Projekten ist eher, das diese auch häufig eine lange Laufzeit haben, nicht selten auch ein sehr großes und wechselndes Team. Wenn ein Projekt 20 Jahre alt ist, wird sicherlich auch der ein oder andere Code einem Codestil folgen der vor eben jener Zeit üblich war.
Zudem sind die Entwickler unterschiedliche Codestile gewohnt und ebenso gibt es sehr Viele, die noch immer so programmieren, wie zu ihren Anfangszeiten (Ich verlange ja nicht, das sie extrem viel nebenher lernen, aber einmal alle 2-3 Jahre sich über den aktuellen Stand zu informieren ist wohl nicht zu viel verlangt).
-
Ich habe mit C angefangen und mein Code war voll mit malloc und free. Irgendwann habe ich dann malloc durch new und free durch delete ersetzt und ein paar
KlassenStructs mit Memberfunktionen hinzugefügt, dann char buffer[1024] durch string ersetzt, dann new/delete durch RAII usw. Immer wenn ich was neues gelernt und verstanden habe habe ich es auch eingesetzt, aber nie alles komplett überarbeitet. Entsprechend schlecht sieht der Code aus, von Anfänger-C bis ordentlichem C++ ist alles dabei. Es sind inzwischen ~40k Zeilen geworden.
Jetzt, wo ich deutlich mehr Plan habe könnte ich alles viel besser, aber nun ist der Code wie er ist und einen Monat (Zeit ist geraten) mit "Codeaufhübschung" zu verbringen kann ich nicht rechtfertigen.
Mein Punkt ist, dass Projekte von Leuten angefangen werden, die keine Ahnung haben. Und wenn sie später Ahnung bekommen oder ersetzt werden ist es zu spät.Ich meine mal den Vorschlag gehört zu haben, dass Programmiere in den ersten 5 Jahren keine eigenen Projekte anfangen dürfen. Nachdem sie 5 Jahre unter miserablem Code leiden mussten schreiben sie ordentlichen.
-
nwp3 schrieb:
Nachdem sie 5 Jahre unter miserablem Code leiden mussten schreiben sie ordentlichen.
Oder gewöhnen sich an eben diesen (was nach meiner Erfahrung eher passiert)...
-
nwp3 schrieb:
Ich meine mal den Vorschlag gehört zu haben, dass Programmiere in den ersten 5 Jahren keine eigenen Projekte anfangen dürfen. Nachdem sie 5 Jahre unter miserablem Code leiden mussten schreiben sie ordentlichen.
Ich habe bei mir die Erfahrung gemacht, dass es sich durchaus lohnt, Projekte anzufangen, solange man sich jederzeit der Tatsache bewusst ist, dass man es wahrscheinlich nicht schafft. Solange man ein Ziel vor Augen hat, arbeitet man motiviert weiter. Irgendwann kommt man an den Punkt, dass man es einfach nicht mehr weiterschafft. Dann erkennt man seine Fehler und bemerkt, dass z.B. modularer Aufbau hilft, die Übersicht zu wahren, dass man sich bei exceptions die andauernden Abfragen error-flag-abfragen spart, dass RAII die Aufräumblöcke erspart, vor allem wenn es mehrere returns gibt.
Man darf als Programmierer natürlich nicht zu sehr am Projekt hängen. Ich habe mein erstes 2 weitere Male völlig von vorne angefangen und es letztendlich doch aufgegeben, weil ich eingesehen habe, dass es viel zu viel Arbeit ist, es mich nicht mehr interessiert und im Grunde eine blöde Idee ist, aber ich bereue das überhaupt nicht, denn ich habe dabei die ganze Sprache von Anfang an gelernt.
-
nwp3 schrieb:
Jetzt, wo ich deutlich mehr Plan habe könnte ich alles viel besser, aber nun ist der Code wie er ist und einen Monat (Zeit ist geraten) mit "Codeaufhübschung" zu verbringen kann ich nicht rechtfertigen.
Ich hab mal irgendwo gelesen, dass jeder erste Entwurf inklusive der ersten Umsetzung, die Probe ist. Danach sollte man eigentlich nochmal die ganze Software neu aufbauen, weil man nun weiß, was wie wo verlangt ist und wie das umgesetzt werden kann.
Nachteil: Das ist absolut nicht praktikabel. Z.B. 2 Jahre etwas entwickeln und danach dasselbe innerhalb von 6 Monaten neu zu schreiben ist aus betriebswirtschaftlicher und zeitlicher Sicht nicht machbar.
-
Skym0sh0 schrieb:
Nachteil: Das ist absolut nicht praktikabel. Z.B. 2 Jahre etwas entwickeln und danach dasselbe innerhalb von 6 Monaten neu zu schreiben ist aus betriebswirtschaftlicher und zeitlicher Sicht nicht machbar.
Wenn du das Projkt die nächsten 10 Jahre warten musst, dann schon.
-
Hat das wirklich mal jemand gemacht? Ein 2jähriges Projekt wegwerfen und komplett neumachen? Schafft man das wirklich in 6 Monaten? Und wird es wirklich besser?
-
Mechanics schrieb:
Eisflamme schrieb:
mit
typedefs undautokommt man doch ganz gut klar, finde ich. Und bei den ganzenunique_ptr-Einsätzen spart man sich doch auch dasdeletean Schreibarbeit.Allein das ist schon etwas praxisfern. Wie lange gibts C++11 schon? Noch nicht so lang. Im Gegensatz dazu gibts viele C++ Projekte schon seit Jahrzehnten. Wir benutzen in der Arbeit kein C++11 (und keinen C++11 fähigen Compiler) und es wird sicher noch Jahre dauern, bis wir umsteigen. Und irgendwie hab ich das Gefühl, als ob jetzt alle so tun würden, als ob C++ erst mit C++11 eine schöne Sprache geworden wäre, obwohl sie auch davor immer C++ Fans waren.
Ansonsten hab ich mich natürlich auch schon öfter gefragt, warum man in der Praxis so wenig schönen C++ Code findet. Ich könnte wahrscheinlich tausend Gründe finden, warum unser Code nicht besonders schön ist und warum ich ihn trotzdem ganz brauchbar finde, aber mich würd trotzdem mal interessieren, warum die meisten anderen keinen schönen Code schreiben ^^Da kann ich nur voll zustimmen. Bis Du zufällig ein Kollege von mir
? Auch wir haben kein C++11 und werden es lange nicht haben. Und auch ich denke, dass C++ vor C++11 auch eine großartige Sprache war. Sicher ist C++11 ein Fortschritt. Aber ich bin auch mit C++03 sehr zufrieden und finde es fast schon ein wenig befremdlich, mit welcher Selbstverständlichkeit hier im Foum C++11 angewendet wird. Die meisten Projekte haben lange vor C++11 angefangen.
-
Bashar schrieb:
Hat das wirklich mal jemand gemacht? Ein 2jähriges Projekt wegwerfen und komplett neumachen? Schafft man das wirklich in 6 Monaten? Und wird es wirklich besser?
Zwar nur an einem Projekt, das ich größtenteils alleine betreue, aber ja: Ein 5 Jahre altes Projekt nach Übernahme erst ein halbes Jahr verschlimmbessert, bis ich einsah, dass es unwartbar war. Dann alles weggeworfen und in ein paar Monaten alles sauber neu gemacht, mit mehr Features und einem Code, den ich selbst heute noch (ein paar Jahre später) nur kurz ansehen muss, um ihn zu verstehen.
War eine gute Entscheidung. Hätte ich gleich so machen sollen.
-
Hm, Respekt. Aber ich meinte eigentlich, was selbstentwickeltes wegzuwerfen und selbst neu zu machen.