libhtmlpp rc1
-
Moin,
habe eine Bibliothek kurz vor der Fertigstellung.
https://tuxist.de/git/jan.koester/libhtmlppFür Anregungen oder Verbesserungsvorschläge bin ich gern zu haben.
Lizenz: BSD
Mit der Bibliothek kann man HTML parsen und Manipulieren setzte hauptsächlich in Kombination mit libhttppp ein aber CGI ist auch möglich.
-
Folgende Punkte fallen mit auf:
- Du nutzt verdächtig oft
friend. Ein Anzeichen dass dein Design nicht stimmt. - Du nutzt
goto? Ernsthaft? Das mündet schnell in Spagetti-Code und mach Abläufe schwer nachvollziehbar. Raus damit! Ist vollkommen unnötig und fehleranfällig. - In
utils.hnutzt du auch noch manuelle Speicherverwaltung. Raus damit! Ist vollkommen unnötig und fehleranfällig. - Die Klasse
Elementist meines Erachtens ein Verstoß gegen Single Responsible Prinziple, da dies eine intrinsche Liste zu sein scheint. Warum nutzt du kein entsprechende STL Container mitstd::variant? - CppCheck motzt dementsprechend oft mit
Potenial invalid cast. Du castest relativ oft von der Basisklasse auf die obere Klasse. Wie kannst du sicher sein dass das funktioniert? - Kannst du mir mal folgenden Code erklären?
void libhtmlpp::Element::insertBefore(libhtmlpp::Element* el){ std::unique_ptr<Element> nel; switch(el->getType()){ case HtmlEl:{ nel=std::make_unique<HtmlElement>(); break; } case TextEl:{ nel=std::make_unique<TextElement>(); break; } case CommentEl:{ nel=std::make_unique<CommentElement>(); break; } case ScriptEL:{ nel=std::make_unique<ScriptElement>(); break; } } _copy(nel.get(),el); std::unique_ptr<Element> prev=std::move(_prevElement->_nextElement); _prevElement->_nextElement=std::move(nel); nel->_nextElement=std::move(prev); }Übrigens motzt hier CppCheck rum, da du
nelerst movst und danach drauf zugreifst.- Versuche mal deutlich weniger Zeiger zu nutzen. Du brauchst diese nur in seltenen Fällen.
- Du nutzt verdächtig oft
-
Funktionieren tut es anscheinend meine Blog Software nutzt die Bibliothek ^^ .
Mit utils.h haste recht habe vergessen die beiden alten Funktionen zu löschen._copy(nel.get(),el); //Kopieren das Baumes std::unique_ptr<Element> prev=std::move(_prevElement->_nextElement); //ensprechen besitztümer des pointers ändern _prevElement->_nextElement=std::move(nel); //nochmal für das nachfolgende element nel->_nextElement=std::move(prev); // ach merke doppelt gemoppelt ändere ich
-
Hab's nur kurz überflogen...
- führende Underscores sollten vermieden werden, in den meisten Fällen sind sie Library Implementors vorbehalten.
- deine Funktionen sind teilweise recht lang und machen mehrere Dinge. Du könntest dir überlegen, wie du Funktionen mit mehr als 80 Zeilen in mehrere Funktionen aufteilen könntest.
- leere Konstruktoren und Destruktoren mit default kennzeichnen oder ganz weglassen
- statische
char[]Konstanten durchstd::string_viewersetzen - Elemente bereits im Header initialisieren