![]() |
(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:
So, die Frage ist jetzt: wie macht mans denn nun richtig (bei der Merge-Funktion ergibt sich ja selbiges Problem)?
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; |
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).
|
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 |
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. |
Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
Zitat:
|
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 |
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.
|
Re: (String)List als Rückgabetyp vermeiden - wie denn nu?
Zitat:
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: |
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 16:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz