![]() |
Delphi-Version: XE2
Procedure in Procedure
Hallo zusammen,
auf der Suche nach einer XML-Komponente wurde mehrfach der ![]() In dem Beispielcode ist unter anderem eine Procedure innerhalb einer Procedure:
Delphi-Quellcode:
Was hat dies für einen Hintergrund?
PROCEDURE TFrmMain.FillTree;
PROCEDURE ScanElement (Parent : TTreeNode); VAR Node : TTreeNode; Strg : AnsiString; EN : TElementNode; BEGIN WHILE XmlParser.Scan DO BEGIN Node := NIL; CASE XmlParser.CurPartType OF ptXmlProlog : BEGIN Node := TrvDoc.Items.AddChild (Parent, '<?xml?>'); Node.ImageIndex := Img_Prolog; EN := TElementNode.Create (StrSFPas (XmlParser.CurStart, XmlParser.CurFinal), NIL); Node.Data := EN; END; {noch weitere CASE abfragen...} END; IF Node <> NIL THEN Node.SelectedIndex := Node.ImageIndex; END; END; BEGIN TrvDoc.Items.BeginUpdate; TrvDoc.Items.Clear; XmlParser.Normalize := TRUE; XmlParser.StartScan; ScanElement (NIL); TrvDoc.Items.EndUpdate; END; "ScanElement" wird ja nur einmal aufgerufen. Danke schonmal. Gruß Torsten |
AW: Procedure in Procedure
Übersichtlichkeit. Durch die Namensgebung der 2. Procedure wird automatisch dokumentiert, was dieser Codeabschnitt bewirkt.
Technisch hätte man es auch direkt in die 1. Procedure schreiben können. |
AW: Procedure in Procedure
Übersichtlich ist das Beispiel gar nicht. In dem Besipiel macht es m.E. keinen Sinn. Es macht Sinn, wenn die entsprechende Procedure mehrfach in der umschliessenden Procedure aufgerufen wird.
|
AW: Procedure in Procedure
Ach ja. Sollten in der äusseren Procedure Variablen deklariert sein, kann die innere Procedure darauf zugreifen. Ist im Besispiel aber nicht gegeben.
|
AW: Procedure in Procedure
Zitat:
|
AW: Procedure in Procedure
Stimmt. Ansichtssache ;-)
Aber in dem Fall hätte man die innere Procedure komplett auslagern können, da ja nicht auf Variablen der äusseren Procedure zurückgegriffen wird. |
AW: Procedure in Procedure
Zitat:
Wenn diese Procedure im gesamten Code nur einmal verwendet wird. Irgendwie unlogisch oder? gruss |
AW: Procedure in Procedure
Das mit der Übersichtlichkeit ist natürlich immer subjektiv.
Man hätte sich hier auch den Parameter sparen können, da offensichtlich immer NIL übergeben wird. Es sieht so aus, als wäre die innere Procedure ein Relikt aus Zeiten, wo der Aufruf noch öfter (mit verschiedenen Parameterwerten) vorkam. Trotzdem kann die Aufteilung schon Übersichtlichkeit bringen (wie gesagt, die Funktion des Codeabschnitts ergibt sich hier schon aus dem Namen). Ich persönlich nutze diese Procedure-in-Procedure-Konstrukte recht selten. Hier in dem Fall hätte ich auch eine private procedure von TfrmMain davon gemacht. |
AW: Procedure in Procedure
Eventuell war in der Procedur früher mal ein rekursiver Code, der dann später zu diesem iterativen Code umgebaut wurde?
Und der Einfachheit halber ließ man den Code dann ganz einfach dort. Zitat:
Also XmlParser und TrvDoc gehören gefälligst in den Parametern übergeben. |
AW: Procedure in Procedure
Variante 1;
Delphi-Quellcode:
Variante 2:
Procedure Something();
Begin if Foobar>23 then Stuff:=Bar; For bar in foo do begin ... end; end;
Delphi-Quellcode:
Variante 2 *dokumentiert* ohne Kommentar. Prozeduren sind ja nicht nur dazu da, um Redundanz zu vermeiden, sondern sollen die Lösung (also den Code) in Teillösungen unterteilen. Im Idealfall so, das jede Teillösung (aka Prozedur, Methode) nur eine einzige Aufgabe hat (=> Clean Code).
Procedure Something();
Procedure SetStuff();... Procedure ProcessAllFoos();... Begin SetStuff(); ProcessAllFoos();; end; Die Sache mit den lokalen Prozeduren ist ein Überbleibsel aus der Vor-OOP-Zeit. Mittlerweile würde man das eher als private Methode umsetzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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