Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Sichtbarkeit Prozduren in Prozeduren (https://www.delphipraxis.net/176735-sichtbarkeit-prozduren-prozeduren.html)

nakaramia 23. Sep 2013 16:18

Sichtbarkeit Prozduren in Prozeduren
 
Hallo,

ich habe ein Programm in Delphi 2007, in dem in einer Prozedur ein Dutzend anderer enthalten sind. Eine davon würde ich gern splitten, um keine Code-Kopien zu erzeugen. Dazu müsste die neue Prozedur aber von den inneren Prozeduren gesehen/aufgerufen werden können. Gibt es so eine Möglichkeit? Ich habe das mal als Pseudo-Code zusammengeschrieben.

Delphi-Quellcode:
procedure TMyParent.IchBinGanzOben;
procedure Kind1;
begin
  //hier soll KindN aufgerufen werden können
end;

procedure KindN;
begin
  //ausgelagerter Code
end;

begin
  //hier wird Kind1 aufgerufen
end;
Notfalls könnte ich KindN in Kind1 reinschreiben.

stahli 23. Sep 2013 16:31

AW: Sichtbarkeit Prozduren in Prozeduren
 
... einfach KindN vor Kind1 verschieben ;-)

Wenn Du gegenseitige Aufrufe brauchst müsstest Du die Prozeduren als (private oder protected) Methoden deklarieren.

DeddyH 23. Sep 2013 16:33

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von stahli (Beitrag 1229645)
Wenn Du gegenseitige Aufrufe brauchst müsstest Du die Prozeduren als (private oder protected) Methoden deklarieren.

Oder die Prozedurköpfe im interface-Abschnitt veröffentlichen.

Uwe Raabe 23. Sep 2013 16:34

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von DeddyH (Beitrag 1229646)
Oder die Prozedurköpfe im interface-Abschnitt veröffentlichen.

Bei lokalen Prozeduren?

DeddyH 23. Sep 2013 16:37

AW: Sichtbarkeit Prozduren in Prozeduren
 
Lokal und gegenseitiger Aufruf geht schlecht zusammen, oder?

Uwe Raabe 23. Sep 2013 16:40

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von DeddyH (Beitrag 1229648)
Lokal und gegenseitiger Aufruf geht schlecht zusammen, oder?

Wieso nicht?

Delphi-Quellcode:
procedure IchBinGanzOben;

  procedure KindN; forward;

  procedure Kind1;
  begin
    KindN;
  end;

  procedure KindN;
  begin
    Kind1;
  end;

begin
  //hier wird Kind1 aufgerufen
end;

DeddyH 23. Sep 2013 16:41

AW: Sichtbarkeit Prozduren in Prozeduren
 
Hast ja gewonnen.

stahli 23. Sep 2013 16:42

AW: Sichtbarkeit Prozduren in Prozeduren
 
Ahh! Wusste ich gar nicht...
Um so besser.

Bjoerk 23. Sep 2013 16:43

AW: Sichtbarkeit Prozduren in Prozeduren
 
Oder Kapselung einzuführen.

Delphi-Quellcode:
TSomeKinds = record
private
  FSomeInput: TSomeInput;
  FSomeOutput: TSomeOutput;
  procedure DoSomething;
  procedure DoSomethingElse;
public
  procedure Kind1;
  procedure Kind2;
  procedure KindN;
  property SomeInput: TSomeInput read FSomeInput write FSomeInput;
  property SomeOutput: TSomeOutput read SomeOutput write FSomeOutput;
end;

procedure TMyParent.IchBinGanzOben;
begin
  FSomeKinds.Kind1;
end;

Zacherl 23. Sep 2013 17:01

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von Bjoerk (Beitrag 1229652)
Oder Kapselung einzuführen.

Ist in diesem Kontext aber nicht sehr sinnvoll. Allerhöchstens als private dann, aber lokal und ggfls. mit forward ist dann eventuell doch noch schöner.

Bjoerk 23. Sep 2013 17:20

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von Zacherl (Beitrag 1229656)
Ist in diesem Kontext aber nicht sehr sinnvoll. Allerhöchstens als private dann, aber lokal und ggfls. mit forward ist dann eventuell doch noch schöner.

Kann sein. Bei Kapselung macht das im Allgemeinen aber so. Man hat ja auch nicht z.B. die strings einer inifile als extra variable und die inifile nur lokal?

Zacherl 23. Sep 2013 21:34

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von Bjoerk (Beitrag 1229659)
Kann sein. Bei Kapselung macht das im Allgemeinen aber so. Man hat ja auch nicht z.B. die strings einer inifile als extra variable und die inifile nur lokal?

