AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Klatsch und Tratsch VAR oder nicht VAR Überlegungen
Thema durchsuchen
Ansicht
Themen-Optionen

VAR oder nicht VAR Überlegungen

Ein Thema von Mavarik · begonnen am 26. Dez 2014 · letzter Beitrag vom 27. Dez 2014
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#1

VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 14:50
Hallo Zusammen.

Unit A definiert:

Delphi-Quellcode:
type
   TFoo = Record
            MeinFeld : String;
          end;
Unit B definiert:

Delphi-Quellcode:
type
   TFoo = Class
    Public
      MeinFeld : String
   end;
Dann gibt es noch Unit C mit

Delphi-Quellcode:
Procedure A(AFoo : TFoo);
begin
  AFoo.MeinFeld := 'Warum kommt das hier nicht zurück';
end;
oder besser?
Delphi-Quellcode:
Procedure A(Var AFoo : TFoo);
begin
  AFoo.MeinFeld := 'Das kommt auf jeden Fall zurück';
end;
OK, Worum geht es mir?

Bei Records macht der Var Parameter einen Unterschied.
- Call bei Referenz
- Call bei Value

Theoretisch bei Classen auch, aber nur für den Objectzeiger.

Wenn ich also nach 5 Jahren mir eine Procedure anschaue kann ich mich ggf. nicht mehr daran erinnern, ob TFoo ein Object oder ein Record ist.

Daher meine These oder nennt es mein DesignPattern.

Wenn an Procedure ein Objekt übergeben wird, schreibe ich immer VAR. So kann ich an der Definition der Procedure sehen, dass wenn ich innerhalb der Procedure etwas mit AFoo mache, es Auswirkungen nach draußen hat.

Bin gespannt auf Eure Kommentare. Besonders ob wenigsten einer Dabei ist mit "Gute Idee"...

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 15:29
Tendenziell eher schlecht als gut. Im Normalfall will man ja an der Objektinstanz an sich überhaupt nichts verändern, sondern lediglich mit deren Methoden oder Properties arbeiten, wieso also als Variablenparameter übergeben? Es kann natürlich auch Ausnahmen geben, aber das sind dann meist wirklich Ausnahmen. Wenn die Übergabeart schon dazu dienen soll, auseinanderzuhalten, was ein Record und was eine Klasse ist (wobei mir das schon überdenkenswert erscheint), dann übergib doch Objektinstanzen als Konstantenparameter, da kann dann auch nichts schiefgehen.
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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 15:43
Zeig doch bitte mal wie Unit A, Unit B und Unit C zusammengesteckt aussehen.

Denn entweder ist TFoo in Unit C der Record oder die class , aber es geht niemals das überraschenderweise mal die Klasse oder der Record in die Prozedur von Unit C läuft.

Das muss man also schon bewusst so programmieren.
Delphi-Quellcode:
unit C;

interface

uses A, B;

procedure A( var Foo : A.TFoo ); overload; // record
procedure A( Foo : B.TFoo ); overload; // class
Und auch wenn da beide gleich benannt sind, handelt es sich intern um grundverschiedene Typen, so als ob der eine Typ TAnton und der andere TFritz heißen würde.

Das Grundverhalten von record und class ist nun mal auch grundverschieden, dass man die eben nicht über einen Kamm scheren kann.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 15:55
Find ich auch eher nicht so gut. Denn wenn ein Objekt als var übergeben wird, dann erlaubt das der aufgerufenen Routine, den Zeiger zu verändern. Also wenn, dann würde ich als „Design Pattern“ eher vorschlagen, Objekte, die verändert werden könn(t)en „normal“ zu übergeben (ohne var und const), und Objekte, die explizit nicht verändert werden dürfen als const (ja ich weiß, dass das const das nicht verhindert, aber zumindest macht es es nicht noch schlimmer im Gegensatz zum var).

