Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 06.07.07 14:44 
Hi,

ich wechsle im moment ständig zwischen C++ und Delphi hin und her beim programmieren... jenachdem welches sich besser anbietet etc.

Eine sache die mich mittlerweile richtig nervt an Delphi ist, dass (zumindest bei Delphi6) diese ganze sache mit Records und Klassen sehr unpraktikabel ist..

Beispiel:
Ich programmiere viel mit 3D, habe also eine klasse "TVertex" welche aus 3 Float werten X, Y und Z besteht. Ich verwende TVertex extrem häufig in vielen funktionen etc. Ausserdem gibt es viele funktionen wie Multiply oder PunktProdukt etc die ich mit TVertex verwende.. also z.B. TVertex * TVertex, oder eine funktion um die entfernung zweier Vertices zu bestimmen.

Jetzt gibt es grundlegend 2 möglichkeiten:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TVertex = Record
    x, y, z: Single;
  end;

function getDistance(A, B: TVertex): Single;
function multiplyVertex(A, B: TVertex): TVertex;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TVertex = class
  public
    x, y, z: Single;
    function getDistance(V: TVertex): Single;
    function multiplyVertex(V: TVertex): TVertex;   
  end;


An und für sich finde ich die Klassen-Variante besser, da ich so einfach via myVertex.getDistance() die distanz zu einem anderne vertex bekomme und es einfach im sourcecode viel viel übersichtlicher ist.
Der riesen nachteil ist halt, das ich JEDES vertex ständig Create'en und Free'en muß... und das geht u.U. nicht immer, bzw nur sehr sehr umständlich (z.B. ein TVertex als result..)

Der vorteil von C++ ist halt, das man klassen nicht erstellen/freigeben muß, sondern einem das von c++ abgenommen wird (und natürlich das Records in C++ auch funktionen haben können).

Jetzt gibt es natürlich noch das "Object" in Delphi..
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TVertex = object
    x, y, z: Single;
    function getDistance(V: TVertex): Single;
    function multiplyVertex(V: TVertex): TVertex;   
  end;


Damit funktioniert es genau so, wie ich es gern hätte (davon abgesehen das man von objekten nichts ableiten kann etc).. allerdings habe ich schon sehr oft gehört das man die nichtmehr verwenden soll etc...

Deshalb jetzt mal ne generelle frage... wie geht man an sowas am besten ran?
Die lösung mit dem Record ist die, die ich am wenigsten mag und eigentlich auch um alles in der welt verhindern will.. (im moment nutze ich immer Object)

Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Fr 06.07.07 14:54 
Eine Lösung wäre vielleicht eine Manager-Klasse, welche sich um Erzeugung und Freigabe der Objekte kümmert.

_________________
Bravery calls my name in the sound of the wind in the night...
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 06.07.07 15:01 
user profile iconnoidic hat folgendes geschrieben:
Eine Lösung wäre vielleicht eine Manager-Klasse, welche sich um Erzeugung und Freigabe der Objekte kümmert.

Dann müßte ich aber mein TVertex auch immer darüber erstellen.. und, vorallem, wie soll die ManagerKlasse mitbekommen wann das TVertex nichtmehr verwendet wird? (z.B. weil es nur lokal deklariert wurde)

_________________
Aya
I aim for my endless dreams and I know they will come true!
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Fr 06.07.07 15:03 
Du könntest dir nen GarbageCollector bauen und mit ReferenceCounts arbeiten. Aber was spricht eigentlich gegen erzeugen und freigeben?

_________________
Bravery calls my name in the sound of the wind in the night...
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 06.07.07 15:09 
user profile iconnoidic hat folgendes geschrieben:
Du könntest dir nen GarbageCollector bauen und mit ReferenceCounts arbeiten. Aber was spricht eigentlich gegen erzeugen und freigeben?

Das man es extrem schnell mal vergessen kann... stell dir vor du müßtest jeden Integer und String erzeugen und freigeben. Denn ich benutze TVertex wahrscheinlich sogar öffter als Integer/Strings...

_________________
Aya
I aim for my endless dreams and I know they will come true!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 06.07.07 16:05 
Object ist der Vorgänger von TObject. Nur mit dem Unterschied, dass Objects eher in Richtung Records gehen. Aber Objects kann man auch Ableiten und sogar Methoden überschreiben. Die bekommen dann auch eine VMT. Allerdings ich persönlich mag Objects nichts und würde auch Niemandem empfehlen diese zu benutzen. Einfach weil sie nicht zeitgemäß und teilweise doch etwas ziemlich pfuschig sind.

