AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList.Capacity Zuweisung?

Ein Thema von PeterPanino · begonnen am 28. Dez 2012 · letzter Beitrag vom 29. Dez 2012
Antwort Antwort
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#1

AW: TStringList.Capacity Zuweisung?

  Alt 28. Dez 2012, 11:54
Die Alternative wäre gewesen, die Methode abstract zu deklarieren, aber dann muss jede abgeleitete Klasse sie implementieren. So kann jede Ableitung selbst entscheiden, ob sie das tut oder eben nicht.
Ich bin ja immer dafür, in einer Klasse (auch in einer Basisklasse) nur das zu deklarieren, was auch Sinn macht.
Wenn in der Basisklasse eine Methode keinen Sinn macht, sondern nur in einer speziellen geerbten Klasse, dann würde ich es in der Basisklasse einfach gar nicht deklarieren.

Das wäre so, als wenn ich in einer Klasse TKraftfahrzeug die Methode "Schwimmen" anbiete, obwohl das nur in der Klasse TAmphibienfahrzeug Sinn macht. Alle Kraftfahrzeuge haben jetzt die Methode Schwimmen, doch bei den meisten funktioniert diese eben nicht... Irgendwer kommt dann auf die Idee, mit einem TMotorrad in einen See zu fahren, weil es ja die Methode Schwimmen besitzt. (übertriebenes Beispiel )

Man könnte sogar so weit gehen, und noch eine zweite Klasse dazwischen hängen, falls es SetCapacity in mehreren Nachfahren geben soll...
TStrings > TGrowStrings > TStringList, TOtherStrings,...

Ob es da irgendeine Eigenheit bei ObjectPascal gibt, damit das keinen Sinn machen könnte, weiß ich nicht, aber in strengen OOP-Sprachen würde ich das so machen...
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: TStringList.Capacity Zuweisung?

  Alt 28. Dez 2012, 12:01
@Morphie

Ich sehe das genau umgekehrt, ein paar zusätzliche virtuelle Methoden und vor allem mehr Methoden virtuell statt statisch implementiert würde einem oft viel "gefrickel" ersparen.
Das von Dir gewählte (etwas extreme) Beispiel würde ich auch nicht implementiert haben wollen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#3

AW: TStringList.Capacity Zuweisung?

  Alt 28. Dez 2012, 12:04
Dir ist aber schon aufgefallen, dass es sich um den Setter der Property Capacity handelt? Da kannst Du wenn überhaupt höchstens die ganze Property in der Basisklasse weglassen, zumindest fällt mir auf die Schnelle keine saubere Alternative ein. Irgendwer bei (wahrscheinlich noch) Borland wird sich dabei schon etwas gedacht haben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#4

AW: TStringList.Capacity Zuweisung?

  Alt 28. Dez 2012, 12:07
Dir ist aber schon aufgefallen, dass es sich um den Setter der Property Capacity handelt?
Jo, ist mir bewusst... wenn ich von SetCapacity schreibe, meine ich natürlich die gesamte Property, die in der Basisklasse aber sonst nirgends genutzt wird, daher für mich überflüssig...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.228 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TStringList.Capacity Zuweisung?

  Alt 28. Dez 2012, 12:09
Ich denke hier ist es nicht sinnvoll ein capacity-property schon in der Basisklasse einzuführen. Diese Property macht dort keinen Sinn da sowas zu sehr an die Speicherorganisation von TStringList (Dumme Pointerlist statt performanterer Tree oder Hashmap) angelehnt ist.

Willst du mit Variablen vom Typ TStrings arbeiten aber wenn es nötig ist die Capacity (vor-)belegen wäre ein setzen mit den RTTI-Funktionen möglich. Haben uns selbst SetIntProperty-Funktionen gebastelt um nur bei Klassen mit entsprechenden Properties diese zu setzen und bei fehlen einfach nix zu machen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TStringList.Capacity Zuweisung?

  Alt 29. Dez 2012, 16:49
Der Grund meiner Frage war folgender: Wenn man in einer StringList die Capacity z.B. auf den Wert 10 einstellt, sollten beim StringList.LoadFromFile maximal 10 Zeilen gelesen werden (auch wenn die Datei etwa 100 Zeilen hat). Wäre eine solche Vorgangsweise möglich? Oder müsste man dazu eher die Methode LoadFromFile überschreiben?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.228 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TStringList.Capacity Zuweisung?

  Alt 29. Dez 2012, 16:58
Der Grund meiner Frage war folgender: Wenn man in einer StringList die Capacity z.B. auf den Wert 10 einstellt, sollten beim StringList.LoadFromFile maximal 10 Zeilen gelesen werden (auch wenn die Datei etwa 100 Zeilen hat). Wäre eine solche Vorgangsweise möglich? Oder müsste man dazu eher die Methode LoadFromFile überschreiben?
Ich würde hier eine angepasste LoadFromFile-Methode schreiben.
Das Capacity-Property ist ein Property das nur die interne Speicherverwaltung steuert. Normalerweise wächst die Capacity entsprechend der schon vorhandenen größe immer um ein bestimmten Prozentsatz. Das führt bei großen Listen dazu das häuft die größe Zeitintensiv angepasst werden muss.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: TStringList.Capacity Zuweisung?

  Alt 29. Dez 2012, 17:24
Der Grund meiner Frage war folgender: Wenn man in einer StringList die Capacity z.B. auf den Wert 10 einstellt, sollten beim StringList.LoadFromFile maximal 10 Zeilen gelesen werden (auch wenn die Datei etwa 100 Zeilen hat). Wäre eine solche Vorgangsweise möglich? Oder müsste man dazu eher die Methode LoadFromFile überschreiben?
Ich denke Capacity ist für etwas anderes Gedacht. Bevor man mit Add einen String anfügt, wird vorher der Speicher der Liste z. B. um 1 erhöht, so dass nun ein String angefügt werden kann. Allerdings ist das nicht optimal für jeden String den Speicher separat zu erhöhen, also wird mit Capacity etwas Speicher auf Vorrat reserviert (Capacity ist also immer Count plus Etwas). StringList macht das eigentlich automatisch, ich glaube 4, 8, 16 , usw. Wenn also vier Strings in StringList drin sind, wird für acht weitere Strings der Speicher reserviert. Sind die voll, für die nächsten 16 Strings usw. Wie gesagt, dass passiert automatisch, so dass man Capacity kaum selbst nutzt. Interessant wird das erst wenn man vorher weiß, dass man z. B. 1000 Strings einfügt. Statt also, dass TStringList alle paar Strings eine Pause machen muss um die Kapazität zu erhöhen, kann man mit Capacity gleich selbst für 1000 Strings den Speicher reservieren. Dafür ist es gedacht. Es wird eigentlich automatisch genutzt, man kann es unter bestimmten Bedingungen aber auch selbst nutzen.

Geändert von Popov (29. Dez 2012 um 17:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 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