Mache ich aber selber nicht so, ich hatte das Problem eigentlich nie.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 16:14
Am Rande eine dumme Frage- Es macht doch für den Aufrufer keinen Unterschied ob ein Parameter const oder nicht const ist, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 16:15
Man muss sich immer vor Augen halten, was denn da genau übergeben wird, und das ist bei einem Record und einer Klasse eben etwas völlig anderes.

Der Prozeduraufruf arbeitet bei beiden gleich:
Bei const Value : Type ist der Wert nicht änderbar, bei Value : Type ist der Wert änderbar, geht aber nicht zurück und bei var Value : Type ist der Wert änderbar und wird zurückgegeben.

Aber bei einem Record ist der Wert eben der gesamte Inhalt des Records und bei einer Klasse ist der Wert die Referenz auf einen Speicherbereich.

Hier kann es leicht passieren, dass man Birnen und Äpfel verwechselt oder versucht miteinander zu vergleichen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
alda

Registriert seit: 24. Mär 2014
Ort: Karlsruhe
93 Beiträge
 
Delphi XE6 Architect
 
#7

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 16:49
Am Rande eine dumme Frage- Es macht doch für den Aufrufer keinen Unterschied ob ein Parameter const oder nicht const ist, oder?
Für den aufrufenden nicht, das ist korrekt. Es geht hier eher um eine indirekte Optimierung des Compilers - mit einem "const" vor einem Parameter wird kein "try .. except" um die Verarbeitung des Parameters gebaut.

Aus diesem Grund steht bei mir vor jedem Parameter ein const, es sei denn ich benötige ein var oder ein out.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: VAR oder nicht VAR Überlegungen

  Alt 26. Dez 2014, 22:59
Zeig doch bitte mal wie Unit A, Unit B und Unit C zusammengesteckt aussehen.
Nee falsch verstanden...

Unit A gehört zu Projekt A von 1990
Unit B gehört zu Projekt B von 2005

Unit C heißt eigentlich Hier_sind_alle_Proceduren_drinn_die_sich_in_den_le tzten_25_Jahren_angesammelt_haben.pas

2015 muss ich einen Fehler suchen und schaue mir eine Procedure an...

Und wen da steht: Procedure GetPLZ2Ort(Var AAdresse:tAdresse);

Bin ich mir sicher, egal ob es ein TObject oder ein Record ist, wenn ich

Adresse.Ort := GetOrt(Adresse.PLZ);
Bla bla bal

Das meine Adresse die ich übergeben habe, sich auch ändert und nicht nur die lokale AAdresse.

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: VAR oder nicht VAR Überlegungen

  Alt 27. Dez 2014, 09:50
Wenn ich das jetzt richtig verstanden habe, dann hast Du in der Unit B aus einem Record "einfach" mal eine (Krüppel-)Klasse gemacht. Das wird zwar manchmal gerne propagiert, halte ich aber für nicht sooo gelungen, da "Verwechslungsgefahr" besteht.
Hier kehrt sich der "Vorteil", daß Pointer hinter normalen Namen versteckt werden, in einen Nachteil um, denn der Programmierer muß wissen was übergeben wird. Bei solchen Mißverständnissen gefällt mir die "Pointeritis" des Windows-API wieder richtig gut.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: VAR oder nicht VAR Überlegungen

  Alt 27. Dez 2014, 13:09
Am Rande eine dumme Frage- Es macht doch für den Aufrufer keinen Unterschied ob ein Parameter const oder nicht const ist, oder?
Für den aufrufenden nicht, das ist korrekt. Es geht hier eher um eine indirekte Optimierung des Compilers - mit einem "const" vor einem Parameter wird kein "try .. except" um die Verarbeitung des Parameters gebaut.

Aus diesem Grund steht bei mir vor jedem Parameter ein const, es sei denn ich benötige ein var oder ein out.
Wie es sich auf Try-Except aus wirkt, weiß ich nicht, aber ansonsten hast du recht – es ist eine Optimierung. Mit const kann der Compiler beispielsweise die Referenzzählung bei Strings weglassen oder bei Records sich das Umkopieren sparen und stattdessen einfach einen Zeiger übergeben.
  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 22:34 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