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:
type
TMyClass = class abstract
public
procedure DoSomethingWith( FooBar: TFooBar ); virtual; abstract;
end;
und diese einmal schlecht mit
with
:
Delphi-Quellcode:
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;
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
with
doch gerade ersparen wollten ...
Gut, ein anderer Ansatz wäre das hier
Delphi-Quellcode:
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;
Wegen mir soll jeder sein
with
verwenden. Ich brauche es nicht aus dem gleichen Grund, wie es jaenicke schon beschreiben hat:
Kurze knackige Methoden.