Hi Spiele Programmierer.
Oha - viel Stoff. Danke für die Einschätzung. Also...
Spiele Programmierer hat geschrieben:Erstmal: Was du gebaut hast scheint mir völlig legitim.
Genau das interessiert mich auf einem technischen Level...
Spiele Programmierer hat geschrieben:Ich stimme aber Dot zu: Wozu das ganze?
Diese Frage stelle ich mir seit 20 Jahren, seit ich damals unter DOS in Pascal perspektivisch korrekte Software-Polygonrasterizer nachprogrammiert habe. Diese Frage trifft auf alle Betrachtungsebenen meines Hobby-Projektes zu. Ich beantworte sie seit einigen Jahren auch für mich selbst mit:
"
Weil ich es kann". (im Sinne von technisch möglich) Es entspannt mich einfach. Sinnlos, aber entspannend - Hobby eben.
Spiele Programmierer hat geschrieben:Standardisierter Zugriff ist eine feine Sache, allerdings wirst du mit dem Interface zB. keine Hashmaps ansprechen können...,
Falsch .. mache ich bereits seit Jahren und es funktioniert ja. Diese Code-Fragment sind ja nur exemplarischer Peusocode.
Spiele Programmierer hat geschrieben: ... weil du dich mit getCount dem int im operator[] auf Arrays beschränkst. (Besser wäre übrigens size_t, weil du dann zB. auf 64 Bit entsprechend skalierst und sonst Konvertierungswarnungen auftreten, wenn du es zB. mit Pointern, Iteratoren oder std:: Containern verbindest die alle size_t/ptrdiff_t verwenden)
Ich glaube, da komme ich erst im nächsten Leben zu.
Spiele Programmierer hat geschrieben:Standardisierten Zugriff kannst du allerdings auch ohne virtual calls haben. Jeder Container hat einfach die selben Zugriffsmethoden. So wie die std:: Container.
Ne, ich glaube, einer von uns beiden versteht den anderen gerade nicht (nicht zynisch gemeint).
Es geht darum, dass die Implementierungen, die auch der Collection arbeiten, nur das Interface (abstrakte Basisklasse unter TCollection, quasi ICollection) kennen und damit operieren. Es geht nicht darum, dass die Methoden "nur gleich heissen", dass ich sie besser verstehe.
Spiele Programmierer hat geschrieben:
Ich finde die Idee charmant, dass alle Collections, seien es Listen, Arrays, Pointer(sind in meinem Universum Arrays, die Ihren Speicher nicht selbst besitzen/verwalten)
Für diesen Zweck würde ich dir eine einfache "array_view" Klasse nahelegen. (Wird in
der neusten Reinkarnation auch manchmal span genannt.) Also eine Klasse die einfach zwei Pointer (begin und end) besitzt und die üblichen Container Methoden (operator[], size, empty, begin, end, etc.) sowie slice Methoden definiert. Meine Implementierung hat gerade mal 400 Zeilen, so kompliziert ist das nicht. Damit hast du ein Interface für alle Listen, egal woher sie stammen.
Ja, sowas habe ich auch, heisst eben seit Jahren Pointer (bissel irreführendes naming) bei mir (Verwaltet Beginn und Ende und macht Range Checks, ohne den Speicher zu Ownen und kann von echt vielen fachlichen Klassen als "Zugriffmedium" auf Speicher ausgespuckt werden). Das hat aber Nichts damit zu tun, dass dieser Pointer UND die Collections selbst eben ein gemeinsames Interface implementieren.
Spiele Programmierer hat geschrieben:std::vector, std::array, Fixed Size C Arrays, etc. kannst du implizit konvertierbar zu dieser Klasse machen. Ich kann dir sagen, dass diese Klasse mir unglaublich viel Zeit und Ärger gespart hat, dadurch dass ich nicht mehr einzeln einen Pointer und die Länge übergeben muss. Außerdem kann man in die Klasse im operator[] ein paar Debug Assert Range Checks reinpacken. Das tut Wunder.
Ich habe mir die eigenen Container mal gebaut, um zu lernen, was da eigentlich dahintersteckt und "wie man Templates benutzen kann". Seit Jahren basieren meine Higher-Level Entwicklungen fast nur noch auf dem eigenen Krams. Bitte NICHT nach dem Sinn fragen .. den gibt es nicht: Eben nur "weil ich es kann". Im Berufsleben bin ich nach 10 Jahren Entwicklung ins User Department im Konzernumfeld gewechselt und würde jedem Entwickler/IT-Projektleiter, der uns vorschlägt, das Rad neu zu erfinden [wie ich es auch gerne mache ;-)], sofort die Finger und Beine brechen (lassen). Dort ist das Leben
ergebnisorientierter. Aber Daheim gönne ich mir den Luxus des "selbst frickelns" zu meiner persönlichen Entspannung. Die Frage ist auch, warum bauen wir Spiele - wir könnten ja welche kaufen. Warum spielen wir? Wir könnten ja nen Film gucken. Aus meiner Sicht ist die Grenze zum "Warum" (im Hobbybereich) völlig willkürlich. ;-) Ich trenne da bewusst Beruf und Hobby.
Spiele Programmierer hat geschrieben:Nur Linked Lists kann man damit nicht darstellen: Allerdings die passen in dein "TBaseCollection" Interface eben so wenig und in der Regel lässt man eh besser die Finger von Linaked Lists.
Siehste ... ich kann das. Hashmaps auch (zumindest für die Values - Keys ignoriere ich in meinem Universum großzügig). Du siehst hier ja nur exemplarischen Code...
Spiele Programmierer hat geschrieben: Weil dir scheinbar sehr viel an der Meinung von Stroustrup liegt: In den C++ Core Guidelines empfiehlt er diese Klasse und ich habe irgendwo mal ein Video von ihm gesehen, in dem er sich darüber aufgeregt hat das diese einfache Klasse es noch nicht in die STL geschaft hat.
Was heisst "viel dran liegen". Ich unterstelle ihm, dass er sich als "Erfinder der Sprache" eben mit den vielen Details schon beschäftigt hat, über die "ich" erst Jahre später stolpere. Cool, danke! Da schau ich mir mal an. Thx!
Mir ist nur wichtig, zu wissen, wenn ich hier "technisch kompletten Bullshit" gebaut hätte...