if in Setter Methode bei Klassen Vervollständigung sinnvoll?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

if in Setter Methode bei Klassen Vervollständigung sinnvoll?

Beitrag von Komoluna »

Liebes Forum,

Wenn man in einer Klassendefinition eine Property erstellt, und dann Shift+Strg+C drückt, erhält man in etwa folgendes:

Code: Alles auswählen

procedure SetXY(aValue: Integer);
begin
  if FXY = aValue then
    exit;
  FXY := aValue;
end;


Ist das überhaupt sinnvoll?
Werden so nicht viel mehr Werte im Arbeitsspeicher herumkopiert, als bei eine einfachen Zuweisung:

Code: Alles auswählen

procedure SetXY(aValue: Integer);
begin
  FXY := aValue;
end;

oder optimiert der Compiler das irgendwie, dass es weniger Schreib/Lesevorgänge sind?
Bei Kilo(meter/byte) langen Strings kann ich mir ja vorstellen, dass die Abfrage sinnvoll ist, aber sonst eigentlich nicht oder?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: if in Setter Methode bei Klassen Vervollständigung sinnv

Beitrag von Mathias »

Das habe ich mich auch schon gefragt.

Bei Kilo(meter/byte) langen Strings kann ich mir ja vorstellen, dass die Abfrage sinnvoll ist,

2 Strings zu vergleichen braucht unterumständen sogar länger, als wen man sie kopiert.

Und wen sie unterschiedlich sind, muss man sie trotzdem noch kopieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: if in Setter Methode bei Klassen Vervollständigung sinnv

Beitrag von wp_xyz »

Das ist natürlich Overkill. Das IF zu Beginn der Prozedur ist hauptsächlich dafür gedacht, dass Folge-Code im Setter nicht ausgeführt wird, z.B. eine komplizierte Neuberechnung, die natürlich unnötig ist, wenn sich der Parameter gar nicht geändert hat.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: if in Setter Methode bei Klassen Vervollständigung sinnv

Beitrag von Mathias »

Jetzt sehe ich einen Sinn der Sache. Nehmen wir als Beispiel, Color von TForm, wen der Color-Wert gleich bleibt, hat es ja keinen Sinn, das Formular neu zu bemahlen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: if in Setter Methode bei Klassen Vervollständigung sinnv

Beitrag von Komoluna »

Das stimmt natürlich, ein Vergleich geht meist schneller als Berechnungen.
Da die meisten meiner Property Werte jedoch einfach nur zugewiesen werden, stört mich diese Abfrage eher.
Wie ist das bei euch? Führt ihr solche Berechnungen durch, oder sind es bei euch einfach eher einfache Zuweisungen?
Vlt. wäre es sinnvoll, in den Optionen von Lazarus einen Schalter einzubauen, mit dem sich diese zwei Zeilen abschalten lassen.
Oder optimiert der Compiler schon die Methode dahingehend, dass sich der Performanceunterschied eher in Grenzen hält?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: if in Setter Methode bei Klassen Vervollständigung sinnv

Beitrag von Mathias »

Wen es nur eine einfache Zuweisung ist, schreibe ich folgendes.

Code: Alles auswählen

property test:integer read Ftest write Ftest;


Und wen nur gelesen werden darf folgendes.

Code: Alles auswählen

property test:integer read Ftest;


Bei dem obigen Beispiel, kann man genau so gut die Variable als Public deklarieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten