Zitat:
Ich seh ehrlich gesagt noch nicht den sachlichen Vorteil darin, dass ich eine Funktion innerhalb einer Funktion verwende. Als Nachteile sehe ich weiterhin, dass die Lesbarkeit reduziert wird. Man sieht meiner Meinung nach nicht sofort, wo was herkommt.
Siehst du und da meine ich arbeitest du ineffizient.
Warum willst du ALLES im Kopf haben, jedes kleine Detail eine Implementierung, das ist utopisch. Konsequenz ist also das man im BlackBox-Prinzip denkt und auch einen Source liest.
Das heist: man schaut sich einmalig zb. eine nested Funktion an und liest deren Implementirung. Wenn man das gemacht hat dann reicht als Information für die Zukunft nur noch der Name, Parameter und Aufgabe zu kennen, NICHT deren Implementierung.
Was ist den das Gegenteil der Funktionen, und eben nested Funktionen ? Spaghetti-code !
Ein extremes Beispiel
Delphi-Quellcode:
for I := 0 to x do
begin
S := '';
K := I *2;
while K > 0 do
begin
S := S + Char(Ord('0') + K mod 10)
K := K div 10;
end;
Array[i] := S;
S := '';
K := I *3;
while K > 0 do
begin
S := S + Char(Ord('0') + K mod 10)
K := K div 10;
end;
Array[i*2] := S;
S := '';
K := I *12;
while K > 0 do
begin
S := S + Char(Ord('0') + K mod 10)
K := K div 10;
end;
Array[i*12] := S;
end;
Das ist das was du propagierst
Delphi-Quellcode:
function Convert(K: Integer): String;
begin
Result := '';
while K <> 0 do
begin
Result := Result + Char(Ord('0') + K mod 10)
K := K div 10;
end;
end;
begin
for I := 0 to x do
begin
Array[i] := Convert(I*2);
Array[i*2] := Convert(I*3);
Array[i*12] := Convert(I*12);
end;
1.) man sieht wohl den Unterschied in der Lesbarkeit
2.) Convert() als Funktion wird
ausschließlich nur in dieser Funktion benötigt und um Namens Kollisionen zu vermeiden machen wird sie nested
3.) Convert() benötigt in EAX den Parameter K, und noch ein Register um Result aufzunehmen. Mehr benötigt man an registern auch nicht, dh. Convert() sollte durch den Compiler in einen Maschionencode umgewandelt werden der ohne STack auskommt.
4.) in der Funktion selber werden I,X und @Array benötigt, also 3 CPU Register. Also auch diese Funktion sollte durch den Compiler vollständig in Registern optimiert werden
Im Gegensatz zum 1. Beispiel:
- Spaghetti Code
- I,K,X,@Array[],K,S müssen in Register, das reicht aber nicht es stehen zur Verfügung EAX,EDX,ECX und EDI,ESI,EBX wenn sie auf dem STack gesichert wurden.
Nested Funktionen sind ein ganz normales Instrument der heutigen Programmierung. Gibt es eine procedurale Modularisierung in einer Programmiersprache so gibt es dort auch konsequenter Weise die nested Funktionen als stärkste Abstraktionsebene.
Das Konzept hinter den nested Funktionen ist also das gleiche Konzept wie hinter dem BackBox Prinzip, der prozeduralen Programmirung, der hierarischen Modularisierung der Sourcen und Programme und auch der
OOP (
OOP ist nur eine andere Art und Weise der Abstraktion und Modularisierung, ihr Ziel ist aber gleich).
Gruß Hagen