Bitte um Kritik zu einer meiner C++ Library
-
und noch etwas,
da http://www.willemer.de/informatik/cpp/timelib.htm
Die Zeitfunktionen gehören nicht zu den C++-Bibliotheken, sondern sind ein Erbstück von C.
Meine Frage ist, wenn ich mit
tm *nun;
einen Pointer erstelle, bleibt da nicht ein Speicherleck? Denn die gezeigten Beispiele beinhalten keinfree
oderdelete
MFG
-
@_ro_ro sagte in Bitte um Kritik zu einer meiner C++ Library:
ich kann Sie doch genausogut fragen warum Sie hier im Forum sind.
Was tut das zur Sache? Aber na gut: Weil ich von Leuten, die von Softwareentwicklung/C++ mehr Ahnungen haben als ich, Hilfe wollte. Und mit deren Hilfe habe ich viel dazugelernt.
Und was bitte soll daran schlecht sein wenn ich stolz auf das Erreichte bin?
Weil es dich blind macht gegenüber Verbesserungen. Du bist so stolz, dass du Kritik nicht akzeptieren kannst, weil es deine Leistung herabwürdigt und wir das Ergebnis nicht so honorieren, wie du es erwartest.
Ansonsten sind hier ja immer noch ein paar Fragen offen. Denn ich will ja auf jedem Fall was lernen, was mir besser gelingen würde wenn die Antworten verständlicher wären.
Da ist Eigeninitiative gefragt. Ich habe dir Stichpunkte genannt, nach denen man mit <Suchmaschine deiner Wahl> suchen könnte.
-
@_ro_ro sagte in Bitte um Kritik zu einer meiner C++ Library:
meine Frage war, was ein Entwickler erwartet wenn er versucht, Eigenschaften von Objekten willkürlich zu ändern. Daß es möglich ist war nicht die Frage.
MFG
Hallo,
wenn du einen 2-Zeiler hast und ein Entwickler in den 2 Zeilen bewusst Blödsinn macht, dann kannst du natürlich die rhetorische Frage stellen, was der Entwickler dann erwartet.
Ich habe versucht an einem Beispiel zu zeigen, warum das aber im Verlauf der Softwareentwicklung vom 2-Zeiler zu einem nicht mehr so offensichtlichen Fehler werden kann und es deshalb wichtig ist, dass man sich auf die libs die man verwendet verlassen können muss.
Und ansonsten schließe ich mich @DocShoe an: Worüber reden wir hier? Ob diese lib die du im stillen Kämmerlein nutzt für dich gut ist oder ob man generell eine Lib so aufbauen würde? Ersteres weißt du selber besser als wir, letzteres wurde zurecht kritisiert (was du doch auch haben wolltest!?).
-
@DocShoe sagte in Bitte um Kritik zu einer meiner C++ Library:
Weil es dich blind macht gegenüber Verbesserungen. Du bist so stolz, dass du Kritik nicht akzeptieren kannst,
Unsinn. Die Kritik habe ich längst umgesetzt. Das zeigt die Anwendungsklasse die ich hier auch gepostet habe: Sämtliche Instanz-Eigenschaften sind private und nur über Gettermethoden zugänglich.
MFG
-
@_ro_ro Puh, ist einiges dazu gekommen hier.
Was ich von einer Klasse erwarte: Ein ordentlich dokumentiertes, möglicht kleines, public Interface, verifiziert durch Unittests. Die Klasse stellt sicher, das sie sich immer in einem wohldefinierten Zustand befindet. (z.B. durch die Überprüfung von User Eingaben (Entwickler = User)) und es treten durch die Verwendung der Klasse keine Seiteneffekte auf. Eine falsche Verwendung der Klasse führt zu Fehlern, entweder als Exception oder Fehlermeldung zur Laufzeit, noch etwas besser, wenn möglich, als Fehler zur Compilezeit.
Warum das ganze, also Trennung von Interface und Implementierung, public / private, const non-const etc:
- Es dokumentiert direkt im Code die vom Entwickler erwartete Nutzung
- Im Fehlerfall sind die Schnittstellen zu anderen Programmteilen an wenigen definierten Orten, an denen man überprüfen kann, auf welcher Seite der Fehler passiert (vor oder in der Library).
- Gerade für den Fehlerfall ist auch const-correctness wichtig; man kann direkt sehen, wo sich überhaupt Dinge ändern können.
- Im Falle von Änderungen an den Interna der Library funktioniert Code, der die Library verwendet einfach weiter.
- Wenn jemand anderes den Code erweitert (oder man selbst nach einiger Zeit) ist direkt klar, was wie gemeint ist und Änderungen führen nicht zu unerwünschten Seiteneffekten an anderen Stellen.
Unittests sind im ürbigen auch eine gute Möglichkeit als Entwickler zu dokumentieren, wie man sich die Nutzung einer Bibliothek vorstellt.
In der Entwicklung mit modernem C++ als multiparadigmen Sprache führen viele Wege nach Rom. Aber es gibt ein paar Dinge, die sich als Best Practise durchgesetzt haben. Neben dem Punkt, dass es für die Dinge in der Regel gute Gründe gibt, führt die Einhaltung von Best Practice dazu, das andere Entwickler den Code besser und schneller verstehen.
Eine erste Anlaufstelle um sich mit Best Practise im Bereich C++ auseinanderzusetzen sind sicherlich die C++ Core Guidelines
Zum Thema Exception vs "throw string" ist ja schon einiges gesagt worden. Ich würde noch zusätzlich ergänzen wollen, nutze
std::exception
weil das erwartet wird. Wenn andere deine Library verwenden und die Excpetions werfen kann, werden die Anwender irgendwo Excpetions gefangen, z.b. mitcatch(std::exception& ex)
und dann weiterverarbeiten. Niemand versuchtcatch(std::string& err)
und das Programm fliegt einem im Fehlerfall um die Ohren, bzw, wenn es gut läuft, gibt es noch eincatch(...)
wo dann aber nicht mehr klar ist, von wo die Exception kommt.P.S. Von
std::exception
kann man ableiten, wenn man eine eigene Exception haben möchte.
-
auf Ihre ausführliche Darstellung antworte ich gerne. Natürlich bin ich mit den Grundsätzen vertraut die Sie hier erneut auflisten. Was den Umgang mit Exceptions betrifft: Als Entwickler von Webanwendungen nutze ich Exceptions in erster Linie dazu, dem Anwender eine aussagekräftige und verständliche Meldung zu hinterlassen wenn er beispielsweise ein ungültiges Datum eingibt. Dabei geht es mir um ein bischen mehr als einfach nur eine Exception aufzufangen und eine Ausgabe in Plaintext. Das heißt, daß alle bisherigen Benutzereingaben im Webformular verbleiben, nur daß das Formular um die Fehlermeldung ergänzt wird, idealerweise über einen Platzhalter nahe der Stelle wo's passiert ist (Edit: Auf der Beispielseite bereits umgesetzt).
Im Sinne von Laufzeitfehlern, höhere Gewalt oder sonstigen Unverhersehbarem spielen Exceptions natürlich auch eine Rolle, in solchen Fällen würde eine Fehlerseite in Plaintext völlig reichen, denn wenn beispielsweise der MySQL-Server nicht erreichbar ist, macht jede weitere Eingabe keinen Sinn.
Und dann gäbe es natürlich auch eine dritte Art von Exceptions die zu werfen sind wenn ein Anwender versucht vorsätzlich Schäden anzurichten (dieses Thema hatte ich hier auch schon angesprochen).
Danke nochmal und viele Grüße!
-
@_ro_ro Ich glaube, jetzt hast du den Dreh raus.
-
@DocShoe sagte in Bitte um Kritik zu einer meiner C++ Library:
- warum ist das Ganze überhaupt eine Klasse? Das kann man auch als freie Funktion implementieren, die eine Struktur mit Datumsinformationen zurückgibt.
Um auf diese Frage einmal etwas ausführlicher einzugehen: Ein Tag ist mehr als nur ein Datum. Das Datum ist nur eine Eigenschaft, weitere Eigenschaften wären:
- Numerischer Tag (lange Zählung),
- Der Name des Wochentages,
- Der Name des Monats,
- Kalenderwoche,
- Der Name des Kalenders (Julianisch, Gregorianisch ...),
- Schaltjahr,
- usw.
Und insofern ist das schonmal mehr als nur eine Datenstruktur, also ein Objekt, eine Instanz einer Klasse. Wobei die Klasse Methoden definiert welche die Instanz ausführen kann um z.B. Tage zu addieren, inkrementieren, Differenzen berechnen und natürlich Datumsumrechnungen in einen anderen Kalender (Maya, Julianisch, Gregorianisch).
Sie sehen also, es gibt mehr als nur einen Gund, Tage zu Instanzen einer Klasse zu machen. Mit einer herkömmlichen Herangehensweise wird das nämlich sehr schnell unübersichtlich. Ebenso vereinfacht sich mit OOP die Art und Weise der Fehlerbehandlung von Benutzereingaben. Bspw. wird die Instanz gar nicht erst erstellt wenn ein ungültiges Datum eingegeben wurde.
Und was das Systemdatum anbetrift: Dieses uralte C-tm-Vehikel brauchen wir gar nicht. Es genügt der Aufruf der Funktion
std::time(nullptr)
das gibt dann die Anzahl der Tage, fertig.Welche Exceptionklasse schlagen Sie denn vor für den Fall fehlerhafter Benutzereingaben?
MFG
-
ein tag ist weder ein schaltjahr, noch interessiert es ihn welcher kalender grade genutzt wird.
alles was du aufgezaehlt hast, laesst sich anhand des datums berechnen, sofern bekannt welcher kalender es denn nun ist.dein grundsaetzlicher datensatz ist also ein datum...
-
@_ro_ro Ich halte das so: Exceptions nur für wirkliche Ausnahmen. Eine fehlerhafte Nutzereingabe, wenn der Nutzer, der Nutzer der GUI (in deinem Fall der Internetseite) ist, würde ich überhaupt nicht über Exceptions lösen, sondern als einen von vielen normalen Fällen behandeln, Fehler ausgeben und weiter machen.
Wenn es darum geht, das ein Entwickler die Library falsch nutzt, schon eher. Bei Exceptions muss man auch ein bisschen aufpassen, damit alles in einem wohldefiniertem Zustand bleibt. Stichwort: Exception Safety.
-
@Schlangenmensch sagte in Bitte um Kritik zu einer meiner C++ Library:
@_ro_ro Ich halte das so: Exceptions nur für wirkliche Ausnahmen. Eine fehlerhafte Nutzereingabe, wenn der Nutzer, der Nutzer der GUI (in deinem Fall der Internetseite) ist, würde ich überhaupt nicht über Exceptions lösen, sondern als einen von vielen normalen Fällen behandeln, Fehler ausgeben und weiter machen.
Wenn ein ungültiges Datum eingegeben wurde, macht jede weitere Berechnung keinen Sinn. Das spricht schon für eine Exception zumal es die Fehlerbehandlung sehr vereinfacht. Wichtig ist nur, dem Benutzer seinen Fehler klar zu machen und ihm eine Chance zu geben ihn zu korrigieren
Viele Grüße.
-
@Cardiac sagte in Bitte um Kritik zu einer meiner C++ Library:
ein tag ist weder ein schaltjahr, noch interessiert es ihn welcher kalender grade genutzt wird.
Es gibt Autoren die behaupten ohne rot zu werden daß der Maya-Kalender am 11. August 3114 B.C. begonnen hat. Das ist ungefähr so, als würden die behaupten daß die Milchstraße ein Molkereiprodukt ist
MFG
-
Das ist das, was
Wikipedia sagtdie ersten 10 Treffer der google-Suche sagen. Auf einer Seite wurde erwähnt, dass sich Experten streiten, ob es der 11. oder 13. August ist, die Mehrheit scheint sich aber auf den 11. August geeinigt zu haben. Warum stimmt das nicht?Edit:
Hier ein online-Converter, bei dem sich die Korrelation einstellen lässt.
-
@DocShoe sagte in Bitte um Kritik zu einer meiner C++ Library:
Das ist das, was wikipedia sagt. Warum stimmt das nicht?
Weil zu einer Datierung stets die Angabe dazugehört welcher Kalender und welche Korrelation (zwischen verschiedenen Kalendern) verwendet wurde. Im Fall 11. August 3114 B.C. ist es so, daß sich dieses Datum mit der Goodmann-Martinez-Thompson-Korrelation und dem Gregorianischen Kalender ergibt. Wobei es den Gregorianischen Kalender gar erst seit Oktober 1582 A.D. gibt
Viele Grüße.
Quelle: J. Eric S. Thompson, Maya Hieroglyphic Writing, Oklahoma Press 1960
-
Anstatt eine eigene Kalender-Klasse zu erfinden, wäre mein allgemeiner Ratschlag, dass du, @_ro_ro, dir mal die C++-Funktionen aus
<chrono>
anschaust. Abgesehen von den üblichen Referenzseiten ist hier Howard Hinnant eine gute Quelle. Hinnant hat z.B. den Julianischen Kalender und den Islamischen Kalender implementiert. Siehe https://github.com/HowardHinnant/date
-
Mag sein. Unterdessen habe ich sehr gute Fachbücher betr. Kalenderberechnungen da stehen auch die Algorithmen drin, die ich in Perl, PHP, C, JavaScript und jetzt auch in C++ umgesetzt habe. Man muß sich einfach nur mal richtig damit befassen. Und ja, Kalenderberechnung, das schreit ganz laut nach OOP aber sowas von
Viele Grüße.
PS: in USA ist es üblich den Julianischen Kalender als Old Style und den Gregorianischen Kalender als New Style zu bezeichnen. Und vorchristliche Datierungen in New Style, WTF
-
-
@Helmut-Jakoby sagte in Bitte um Kritik zu einer meiner C++ Library:
Ja. Das wird ein Thema wenn Sie mit der Digitalkamera nach Mexico reisen. Und dann zuhause feststellen, daß alle Fotos offensichtlich mitten in der Nacht gemacht wurden
MFG
-
@DocShoe sagte in Bitte um Kritik zu einer meiner C++ Library:
Die kurze und höfliche Anwort: verbesserungswürdig.
Das ist geschmeichelt
Also der C-Style der da noch drinstekt ist grauenhaft. Da habe ich heute mal aufgeräumt. Allerdings habe ich noch nicht geprüft, inwieweit ich die(int)
Cast Notation c++konform ersetzen kann. Und als einen weiteren Vorteil von OOP betrachte ich den Fakt daß man in jeder Private Methode Vollzugriff auf die Eigenschaften der Instanz hat, also auf Return-Values und unendliche Argumentelisten weitgehend verzichten kann.MFG
-
@_ro_ro sagte in Bitte um Kritik zu einer meiner C++ Library:
@Helmut-Jakoby sagte in Bitte um Kritik zu einer meiner C++ Library:
Ja. Das wird ein Thema wenn Sie mit der Digitalkamera nach Mexico reisen. Und dann zuhause feststellen, daß alle Fotos offensichtlich mitten in der Nacht gemacht wurden
MFG
Sag mal, schaust du dir Videos überhaupt an, die dir freundlicherweise gegeben werden? Da geht es um Reinventing the wheel - und nicht um Digitalkameras, die nicht mal mit einem Netzwerk verbunden sind.
MfG