Da du Delphi 6 hast und anscheind Records kategorisch ablehnen möchtest denke ich, dass du wohl oder übel Objects nehmen müsstest. Denn die die mich kennen werden wissen, dass ich ein absoluter Fan von Klassen bin. Allerdings bin ich auch der wirklich festen Überzeugung, dass zu viele Kleinstklassen eher nachteilig sind. Auch wenn die Klassen vielleicht noch überhaupt nichts macht. Ein Create ist ein Funktionsaufruf der intern InitInstance, GetMem, AfterConstruction etc etc aufruft. Wäred ein lokales Record(Object) lediglich durch eine Veränderung des StackPointers angelegt wird. Also wenn man sehr häufig kleine Klassen anlegen und zerstören muss, dann hat man ziemlich viel versteckte Arbeit. Und an wirklich zeitkritischen Stellen wird man sehen, dass sich so etwas schnell rächen kann. Ich weiß allerdings nicht wie das bei C++ funktioniert. Aber ich denke so wahnsinnig viel anders werden die das auch nicht machen können. Auch wenn du den Vorteil hast, dass du deine Klasse nicht extra erstellen und freigeben musst. Eine Klasse ist es trotzdem. ;)


PS: Mit Delphi 2006 ist es, wenn ich mich gerade nicht vertue, möglich Methoden in Records zu platzieren und Operatoren (Keine Ahnung ob nur für klassen) zu erstellen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 06.07.07 16:33 
Hi,

stimmt.. objekte kann man ja echt voneinander ableiten.. hatte irgendwie immer im hinterkopf das das nicht ginge :/
Allerdings, was nicht geht ist dashier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  TB = Object// <- das mag er nich
  TA = Object
    [...]
    meow: TB; // dementsprechend dashier auchnicht :p
  end;
  TB = Object
    [...]
    meow: TA;
  end;


oder gibt's da auch irgendnen trick für? Im moment mach ich es immer via Pointer in so einem fall..

Aya~

PS: Und, was sind denn so die schlimmsten "patzer" beim Object?? Irgendwas wo man drauf aufpassen sollte?

_________________
Aya
I aim for my endless dreams and I know they will come true!
Robinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Fr 06.07.07 16:38 
Mal ne Spontane idee dazu (kann totaler unsinn sein :D )


Leg dir ne Unit an, in der du die Klassen Deklarierst.
In der Unit legst du dir eine Globale Instanz von TObjectList an.
Im Create deiner TVector klasse:  GlobalObjects.Add(Self)

die Globale Tobjectlist kannst du dann per initializationund finalization Handhaben.


Damit sparst du dir zumindestens schonmall das Freigeben ;)


Nur son spontaner einfall, aber evtl hilfts dir ja :)

gruss, Rob

_________________
erare humanum est
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 06.07.07 18:05 
Objects: Na ja. Alleine schon der Versuch auf der Basis eines Records eine Objekt Orientierung zu bauen sollte dafür Grund genug sein. ;) Wenn du die Objects nicht lokal haben willst sondern richtig erstellen willst (so ala .Create) dann sieht das auch sehr abenteuerlich aus. Bzw kann es wohl auch schon passieren, dass solche Objekte mal Kaputt gehen. Aber wann und wie weiß ich nicht. Aber ich kenne den Ein oder Anderen der damit häufiger schon mal ärger hatte.

Aber wenn du es lokal benutzt dann ist es in etwa so wie ein Record mit Funktionen. Denke das ist nichts tragisches dabei.

Robinator: Und was soll das Bringen? Nichts für Ungut aber per finalization? Dann kann er sich die Liste auch ganz sparen, weil Bruchteile später wird eh alles von Windows freigegeben und die Liste/Verwaltung dafür kann er sich dann auch sparen. ;)

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Fr 06.07.07 18:36 
man könnte in jedes Objekt noch einen TimeStamp der letzten Benutzung des Objektes einfügen, und wenn das Objekt ein bestimmtes Alter hat wird es gelöscht...

Ist nicht optimal, aber du würdest dir das free sparen.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 08.07.07 18:00 
Wozu eigentlich Klassen bei Vektoren etc? Ich bin bis jetzt immer mit Records ausgekommen. Stell dir vor, jeder String hätte eine Funktion GetPart(Start, Count: Integer); Es geht doch auch mit Copy(S: String; Start, Count: Integer);
Ich programmiere kaum mit C++, ich weiß aber, dass jedes Objekt so etwas wie Unterobjekte hat (z.B. Text.Int oder so in der Art, als Umwandlung praktisch). Aber ich denke, das haben bis jetzt sehr viele in Delphi hingekriegt mit IntToStr.