Ist "zu viele Parameter" ein visuelles oder ein logisches Problem?

8

nach Gibt es Richtlinien, wie viele Parameter eine Funktion übernehmen sollte? sollte eine Methode nicht zu viele Parameter haben. Einige Antworten deuten jedoch darauf hin, dass dieses Problem durch das Builder-Muster gelöst werden kann:

Builder b=new Builder();
b.setParm1("a");
b.setParm2("b");
.
.
.
Obj obj=b.createObj();

oder kapseln Sie Parameter in ein einzelnes Objekt.

ObjectParam op=new ObjectParam();
op.param1="a";
op.param2="b";
.
.
.
obj.f(op);

Ich bezweifle jedoch, dass dies das Problem löst, da ich denke, dass die Methoden zum einfachen Ausrichten der Parameter besser sind (dh von horizontal nach vertikal), aber es ändert nichts an der Art, dass die Aufgaben von zu vielen Parametern abhängen. Und wenn ich möchte, dass die Parameterkette besser aussieht, kann ich für jeden Parameter eine neue Zeile verwenden:

https://softwareengineering.stackexchange.com/a/331680/248528

Meine Frage ist also, ob "zu viele Parameter" ein visuelles Problem (schwer zu lesende lange einzelne Codezeile) oder ein logisches Problem sind (die Art der Aufgabe hängt von zu vielen Parametern ab und muss aufgeschlüsselt werden). Wenn es sich eher um ein visuelles Problem handelt, löst eine neue Zeile für jeden Parameter das Problem?

ocomfd
quelle
3
IMO zu viele Parameter sind eher ein Code-Geruch für ein logisches Problem. Zu viele Parameter bedeuten zu viele Abhängigkeiten => Die Methode führt möglicherweise zu viele Dinge aus. Natürlich gibt es Situationen, in denen zu viele Parameter aus SRP-Sicht in Ordnung sein können (z. B. Sie haben sich dafür entschieden, eine lange Liste von Parametern zu übergeben, anstatt eine Liste zu verwenden), aber auf andere Probleme hinweist (falsche Auswahl / Fehlen einer Datenstruktur) )
Potatopeelings

Antworten:

24

Es ist in erster Linie ein logisches Problem (das häufig auch mit visuellen Problemen einhergeht). Die falsche Lösung besteht darin, nur zu versuchen, das visuelle Problem durch zu verbessern

Kapselung von Parametern in einem einzelnen Objekt [...] Richten Sie die Parameter einfach besser aus (dh von horizontal nach vertikal).

Das Einkapseln von Parametern in ein Objekt bedeutet nicht, fünf Parameter in einen beliebigen Container mit einem bedeutungslosen Namen wie zu setzen ObjectParam. Stattdessen sollte das Einkapseln einer Gruppe von Parametern in ein Objekt eine neue Abstraktion erstellen (oder eine vorhandene wiederverwenden). Mögen

  • Einkapseln von drei Parametern "X, Y, Z" in eine Parameterposition vom Typ Point3Doder

  • Einkapselung der Parameter "startDate, endDate" in ein Objekt DateIntervaloder

  • Einkapseln von Parametern documentTitle, documentText, authorin ein Objekt Document, das diese Parameter zusammenfasst

Wenn die betreffende Methode viele nicht verwandte Parameter enthält, können Sie keinen guten Gruppierungsnamen finden, dann hat sie wahrscheinlich zu viele Parameter und zu viele Verantwortlichkeiten.

Doc Brown
quelle
6
Menschen versuchen auch, das visuelle Problem zu beheben, indem sie Funktionsparameter auf Klassenebene verschieben, wodurch es weniger überladen, aber weniger offensichtlich und mit derselben logischen Komplexität wird. Oder noch schlimmer: Verschieben Sie den Parameter in den globalen Status, da Sie ihn nicht weitergeben möchten. Es passiert ...
Chris Wohlert
@ChrisWohlert Ja, es gibt Leute, die glauben, dass das Befolgen vieler "Regeln" Ihren Code verbessert - weil sie nicht wissen, was sie tun. Kompetente Entwickler wissen, wann sie die Regeln besser ignorieren sollten, als Kludges zu erstellen, nur um der Regel zu folgen.
Ralf Kleberhoff
Eine Parameterliste und ein Parameter "Objekt" sind in Bezug auf die mentale Belastung und möglicherweise sogar die Syntax nahezu dasselbe. Das ist eine gute Antwort.
Frank Hileman
1

Eine Methode, die viele Parameter verwendet, ist im Wesentlichen ein Schritt in die entgegengesetzte Richtung zur Konvention gegenüber dem Konfigurationsansatz , bei dem es darum geht, solche Aufrufe zu vereinfachen, ohne die Fähigkeit zu verlieren, Werte nach Bedarf durch die Verwendung sinnvoller Standardeinstellungen zu ändern .

Mit anderen Worten, Sie möchten natürlich nicht an Flexibilität verlieren, müssen aber mit ziemlicher Sicherheit nicht jeden einzelnen Parameter dynamisch übergeben. Viele Parameter werden wahrscheinlich fest / statisch sein. Nehmen Sie als Beispiel ein Zip-Programm. Ja, vielleicht möchten Sie den Komprimierungsalgorithmus, die Komprimierungsstufe, die Anzahl der CPU-Kerne, die für die Aufgabe reserviert werden sollen, usw. ändern. Der Punkt ist, dass niemand jedes Mal, wenn Sie eine Zip-Datei erstellen müssen, alle diese Parameter angeben möchte, um einen Anruf effektiv zu reduzieren, indem das Nötigste bereitgestellt wird (dh der Name der Zip-Zieldatei, Dateien, die der Zip-Datei hinzugefügt werden sollen).

Die Gründe, warum Sie die Konvention anstelle des Konfigurationsansatzes verwenden würden, sind die gleichen, warum Sie keine Methoden haben sollten, die viele Parameter erfordern. Kurz gesagt, Einfachheit ist gut.

Neil
quelle