Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 11:49

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 27, 2006 08:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Gegenseitiges einbinden: Was ich ganz gerne benutze sind abstrakte Klassen. Also Klassen die eigentlich nur eine Schnittstelle definieren. Sagen wir mal Klasse 1 und Klasse 2 müssen aufeinander zugreifen sollen aber nicht in den Selben units sein. So definiert man von Klasse 1 eine abstrakte Basisklasse die alles zu Verfügung stellt damit Klasse 2 mit ihr arbeiten kann. Diese Klasse kommt in eine extra Unit. Und die Ableitung (Klasse 1) kann dann direkt die Unit der Klasse 2 einbinden. Die Klasse 2 arbeitet nur mit einer Basiaklasse und schon weiß jeder das was er wissen muss ohne, dass sich die Klassen zu nahe kommen. Wenn möglich sollte man aber alles so abstrakt halten, damit sich solche Klassen auch nicht gegenseitig benutzen müssen. Lässt sich aber leider nicht immer so ohne weiteres einrichten.

Falls das jetzt einfach nur am Thema vorbei war dann kann ich das auf den noch fehlenden Kaffee schieben. ;-)

Lesezugriffe: Wie Flash schon sagte. Man kann es ja so gestalten, dass man über Properties oder Methoden nur lesend darauf zugreifen kann. Manchmal bietet es sich auch eine Methode zu machen die sich selber an eine Schnittstellenklasse übergibt. Also so etwas wie BeginObject. BeginMesh. PutNormal, PutVertex etc. Was die Schnittstelle dann mit den Daten macht ist ja recht gleich. Das könnte entweder eine DL, ein VBO oder Iterativ werden. Oder wegen meiner auch ne Datei. Man würde ja nur seine Daten an eine Schnittstelle übergeben. Leider gibt es selten eine richtige Patentlösung für alles. Viele Möglichkeiten hängen sehr stark davon ab was man machen will, wie erweiterbar es sein soll und wie das bestehende bereits aussieht. Die Geschwindigkeit spielt in vielen Fällen auch eine nicht unbedeutende Rolle.

Vieles erlernt man auch in dem sich genau anschaut was bei vorherigen Projekten falsch gelaufen ist und wie man es verbessern könnte. Nichts ist von anhieb an perfekt. Außer man es es schon mehrfach versaut. ;-) Aber es ist ein großteil persönliche Erfahrungen und auch persönlicher Geschmack.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 27, 2006 09:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Flash hat geschrieben:
Wenn du nur lesenden Zugriff machen willst, dann musst du mit property arbeiten, und dort nur den lesenden Zugriff definieren.


Aber halt nicht bei Klassen, die in anderen sind.

Beispiel: mein TCollTriangle enthält Punkte. Die Punkte sind wiederum Klasseninstanzen von TPoint. Jetzt gebe ich per property read Lesezugiff. Durch diesen Zugriff kann zwar die Punkt-Referenzvariable nicht geändert werde, aber der Punkt an sich ist änderbar über seine Methoden und Eigenschaften. Kam das so rüber was ich meine?

Um das zu umgehen, könnte man immer Kopien zurück geben, aber das ist erstens kostenintensiv, dauernd Kopien anzufertigen und außerdem darf dann der Aufrufer nicht vergessen, free zu benutzen. Das läd also zu MemLeaks ein.

In meinem Fall hier habe ich mit jetzt aber für das read entschieden, weil das editieren der Punkte(verschieben, rotieren, usw.) sogar erwünscht sein kann.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 27, 2006 10:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bitte keine Kopien von Klassen zurückgeben. Speicherlöcher sind da vorprogrammiert. An der Stelle müsstest du deine Klasse TPoint so gestalten, dass du deren Werte nicht verändern kannst. Zum Beispiel in dem du sie beim Aufruf des Konstruktors verlangst und dann nur noch lesende Zugriffe gewährst. Wobei das Verändern ja mitunter auch nicht schlecht ist. Sehe ich gerade.

Wobei ich persönlich bemerken möchte, dass zu kleine Objekte wiederum auch nicht so praktisch sind. Das Erstellen und Freigeben von so winzigen Objekten kann sich mitunter ziemlich hinziehen. Speziell das Freigeben. Bei so etwas würde es sich evtl auch schon anbieten einen riesen Datenblock zu alloziieren und dann Records daraus zurückzuliefern. Also entweder Pointer darauf oder das Record kopiert. Wobei Pointer da um längen schneller wären, da nichts kopiert werden muss. Aber dann hätte man wieder Schreibzugriffe. Wenn records dann bitte so, dass diese nicht zurückgegeben werden sondern als Var an eine Methode übergeben werden und dann dort gefüllt wird. Ich denke mal, dass dürfte schneller sein, da Delphi nicht erst nen Record erzeugen muss um es dann wieder zu zerstören. So benutzt du eine lokale Variable die immer existiert.

In manchen Fällen macht es durchaus Sinn, sich dem Objektorientierten abzuschwören um mehr Geschwindigkeit zu erlangen. Es kommt dabei nur auf die richtige Mischung an.

PS: Solch einen Speicherbereich könnte man aber durchaus auch praktischerweise für VBOs oder VertexArrays gleich mit nutzen. Das vereinfacht solche Handlings wieder ein bisschen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]