Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

03.12.2015, 20:00

C++ | Schlechte Libs/Frameworks

Hi,
ich habe eine Frage, deren Beantwortung durchaus als "subjektiv" zu werten ist. Dennoch besteht mehr oder weniger ein allgemeiner Konses dahinter;
so scheint es zumindestens.
Meine Frage ist folgende:
Was macht eine Library bzw. ein Framework gut oder schlecht?
Woraus sollte man speziell als Entwickler eines Frameworks achten, damit es gut wird?
Wie viel Verantwortung soll ich dem Entwickler geben, z.B.: in der Speicherverwaltung.


Diese Frage steht natürlich vor dem Hintergrund meines jetzigen Projekts; eine
Game Engine. Ich habe mir schon des Öfteren die Frage gestellt, ob meine Entscheidungen
zum Design gut waren, um nur einen weiteren Weg, mit dem ich mir in den Fuß zu schiesen kann, zu entdecken.
Ich nehme an, dass in dieser Hinsicht bereits Informationen verfügbar sind,
die ich aber anscheinend nicht finden kann (vll. außer Scott Meyer's "Effective C++").
Gibt es Guidelines oder "Regeln", die sichern, dass ich guten Code und gute Klassen schreibe?

LG Julien
P.S.: Ich muss zugeben, dass die einzigen schlechten Frameworks, die ich gefunden habe, unter Python waren :P
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

2

03.12.2015, 20:33

Nur ganz kurz:
Wer eine Library benutzt muss sich auch damit beschäftigen, wie sie funktioniert. Aber letztendlich kann man dem User schon einiges erleichtern, wenn man die Speicherverwaltung nicht aus den Händen gibt. D.h. lass den User die Library Objekte selbst erzeugen, wenn er sie braucht, aber gib keine Internen Objekte nach außen, schon gar nicht als Raw Pointer.
Das mag zwar zuerst ein wenig seltsam klingen, aber letztendlich werfen Raw Ptr immer Fragen auf. Besten falls stellt er sich die Frage nicht, wer jetzt nun für das Aufräumen verantwortlich ist, schlimmsten falls denkt er, er müsste es selbst machen...
Wenn es denn unbedingt sein muss, das Objekte heraus gegeben werden, dann als Referenz. Sollte es zu irgend einem Zeitpunkt tatsächlich vorkommen können, dass du eigentlich gerne einen nullptr zurück geben würdest, schmeiß ne Exception.
Wenn du allerdings Objekte erstellst, die man außen benutzen soll, dann eben direkt auf dem Stack oder per smart ptr.

PS: Ich rede hier tatsächlich von eigenständigen Modulen, und nicht irgendwelche Pattern oder Templates die einen ganz anderen Sinn haben.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

3

03.12.2015, 21:05

Das Problem mit den "Pointern" hatte dich tatsächlich Anfangs mit Qt. Da bekam ich ganz plötzlich "Access Violations" beim "delete" :D

Wie steht's eigentlich mit Exception Typen?
Ich nutze bisher nur "std::runtime_error" in Konstruktoren, wenn zum Beispiel die WinAPI ein Fenster nicht erstellen kann
oder wenn ich in DirectX keine Buffer erstellen kann.
Ist es ratsam eigene Klassen dafür zu erstellen?

Danke für deine Antwort,
LG Julien ;)
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

4

03.12.2015, 21:26

Wer eine Library benutzt muss sich auch damit beschäftigen, wie sie funktioniert.

Deshalb gehört für mich zu einer guten Library/Framework eine gute Dokumentation. Ich hasse es, sich über 1000 Beispiele auf 1000 Verschiedenen Webseiten in die Library/Framework einzuarbeiten, weil die Doku gerade mal aus doxygen generierten Doku besteht.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

04.12.2015, 08:58

Ne ordentliche Doku ist wichtig. Offene Quellen sind auch wichtig, eine reine Prebuilt-Distribution würde bei der Konkurrenz heutzutage nicht mehr akzeptiert werden. Damit zusammenhängend ist aber auch ein Thema, das mir besonders am Herzen liegt: ordentliche Baubarkeit. Ich muss da mal mein altes Lieblingsprojekt als Gegenbeispiel heranziehen: Assimp. War mal ein "Nimm die zwei Verzeichnnisse und baue"-Projekt. Inzwischen gibt's irgendwelche Versionsstrings, die aus nem Skript erzeugt werden, eine bunte Mischung aus ordentlichen ".../relativ"-Includes und globales <bla>-Includes und Dependencies, die auch global angesaugt werden. Mit dem Ergebnis, dass man außer über das CMake vorneweg keine Chance mehr hat, einen gesunden Buildprozess aufzusetzen. Ich kenne mich zum Glück noch genug aus, um es trotzdem autark baubar zusammen mit den anderen Libs aus dem Subversion purzeln zu lassen.

Ist aber zugegebenermaßen ein Luxusproblem. "Wenig/keine Dependencies" ist auch so ein Luxusproblem. Das kriegt man aber eh alles vollautomatisch, wenn man sich an die Grundregel einer Lib hält: löse nur ein Problem, aber das löst Du ordentlich. Die Lib muss sauber funktionieren und einen guten Job machen. Und zwar nur genau diesen einen Job. Ein buntes Sammelsurium an zusätzlichen Herumalbereien interessiert nur den Libautoren, alle anderen fluchen eher.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.12.2015, 09:18

Stimmt, Assimp wollte ich mir mal ansehen. Ich hab die Lib aber verworfen als ich sie nicht mal gebaut bekommen hatte.

Für mich als VS User ist es ideal wenn es eine Solution gibt die ich bauen muss und die Binaries in einem Ordner rauspurzeln.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

7

04.12.2015, 09:32

Ich arbeite aktuell mit einem Framework, welches nahezu ein Paradebeispiel für ein schlechtes Framework ist.
Hintergrund ist der, dass die Entscheider, welche dieses Framework eingekauft haben leider die Entwickler bei eben dieser Entscheidung nicht mit einbezogen haben und somit einige wichtige Punkte einfach nicht beachtet haben.

Also, schlechtes Framework:
- Aufgaben, welche ohne dieses Framework recht einfach zu lösen wären werden durch das FW unnötig verkompliziert
- Fehlende oder schlechte Doku (wurde aber bereits gesagt)
- Hartcodierte Werte, die den Entwickler ewig nach Fehlern in seinem Sourcecode suchen lassen, obwohl sich später herausstellt, dass der Fehler im FW liegt...
- Schlechter oder Fehlender Support (bei Closed Source Frameworks)

und sicher noch einige mehr...

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

04.12.2015, 14:34

Ja, solche Entscheider sind immer die tollsten. Zu 99% halten die sich zumindestens für die tollsten.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Werbeanzeige