Hi folks,
Prof. Wirth hat das WITH-Statement bereits in seinem Ur-Pascal nicht ohne Grund eingeführt. Wichtig war ihm die einmalige Auswertung des Ausdrucks im WITH-Statement, was richtig angewandt zu Effizienz und Übersichtlichkeit gleichermaßen führt:
Delphi-Quellcode:
with TFileStream.Create(fn, fm) do
begin
Write(buf, bufSize);
Free;
end;
Auch Borland verwendet positive Vokabeln zur Beschreibung dieses Sprachmerkmals: einfach, bequem, effizient, kurz. Beim GREP über das SOURCE Verzeichnis von Delphi merkt man, dass die Borland-Entwickler keine Scheu hatten es zu benutzen.
In Modula hat Wirth das WITH-Statement überarbeitet. Die Einmalauswertung wollte er unbedingt beibehalten, aber das Überdeckungsproblem machte ihm wohl Sorgen. Als Lösung schuf er die Bindung des Ausdrucks an eine Variable, die nur im WITH-Statement verfügbar ist:
Delphi-Quellcode:
// no valid delphi code
with fs = TFileStream.Create(fn, fm) do
begin
fs.Write(buf, bufSize);
fs.Free;
end
In Oberon hat er das WITH-Statement aus übergeordneten Gesichtspunkten eliminiert - er wollte eine Sprache schaffen, die im Tugendvergleich mit ihren Vorgängern ähnlich da stehen sollte, wie RISC vs. CISC. Das Motto war KISS - Keep It Small, Simple.
Ich sehe in den Beiträgen dieses Threads eher persönliche Erfahrungsberichte als Argumente für und wider. Auch wenn ich das WITH-Statement häufig benutze, möchte ich niemanden bekehren, aber ein paar Dinge möchte ich gerne los werden:
Als Software-Entwickler erzeugen wir in erster Linie Programm-Quelltexte für diejenigen, die nach uns kommen. Wenn der Code korrekt ist, dann gibt es keinen Grund ihn (äquivalent) umzuformen, also wird kein Profi freigegebenen Code verändern, wenn er es nicht muss. Wir schreiben unseren Code nicht für irgendeinen Runtime-Debugger und wenn ich mit dem Cursor innerhalb eines WITH-Statements über einen Bezeichner halte, dann meldet mir die D7-
IDE den zugehörigen namespace.
Die Unübersichtlichkeit mancher Code-Strecken ist meiner Menung nach häufiger viel zu großen Funktionen geschuldet, als falsch angewandten WITH-Statements. Funktionale Programmierung und die konsequente Modularisierung führen zu Funktionen, die man mit einer oder beiden Händen abdecken kann. Wer dann noch fachbezogenen und abstrakten Code auf verschiedenen Ebenen ansiedelt, der macht sich um WITH-Statements kaum noch Sorgen.
Begreift WITH-Statements einfach als Freiheitsgrade der sprachlichen Ausdrucksfähigkeit von Object Pascal. Es sind dynamische default namespaces - nicht mehr und nicht weniger. Benutzt sie oder lasst es halt, aber lasst euch nicht beim Missionieren erwischen.
Freundliche Grüße