Wenn ich so etwas sehe:
Delphi-Quellcode:
If (length(ValueA)=0) or (length(ValueA)> 0 and ValueA[0] < 1) then
...
muss ich immer 2x hinschauen. Auch später, beim Lesen des Codes. Also überlege ich mir "Was bedeutet das eigentlich". Z.B. will ich sicherstellen, das 'ValueA' mindestens einen gültigen Wert enthält. Also schreibe ich
If HasAtLeastOneValidValue(ValueA) then
. *DAS* kann man lesen.
Nächster Schritt. Was bedeutet also 'HasAtLeastOneValidValue' ?
Also ausformulieren
Delphi-Quellcode:
function HasAtLeastOneValidValue (aArray : TIntegerArray) : Boolean;
Begin
if Length(aArray)=0 then exit(false);
if aArray[0]<1 then exit(false);
exit(true);
end;
Unit-Test für diese Idiotenfunktion schreiben, läuft, fertig. Kommentieren? Wieso? Ist sie doch schon. Falls mir das nicht reicht, mit dem Kommentar, mach ich Folgendes:
Delphi-Quellcode:
function HasAtLeastOneValidValue (aArray : TIntegerArray) : Boolean;
Begin
if IsEmpty(aArray) then
exit (false);
result := ElementIsValid(aArray[0]);
end;
Function IsEmtpy (aArray : TIntegerArray) : Boolean;
begin
result := Length(aArray) = 0;
end;
Function ElementIsValid(aElement : Integer) : Boolean;
begin
result := aElement >= 1;
end;
Das versteht selbst Oma. Ich persönlich würde wirklich so weit gehen.
Aber irgendwann fällt meinem Kollegen (ein Performancefetischist) auf, das man die Funktion verkleinern kann. Kein Problem, wir haben ja den Unittest. Also macht er vielleicht später daraus einen Einzeiler. Oder auch nicht, vollkommen egal.
Ich komme durch dieses Refactoring bzw. Top-Down-Programmieren mit stufenweiser Verfeinerung bei etwas komplexeren boolschen Ausdrücken nie in die Verlegenheit, den Ausdruck in eine Zeile zu quetschen, sondern kann mich in der Funktion nach Herzenslust austoben. Das erhöht die Lesbarkeit enorm (gut, es ist etwas kleinlich), aber wenn ich nach 10 Jahren nochmal reinschaue, verstehe ich es immer noch. Und mir ist das sehr wichtig.
Warum das in Delphi ein globaler (ziemlich auffälliger) Compilerschalter ist und nicht wie in so ziemlich allen Sprachen ein "&&" bzw "&" habe ich nie verstanden...
Das ist doch ganz einfach:
A and B ist ein Boolscher Ausdruck, bei dem selbstverständlich -rein mathematisch gesehen- A und B ausgerechnet bzw. ermittelt wird. Irgendwann, als die CPU noch langsam waren, kam jemand auf die Idee, das B (oder A?) gar nicht ausgerechnet werden muss, wenn FALSE beim ersten Element rauskommt. Wow. Optimierung war damals hoch im Kurs. Blöd für die Compiler, die einen Ausdruck von rechts nach links ausgewertet haben (C war früher so -glaube ich-). Da kommt man dann durcheinander, weswegen ich mich früher nie darauf verlassen habe, sondern immer 'If A then if B then' geschrieben habe.
Aber da Delphi ursprünglich aus Turbopascal entstanden und Turbopascal auch in Felsmalereien in Steinzeithöhlen zu finden ist, hat sich das bis heute so gehalten. Bei Delphi wird Tradition noch groß geschrieben.
Wie hättest Du es denn gerne?
If A andthen B then
Delphi will ja partout keine kurzen Operatoren...