Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Visitor Pattern (https://www.delphipraxis.net/152968-visitor-pattern.html)

Namenloser 15. Jul 2010 17:16

AW: Visitor Pattern
 
Zitat:

Zitat von hansmaad (Beitrag 1035459)
Oder weiß der Compiler, dass die Implementierung von Visit die Visitorinstanz nicht verändert? Was passiert, wenn Visit die Istanz verändert?

Genau das ist
Delphi-Quellcode:
const
: Eine Schreibschutz-Markierung. Das erlaubt natürlich gewisse Compileroptimierungen, genauer gesagt kann einfach ein Pointer auf das Original übergeben werden, statt dass eine Kopie auf dem Stack angelegt werden muss.

Zu deiner 2. Frage: Das geht nicht, der Compiler schmeißt dann einen Fehler.

Im Grunde ist
Delphi-Quellcode:
const
das gleiche wie
Delphi-Quellcode:
var
, nur mit dem Unterschied, dass das Original garantiert nicht verändert wird.

himitsu 15. Jul 2010 17:34

AW: Visitor Pattern
 
CONST ist nicht immer genau das Gleiche wie VAR,
das siehst du, wenn du z.B.
Delphi-Quellcode:
const i: Integer
mit
Delphi-Quellcode:
i: integer
und
Delphi-Quellcode:
var i: Integer
vergleichst, denn dieses wird delphi meißt so weit optimieren, daß hier kein Pointer, sondern direkt der Wert mitgenommen wird, trots des CONST.
dennoch können, vorallem bei referenzzählenden Typen oder gar dem "kranken" WideString und Records, durch das CONST dennoch so einige kleine Stellen optimiert werden, da man hier explizit angibt, daß der Wert nicht verändert wird.

hansmaad 16. Jul 2010 10:11

AW: Visitor Pattern
 
Also jetzt brauch ich doch noch mal eine genauere Erklärung.
Ich habe es gerade getestet und ich kann auf einem const Argument alles aufrufen und es auch durch nicht konstante Methoden verändern. Was heißt hier const?

Delphi-Quellcode:
type
    Test = class
    private
        x : Integer;
    public
        constructor Create;
        procedure Konstant();
        procedure NichtKonstant();
    end;

{ Test }

constructor Test.Create;
begin
    x := 1;
end;

procedure Test.Konstant;
begin
    WriteLn(IntToStr(x));
end;

procedure Test.NichtKonstant;
begin
    x := x * 2;
end;

procedure Foo(const t : Test);
begin
    t.Konstant;
    t.NichtKonstant;
    t.Konstant;
end;


var
    Tester : Test;
begin
    Tester := Test.Create;

    Foo(Tester);

    Tester.Free;
    ReadLn;
end.
Code:
1
2

himitsu 16. Jul 2010 10:21

AW: Visitor Pattern
 
CONST bezieht sich immer nur auf die Variable/Parameter.

Es kann also der Parameterwert nicht verändert werden (Interface freigeben oder ein Anderes einfügen), aber den Inhalt von Objekten und Interfaces betrifft dieses nicht.

Delphi-Quellcode:
t.NichtKonstant;
ändert ja nur den Inhalt und nicht den Parameter, bzw. den Zeiger in dem Parameter, welcher auf das Objekt zeigt.

sowas geht nicht
Delphi-Quellcode:
procedure Foo(const t : Test);
begin
  t := nil;
  t := WasAnderes;
end;
Es gibt nur eine Stelle, wo CONST wirklich versagt ... und das ist bei Records, welche "neuerdings" mit Record-Methoden versehen werden können.
Eigentlich dürfte man bei Records, da sie nicht über einen Zeiger, sondern direkt verwalte werden, nicht den Inhalt verändern, welches aber dennoch leider über die RecordMethoden möglich ist. :cry:

hansmaad 16. Jul 2010 10:25

AW: Visitor Pattern
 
Ah ok, jetzt ists klar.
Gibt es auch ein const, das die Instanz konstant macht. So dass die Funktion das übergebene Objekt nicht verändert darf?

himitsu 16. Jul 2010 10:30

AW: Visitor Pattern
 
Leider nein.

Für sowas müßtest du selber den Schreibschutz direkt in das Objekt/Interface einbauen.

hansmaad 16. Jul 2010 10:38

AW: Visitor Pattern
 
Schade, aber trotzdem Danke:wink:

Gibt es ein empfehlenswertes Buch, dass solche Dinge wie in diesem Thread bespricht (Patterns in Delphi, gutes Design...)?
Die meisen Delphi Bücher die ich mir angesehen habe, sahen nach dem Schema "Klicken Sie Form erstellen um ein Form zu erstellen" aus. Gerne auch englisch.

Blup 16. Jul 2010 14:42

AW: Visitor Pattern
 
Nicht Delphi aber gut verständlich und unterhaltsam: Entwurfsmuster von Kopf bis Fuß
Die Beispiele kann man auch sehr leicht in Delphi umsetzen.

Sherlock 16. Jul 2010 14:48

AW: Visitor Pattern
 
1) gibt es sowieso fast keine aktuellen Delphibücher. IMHO spricht das FÜR Delphi ;)
und b) Ich denke da sollten Bücher, die andere Sprachen zur Erklärung verwenden auch möglich sein.

Sherlock

hansmaad 16. Jul 2010 14:53

AW: Visitor Pattern
 
Bücher wie GoF usw hab ich schon im Regal stehen. Ich dachte eher an etwas speziell auf Delphi bezogen. Vielleicht verschwenden Delphi Entwickler ja nicht so gern ihre Zeit mit Lesen :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Seite 3 von 4     123 4      

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