Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Offenes Array oder Set als Parameter (https://www.delphipraxis.net/189009-offenes-array-oder-set-als-parameter.html)

Schwedenbitter 26. Apr 2016 09:52

Offenes Array oder Set als Parameter
 
Hallo,

mein Programm scannt Seiten ein und filtert die leeren Seiten aus. Das erledige ich über das Zählen der Pixel <> weiß und es funktioniert ziemlich gut. Leider gibt es (zumeist) Behörden, die ärgern mich damit, dass sie auch leere Seite mit Strich- oder Barcodes versehen. Diese sind aber glücklicher Weise immer an denselben Stellen.
Mein Plan ist nun, vor dem Zählen der farbigen Pixel einfach ein bzw. mehrere weiße Vierecke über diese Codes zu legen. Dazu muss ich aber meiner Funktion sagen, an welcher bzw. welchen Stellen das geschehen soll. Und da ist mein Knoten in der Rübe.

Wie übergebe ich der Funktion 1, 2 oder mehr Records aus 4 Integer?
Und - falls Set das beste wäre - wie prüft man das durch (beim Array ist mir das klar
Delphi-Quellcode:
For I:= Low(Arr) To High(Arr)
)?

Ich bin natürlich bereit, mich einzulesen, wenn mir jemand eine Fundstelle für einen Einstieg zur Suche liefern kann.

Gruß, Alex

Der schöne Günther 26. Apr 2016 10:03

AW: Offenes Array oder Set als Parameter
 
Ich verstehe nicht wo hier auf einmal ein "Set" ins Spiel kommt. Ein Set ist eine Menge von mehreren Enumerationstypen von denen jedes Vorkommen ein- oder keinmal enthalten sein darf.

Beispiel:
Delphi-Quellcode:
type
   TGeschmack = (sauer, süß, bitter, salzig);
   TGeschmäcker = set of TGeschmack;
var
   chipsGeschmack:      TGeschmäcker;
   tofuGeschmack:      TGeschmäcker;
   zitronenGeschmack:   TGeschmäcker;
begin
   chipsGeschmack := [salzig];
   tofuGeschmack := [];
   zitronenGeschmack := [süß, bitter];
end;
Du sprichst selber von "1, 2 oder mehr Records". Das ist ganz klar ein Array (oder eine Liste oder ein anderer Mengentyp).

Delphi-Quellcode:
procedure bearbeiteKram(bildDaten: TPicture; außerDiesenBereichen: array of TRect);
begin
   //
end;

Oder ich habe wieder mal etwas völlig falsch verstanden...

Sir Rufo 26. Apr 2016 10:42

AW: Offenes Array oder Set als Parameter
 
Übergebe die zusätzlichen Argumente in einer Klasse:
Delphi-Quellcode:
TProcessArgs = class
 ...
end;

procedure Process( aFoo: TFoo; aProcessArgs: TProcessArgs );
begin
  //
end;
Das macht mehr Sinn im Hinblick auf zukünftige Erweiterungen. Der Methodenaufruf bleibt immer gleich und trotzdem kannst du intern alles ändern.

Schwedenbitter 26. Apr 2016 13:39

AW: Offenes Array oder Set als Parameter
 
Danke erstmal für die Antworten und Ideen!

Zitat:

Zitat von Der schöne Günther (Beitrag 1336639)
Ich verstehe nicht wo hier auf einmal ein "Set" ins Spiel kommt. Ein Set ist eine Menge von mehreren Enumerationstypen von denen jedes Vorkommen ein- oder keinmal enthalten sein darf.

genau.

Ich stelle mir das in etwa so vor (=Brainstorming, kein Code) und komme deshalb auf Set:
Delphi-Quellcode:
Const
   DRV        : TRect = ( Left:0; Top:0; Right:20; Bottom:20);
   Knappschaft : TRect = ( Left:20; Top:20; Right:40; Bottom:40);
   // usw. die Positionen bleiben immer gleich
Type
   TBlankPos = (DRV, Knappschaft, ...);
   TBlank   = Set Of TBlankPos;

Function IsEmpty(Image: TBitmap; BarCodes: TBlank): Boolean; // Kopf sehr verkürzt
Begin
   // mache etwas ...
End;

Procedure TForm1.Bildkommtan(Image: TBitmap);
Begin
   If IsEmpty(Image, [DRV]) Then ShowMessage('Leeres Bild')
   Else ShowMessage('Bild mit Inhalt');
End;
Ein Array wäre für mich denkbar (sonst stünde es nicht in der Überschrift), aber vermutlich eher die Notlösung. Denn ich müsste die Länge festlegen, es mit Daten bestücken etc. Ich fände das als Konstante besser lesbar. Mir geht es aber eben auch hauptsächlich darum, es von vorn herein erweiterbar zu gestalten.

Der schöne Günther 26. Apr 2016 15:38

AW: Offenes Array oder Set als Parameter
 
Erweiterbar ist genau das was Rufo vorgeschlagen hat (wobei ich einen Record als typisches POD und keine Klasse genommen hätte)*. Packe die Daten die deine Methode zum Arbeiten braucht in eine Struktur und übergib sie ihr. Braucht die Methode eines Tages mehr Daten, passt du nur diese Klasse/Record an und nicht alle hundert Aufrufe im Programm.

Das mit dem Set habe ich jetzt war verstanden, finde es trotzdem nicht gut. Jedes mal wenn etwas neues hinzu kommt musst du deinen TBlankPos-Typ anfassen.
Packst du diese Absolutwerte für ein TRect wirklich direkt in den Quellcode? Ich finde, dadurch gewinnt man nicht viel. Wenn du es zur Laufzeit machst kann dein Benutzer das z.B. auch aus einer selbst anpassbaren Datei laden und muss dich nicht jedes mal nerven wenn er es ändern will.


* Irgendeine Berühmtheit hat mal gesagt zwei Methodenparameter gehen grade noch, drei seien zu viel (Ich glaube es war Martin Fowler).

mjustin 26. Apr 2016 15:42

AW: Offenes Array oder Set als Parameter
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1336706)
* Irgendeine Berühmtheit hat mal gesagt zwei Methodenparameter gehen grade noch, drei seien zu viel (Ich glaube es war Martin Fowler).

Martin C. Fowler, "Clean Code", S. 73:
Zitat:

Funktionen, die drei Argumente übernehmen, sind erheblich schwerer zu verstehen als Dyaden. Die Probleme (...) werden mehr als verdoppelt.
Und auf Seite 74 werden die von Sir Rufo vorgeschlagenen "Argument Objekte" beschrieben. Sie sind keine Schummelei :)

TRomano 26. Apr 2016 17:52

AW: Offenes Array oder Set als Parameter
 
Ich bekomme immer wieder bei Refactoring das Grausen, wenn ich functions/procedures mit 15-20 Parametern sehe und diese in den Sourcen eines Projektes auch hunderte Male aufgerufen werden. Das ist eine Orgie, wenn mal ein Parameter geändert/zugefügt/gelöscht wird ...
Ich bevorzuge auch records als Parameter, wenn es mehr als drei Parameter werden sollen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz