![]() |
AW: With und Klassenmethoden
Zitat:
Wer's trotzdem verwendet muß halt damit leben, darf sich dann hinterher aber nicht beschweren. Gruß K-H P.S. mit relativen Dateinamen ist genau das gleiche.... |
AW: With und Klassenmethoden
Zitat:
|
AW: With und Klassenmethoden
Wäre niemals passiert hätte man es Design Technisch korrekt gelöst so wie in VB halt auch.
Code:
Da gehört ein Punkt vor.
with myRect
.Bottom = .Left + Width .Right = .Top + Height end with Ist also Width und Height ein Teil von myRect(TRect) dann wäre Width die weite und .Width die der ermittelten TRect Weite. Aber Delphi war immer schon etwas extravagant und musste sich vom Syntax(Script) unbedingt von VB unterscheiden. gruss |
AW: With und Klassenmethoden
Zitat:
Zitat:
Aber da meine Methoden so kurz sind, dass ich nicht scrollen muss um zur Variablendeklaration zu gelangen und auch der Scope kein Problem ist, sehe ich ausschließlich Nachteile in einer solchen Konstruktion. Wo liegt denn der Vorteil gegenüber einer einfachen lokalen Variable?!? |
AW: With und Klassenmethoden
Zitat:
Gebe doch mal direkt hinter myRect den Punkt ein. Vielleicht verstehst du dann was ich meine. Mir käme dann niemals in den Sinn hier .Width (aus dem Aufgeklappten IntelliSense Menu) zu verwenden wenn ich die Weite der Form verwenden möchte. Verstehe nicht was da schlimmer sein soll. gruss |
AW: With und Klassenmethoden
Zitat:
|
AW: With und Klassenmethoden
Zitat:
|
AW: With und Klassenmethoden
Selbst der Punkt hilft nicht, denn in Delphi kann man sich soviele Typen wie man nur will in den Scope holen.
Und eine Warnung des Compilers hilft auch nicht wirklich weiter wenn das Kind erstmal in den Brunnen gefallen ist. Ich muss erst den ganzen Verhau wieder auseinanderfummeln um die gewünschte Funktion wieder auf die Reihe zu bekommen. Gegeben folgende Basis-Klasse:
Delphi-Quellcode:
und diese einmal schlecht mit
type
TMyClass = class abstract public procedure DoSomethingWith( FooBar: TFooBar ); virtual; abstract; end;
Delphi-Quellcode:
:
with
Delphi-Quellcode:
Die IDE zeigt mir zwar an, von welcher Klasse die Special-Methode aufgerufen wird, aber ist das immer noch die Methode, die eigentlich angedacht war? Sind in der Zwischenzeit Änderungen an den Klassen erfolgt? Man kann es nicht mehr sagen ... hoffentlich erinnert man sich, oder man dokumentiert es ... äh, also mehr Tipparbeit - die wir uns durch das
type
TMyBad = class( TMyClass ) public procedure DoSomethingWith( FooBar: TFooBar ); override; end; procedure TMyBad.DoSomethingWith( FooBar: TFooBar ); begin with FooBar, FooBar.Bar, FooBar.Bar.Foo do begin FooMethod( ); // eine Methode von Foo BarMethod( ); // eine Methode von Bar FooBarMethod( ); // eine Methode von FooBar Special( ); // welches Special wird denn nun ausgeführt? end; end;
Delphi-Quellcode:
doch gerade ersparen wollten ...
with
Gut, ein anderer Ansatz wäre das hier
Delphi-Quellcode:
Wegen mir soll jeder sein
type
TMyGood = class( TMyClass ) private procedure InternalDoSomething( FooBar: TFooBar; Bar: TBar; Foo: TFoo ); public procedure DoSomethingWith( FooBar: TFooBar ); override; end; procedure TMyGood.DoSomethingWith( FooBar: TFooBar ); begin InternalDoSomething( FooBar, FooBar.Bar, FooBar.Bar.Foo ); end; procedure TMyGood.InternalDoSomething( FooBar: TFooBar; Bar: TBar; Foo: TFoo ); begin Foo.FooMethod( ); Bar.BarMethod( ); FooBar.FooBarMethod( ); FooBar.Special( ); // aha, DAS Special soll ausgeführt werden! end;
Delphi-Quellcode:
verwenden. Ich brauche es nicht aus dem gleichen Grund, wie es jaenicke schon beschreiben hat:
with
Kurze knackige Methoden. |
AW: With und Klassenmethoden
with ist nicht typsicher, deswegen verwende ich es nicht.
Heute noch funktionierend, morgen bei einer Variablenumbennung benutzt man mit with nicht mehr die innere Variable, sondern irgendeine eine ganz andere. With gefährdet für mich das Ziel einer unbedingten Verlässlichkeit einmal entwickelter und getesteter Quelltexte. Und wenn ich einen Fehler mache, dann möchte ich in sovielen Fällen wie möglich vom Compiler gewarnt werden. Genau das verhindert with. Ich habe in fremden Quelltexten schon genau solche Bugs finden und ausbessern müssen, die genau so entstanden sind. Falls noch nicht existent, lege ich stattdessen immer manuell eine Variable der Klasse / des Records an und schreibe immer mindestens: anstatt
Delphi-Quellcode:
das ist nicht soviel umständlicher und man bekommt sogar noch den Vorteil, dass einem der Compiler immer helfen kann.
with tiefe.Klassenstruktur.irgendwo.drin do begin
value1 := 5; value2 := 6; value3 := 7; end; schreibe ich: obj := tiefe.Klassenstruktur.irgendwo.drin; obj.value1 := 5; obj.value2 := 6; obj.value3 := 7; |
AW: With und Klassenmethoden
Also mein Programmierlehrer hatte damals immer zu with geraten :-D
Nachdem ich mir das ganze hier durchgelesen habe werde ich es wohl eher nicht mehr benutzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 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 by Thomas Breitkreuz