Der Vergleich hinkt aber ein wenig, oder? :zwinker: Aber hast natürlich Recht, es kommt immer auf den Kontext an. Hier werden die 2 Funktionen ja nur lokal (innerhalb von "IchBinGanzOben") aufgerufen, deshalb kann man auf jeden Fall schonmal private sagen. Jetzt kommt aber hinzu, dass die Funktionen nur an einer einzigen Stelle (aus "IchBinGanzOben" heraus) aufgerufen werden, weshalb ich hier zu lokalen Deklaration neigen würde. Ist prinzipiell aber sicher auch einfach Geschmackssache.

nakaramia 24. Sep 2013 06:18

AW: Sichtbarkeit Prozduren in Prozeduren
 
Vielen Dank.

Furtbichler 24. Sep 2013 06:23

AW: Sichtbarkeit Prozduren in Prozeduren
 
Das riecht eher nach einer eigenen Klasse, als nach Prozeduren, in Prozeduren, die zudem noch so komplex scheinen, das sie sich gegenseitig aufrufen. Muss nicht sein, wäre aber in jeder anderen Sprache ein Fall für eine neue Klasse.

Ich persönlich finde die kleinen Lokalenprozedurhelferlein sehr praktisch, weil das das 'R' in RAD betont. Es ist eben immer noch schneller, eine komplexe Methode in ein paar lokalen Prozeduren zu kapseln und auch einigermaßen lesbar zu machen (wenn man denn das erste
Delphi-Quellcode:
Begin
der Prozedur überhaupt findet).

Aber 'schneller' ist nicht gleich 'besser'.

Zitat:

Zitat von nakaramia (Beitrag 1229644)
...in dem in einer Prozedur ein Dutzend anderer enthalten sind...

Das riecht aber nicht nur nach einer neuen Klasse, es schreit förmlich danach. Die Lesbarkeit wird ja durch die 12 lokalen Prozeduren auch nicht gerade erhöht. Und in der separaten Klasse hast Du auch nicht die Sichtbarkeitsprobleme, weil sich eh jeder kennt.

Perlsau 24. Sep 2013 06:34

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von Furtbichler (Beitrag 1229672)
Es ist eben immer noch schneller, eine komplexe Methode in ein paar lokalen Prozeduren zu kapseln und auch einigermaßen lesbar zu machen (wenn man denn das erste
Delphi-Quellcode:
Begin
der Prozedur überhaupt findet).

Das wäre wohl das kleinste Problem: einfach mit entsprechendem Kommentar versehen und du findest deine Hauptprocedure sofort:

Delphi-Quellcode:
Procedure Komplex;
// Sub 1 DoSomeThing & DoItAgain
Procedure SubProcedure1;
Begin
  DoSomeThing;
  DoItAgain;
End;

// ********** Hauptprocedure *********************************
Begin
End;

TiGü 24. Sep 2013 08:16

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von Perlsau (Beitrag 1229674)
Zitat:

Zitat von Furtbichler (Beitrag 1229672)
Es ist eben immer noch schneller, eine komplexe Methode in ein paar lokalen Prozeduren zu kapseln und auch einigermaßen lesbar zu machen (wenn man denn das erste
Delphi-Quellcode:
Begin
der Prozedur überhaupt findet).

Das wäre wohl das kleinste Problem: einfach mit entsprechendem Kommentar versehen und du findest deine Hauptprocedure sofort:

Rücke doch einfach vernünftig ein?!

Delphi-Quellcode:
procedure Komplex;

  procedure SubProcedure1;
  begin
    DoSomeThing;
    DoItAgain;
  end;

begin
end;

Perlsau 24. Sep 2013 08:32

AW: Sichtbarkeit Prozduren in Prozeduren
 
Zitat:

Zitat von TiGü (Beitrag 1229686)
Zitat:

Zitat von Perlsau (Beitrag 1229674)
Zitat:

Zitat von Furtbichler (Beitrag 1229672)
Es ist eben immer noch schneller, eine komplexe Methode in ein paar lokalen Prozeduren zu kapseln und auch einigermaßen lesbar zu machen (wenn man denn das erste
Delphi-Quellcode:
Begin
der Prozedur überhaupt findet).

Das wäre wohl das kleinste Problem: einfach mit entsprechendem Kommentar versehen und du findest deine Hauptprocedure sofort:

Rücke doch einfach vernünftig ein?!

Sag das doch dem Furtbichler – er (und nicht ich) hatte angemerkt, daß man u.U. das Begin der Hauptprocedure nicht finden könne. Ich selbst hab damit keine Probleme, weshalb es auch vollkommen unnötig ist, mir hier subtil Unvernünftigkeit zu unterstellen. In diesem speziellen Fall ist es völlig wurscht: beides ist vernünftig, da es die Lesbarkeit fördert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 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-2025 by Thomas Breitkreuz