Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   (String)List als Rückgabetyp vermeiden - wie denn nu? (https://www.delphipraxis.net/136629-string-list-als-rueckgabetyp-vermeiden-wie-denn-nu.html)

Meflin 4. Jul 2009 12:57


(String)List als Rückgabetyp vermeiden - wie denn nu?
 
Moin!

Im Zuge meiner Prüfungsvorbereitung implementier ich grad allerlei Soriteralgorithmen... Und bin jetze bei Mergesort mal wieder auf das Problem gestoßen, dass ich eigentlich eine Liste als Rückgabetyp brauche - das gehört ja aber zu den Dingen, die man hier neben gotos u.Ä. als böse eingetrichtert bekommt :stupid:

Der Code ist in etwa so:
Delphi-Quellcode:
class method MergeSort.MergeSort<T>(aList: List<T>; aComparison: TComparison<T>): List<T>;
var
    Left, Right: List<T>;
begin
    if aList.Count >= 1 then begin
       Left := aList.GetRange(0, aList.Count / 2);
       Right := aList.GetRange(aList.Count / 2, aList.Count / 2);
       Result := Merge<T>(MergeSort<T>(Left, aComparison), MergeSort<T>(Right, aComparison), aComparison);
    end;
end;
So, die Frage ist jetzt: wie macht mans denn nun richtig (bei der Merge-Funktion ergibt sich ja selbiges Problem)?

Apollonius 4. Jul 2009 13:00

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Wenn du sowieso einen Garbage Collector hast, gibt es keinen Grund, keine Objekte zurückzugeben (sofern sie nicht IDisposable implementieren - dann ergibt sich das selbe Problem wie in Delphi Win32).

Neutral General 4. Jul 2009 13:05

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Hi,

Du könntest die zu sortierende Liste als var-Parameter übergeben und das ganze als procedure deklarieren.. Das wäre jetzt noch ne Möglichkeit die mir einfällt...

Gruß
Neutral General

himitsu 4. Jul 2009 13:12

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Das mit dem Parameter wollte ich auch grad vorschlagen, allerdings nicht als VAR ... die Liste würde dann extern erstellt und auch da wieder freigegeben und intern nur noch befüllt.

Ansonsten gingen noch Interfaces, aber da es dort wohl einen GC gibt, käme dieses etwa auf's Gleiche raus.

Meflin 4. Jul 2009 13:22

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Zitat:

Zitat von himitsu
Ansonsten gingen noch Interfaces, aber da es dort wohl einen GC gibt, käme dieses etwa auf's Gleiche raus.

Speziell diese Lösung würde mich mal interessieren - ich komm nicht so recht dahinter, wie das funktionieren soll :gruebel:

mschaefer 4. Jul 2009 13:39

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Also am elegantesten ist dies wohl wie Neutral General das schon angedeutet hat:

- Liste extern Create
- Liste per procedure übergeben (var geht hier nicht, da hier ehedem nur der Zeiger übergeben wird)
- Liste sortieren
- Liste extern Destroy

Oder man greift zur Pattexmethode
und übergibt die Daten als String und führt sie mit Stringlist.Text in die Liste und wieder heraus.


Grüße in die Runde // Martin

Dax 4. Jul 2009 14:16

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Nicht vergessen, hier geht es um Prism ;) List<T> als Rückgabetyp darfst du gerne machen. Und selbst wenn T IDisposable implementiert, läufst du in der Regel nicht mit offenen Armen in ein Speicherleck (weil solche Klassen auch ihre Finalizer überschreiben und dort Dispose aufrufen), aber man sollte sich dann nicht darauf verlassen, dass der GC alles zeitig abräumt.

Meflin 4. Jul 2009 15:03

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Zitat:

Zitat von Dax
Nicht vergessen, hier geht es um Prism ;) List<T> als Rückgabetyp darfst du gerne machen.

Jo find ich schonmal gut :mrgreen:

Allerdings würden mich schon auch Lösungen für W32 interessieren - und da bin ich eben schon öfter über die angedeutet Interface-Lösung gestoßenolpert. Nur noch nie über eine implementation :gruebel:

Apollonius 4. Jul 2009 15:11

Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
 
Normalerweise sollte man aufgrund der unklaren Besitzverhältnisse keine Objekte zurückgeben - dem Aufrufer ist sonst nicht direkt klar, ob er das Objekt selbst freigeben muss. Wenn du aber ein Interface zurückgibst, erfolgt durch die Referenzzählung die Freigabe automatisch. Du kannst also beispielsweise ein Interface mit den wichtigsten Methoden von TStrings definieren und das dann zurückgeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz