Wie viele Parameter sind zu viele? [geschlossen]


228

Routinen können Parameter haben, das sind keine Neuigkeiten. Sie können so viele Parameter definieren, wie Sie benötigen, aber zu viele davon erschweren das Verständnis und die Wartung Ihrer Routine.

Natürlich können Sie eine strukturierte Variable als Problemumgehung verwenden: Fügen Sie alle diese Variablen in eine einzige Struktur ein und übergeben Sie sie an die Routine. Tatsächlich ist die Verwendung von Strukturen zur Vereinfachung von Parameterlisten eine der Techniken, die Steve McConnell in Code Complete beschrieben hat . Aber wie er sagt:

Sorgfältige Programmierer vermeiden das Bündeln von Daten mehr als logisch notwendig.

Wenn Ihre Routine also zu viele Parameter enthält oder Sie eine Struktur verwenden, um eine große Parameterliste zu verschleiern, machen Sie wahrscheinlich etwas falsch. Das heißt, Sie halten die Kupplung nicht locker.

Meine Frage ist, wann ich eine Parameterliste als zu groß betrachten kann. Ich denke, dass mehr als 5 Parameter zu viele sind. Was denken Sie?


1
Gideon

5
In JavaScript 65537 sind die Parameter zu viele: jsfiddle.net/vhmgLkdm
Aadit M Shah

Schauen Sie sich nur die http-Komponenten von Apache an. Es ist fast unmöglich, daraus etwas Dynamisches zu bauen
Andrew Scott Evans

Antworten:


162

Wann wird etwas als so obszön angesehen, dass es trotz der Garantie der 1. Änderung der Redefreiheit reguliert werden kann? Laut Justice Potter Stewart "weiß ich es, wenn ich es sehe." Das gilt auch hier.

Ich hasse es, solche harten und schnellen Regeln zu erstellen, weil sich die Antwort nicht nur abhängig von der Größe und dem Umfang Ihres Projekts ändert, sondern ich denke, dass sie sich sogar bis auf Modulebene ändert. Abhängig davon, was Ihre Methode tut oder was die Klasse darstellen soll, ist es durchaus möglich, dass 2 Argumente zu viele sind und ein Symptom für zu viel Kopplung sind.

Ich würde vorschlagen, dass Sie all dies wirklich wissen, indem Sie die Frage an erster Stelle stellen und Ihre Frage genauso qualifizieren wie Sie. Die beste Lösung besteht darin, sich nicht auf eine feste Zahl zu verlassen, sondern sich stattdessen auf Entwurfsprüfungen und Codeprüfungen unter Ihren Kollegen zu konzentrieren, um Bereiche zu identifizieren, in denen Sie eine geringe Kohäsion und eine enge Kopplung aufweisen.

Haben Sie niemals Angst, Ihren Kollegen Ihre Arbeit zu zeigen. Wenn Sie Angst haben, ist dies wahrscheinlich das größere Zeichen dafür, dass etwas mit Ihrem Code nicht stimmt und dass Sie es bereits kennen .


Eine gute Faustregel ist die Anzahl der CPU-Register, da der Compiler diese nicht mehr auf dem Stapel zuordnen muss.
Michaelangel007

1
@ Michaelangel007 bezüglich der Antwort, die Sie kommentieren, sollten Sie das nicht sagen, da es sagt, dass es keine Regel gibt. Darüber hinaus ist die Anzahl der Parameter eine Frage der Lesbarkeit und nicht der Leistung.
Clemp6r

1
@ clemp6r Falsch - es ist beides . Compiler-Leute müssen sich die ganze Zeit mit "Register Spill" auseinandersetzen. Die einzig maßgebliche Antwort besteht darin, die Assembly zu überprüfen, die Ihr Compiler generiert. Die Anzahl der Register ändert sich auf derselben Plattform nicht auf magische Weise . en.wikipedia.org/wiki/Register_allocation
Michaelangel007

124

Eine Funktion kann nur zu viele Parameter haben, wenn einige der Parameter redundant sind. Wenn alle Parameter verwendet werden, muss die Funktion die richtige Anzahl von Parametern haben. Nehmen Sie diese häufig verwendete Funktion:

HWND CreateWindowEx
(
  DWORD dwExStyle,
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName,
  DWORD dwStyle,
  int x,
  int y,
  int nWidth,
  int nHeight,
  HWND hWndParent,
  HMENU hMenu,
  HINSTANCE hInstance,
  LPVOID lpParam
);

Das sind 12 Parameter (9, wenn Sie x, y, w und h als Rechteck bündeln) und es gibt auch die vom Klassennamen abgeleiteten Parameter. Wie würden Sie das reduzieren? Möchten Sie die Anzahl mehr auf den Punkt reduzieren?

Lassen Sie sich nicht von der Anzahl der Parameter stören, stellen Sie nur sicher, dass diese logisch und gut dokumentiert sind, und lassen Sie sich von Intellisense * helfen.

* Andere Codierungsassistenten sind verfügbar!


37
Ich stimme ab. Ich bin erstaunt über all die anderen Antworten mit "3" und "4"! Die richtige Antwort lautet: das notwendige Minimum, das manchmal einige sein kann.
Tony Andrews

16
Wenn diese Funktion heute entworfen würde, würde sie wahrscheinlich etwas anders aussehen. x, y, nWidth und nHeight können in einem Rectangle-Objekt gebündelt werden. style und xStyle können zu einer Reihe von Aufzählungen oder Zeichenfolgen kombiniert werden. Jetzt haben Sie nur noch 8 Parameter.
Finnw

16
@finnw Wenn diese Funktion heute entworfen wurde? Es wurde bereits neu gestaltet. Form f = neue Form (); hat 0 Parameter.
Nick

36
Das ist C und Winapi. Ich kann mir kein schlechteres Beispiel vorstellen.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

17
Nein, nein. Dies ist ein prozeduraler Stil. Windows sind Objekte, daher ist dies jetzt veraltet. Heute würde dies mit aggregierten Klassen gelöst, nicht mit einer Reihe von Parametern. Die intuitive Regel für gutes Design lautet: Wenn Sie die Funktion (einschließlich der Parameter) nicht in einem einfachen Satz beschreiben können, ist sie schlecht gestaltet . Ich glaube das ist der Fall.
Jan Turoň

106

In Clean Code widmete Robert C. Martin dem Thema vier Seiten. Hier ist das Wesentliche:

Die ideale Anzahl von Argumenten für eine Funktion ist Null (niladisch). Als nächstes kommt eins (monadisch), dicht gefolgt von zwei (dyadisch). Drei Argumente (triadisch) sollten nach Möglichkeit vermieden werden. Mehr als drei (polyadisch) erfordern eine ganz besondere Begründung - und sollten dann sowieso nicht verwendet werden.


2
Ich bezweifle, dass es "dies" enthält, weil dies der Kontext der Ausführung ist. In der funktionalen Programmierung ist der Kontext global und in oop ist der Kontext das Objekt, auf das Sie die Methode anwenden. Wenn Sie "dies" in die Parameterliste aufnehmen würden, wäre es unmöglich, 0 Parameter zu haben (ideal).
Tom

1
Nein, es enthält nicht "dies".
Patrick McElhaney

20
Außerdem sollte Martin mit dem C ++ - Standardkomitee sprechen. Die Hälfte von <Algorithmus> benötigt mehr als 3 Parameter, da nur ein Iteratorbereich bereits 2 ist. Es liegt in der Natur der Programmierung mit Iteratoren (dh generische Programmierung mit STL-Sammlungen).
Steve Jessop

3
@SteveJessop: Der Fehler von <algorithm> ist, dass es immer auf einem Slice funktioniert. Wenn Algorithmus und Sammlung neu gestaltet würden, würde ich dafür sorgen, dass Algorithmen immer eine ganze Sammlung einnehmen, und Sie könnten eine Ansicht einer Sammlung aufteilen, damit Algorithmen an Teilen arbeiten können. Alternativ würde ich auch eine Kurzüberschreibung definieren, um die Arbeit am allgemeinen Fall zu vereinfachen.
Lie Ryan

3
@LieRyan: Wenn ich es neu gestalten <algorithm>würde, würde es auf ein Bereichsobjekt wirken. Sammlungen wären Bereiche, aber nicht alle Bereiche wären Sammlungen. Und tatsächlich hat Boost das bereits getan. Mein Punkt ist jedenfalls, dass eine massiv genutzte Bibliothek diesen Rat ignoriert. Das Schlimmste, was Ihnen garantiert passiert, wenn Sie dies auch tun, ist, dass viele Ihrer Millionen Benutzer mit geringfügigen Vereinfachungen an Ihrer Benutzeroberfläche basteln ;-)
Steve Jessop

79

Einige Codes, mit denen ich in der Vergangenheit gearbeitet habe, verwendeten globale Variablen, um zu vermeiden, dass zu viele Parameter weitergegeben werden.

Bitte tu das nicht!

(Normalerweise.)


Ein Code, an dem ich gearbeitet habe, verwendete Klassenmitglieder, um dasselbe zu erreichen. Zu dieser Zeit war ich ein C-Programmierer und fragte, warum es so viele globale Variablen gibt, warum Ein- / Ausgänge keine expliziten Parameter sein können.
user3528438

38

Wenn Sie anfangen müssen, die Parameter in der Signatur mental abzuzählen und sie dem Anruf zuzuordnen, ist es Zeit für eine Umgestaltung!


Das ist eine sehr gute Antwort. Wenn die Parameter logisch organisiert sind (x, y, w, h), können Sie sich leicht alle in der richtigen Reihenfolge merken. Es ist schwieriger zu merken, wo der FILE-Zeiger in putc platziert werden soll (der nur zwei Parameter hat), zumal fprintf das Gegenteil ist.
user877329

Schönste Antwort. Sehr gut gesagt
Anwar

31

Vielen Dank für all Ihre Antworten:

  • Es war ein bisschen überraschend, Leute zu finden, die (wie ich) auch denken, dass 5 Parameter eine gute Grenze für die Vernunft des Codes sind.

  • Im Allgemeinen sind sich die Leute einig, dass ein Grenzwert zwischen 3 und 4 eine gute Faustregel ist. Dies ist vernünftig, da Menschen normalerweise eine schlechte Zeit haben, mehr als 4 Dinge zu zählen.

  • Wie Milan betont , können Menschen im Durchschnitt mehr oder weniger 7 Dinge gleichzeitig im Kopf behalten. Aber ich denke, dass Sie nicht vergessen können, dass Sie beim Entwerfen / Verwalten / Studieren einer Routine mehr Dinge als nur die Parameter berücksichtigen müssen.

  • Einige Leute denken, dass eine Routine so viele Argumente haben sollte, wie sie braucht. Ich stimme zu, aber nur für einige spezielle Fälle (Aufrufe von OS-APIs, Routinen, bei denen die Optimierung wichtig ist usw.). Ich schlage vor, die Komplexität dieser Routinen zu verbergen, indem Sie nach Möglichkeit eine Abstraktionsebene direkt über diesen Aufrufen hinzufügen.

  • Nick hat einige interessante Gedanken dazu. Wenn Sie seine Kommentare nicht lesen möchten, fasse ich für Sie zusammen: Kurz gesagt, es kommt darauf an :

    Ich hasse es, solche harten und schnellen Regeln zu erstellen, weil sich die Antwort nicht nur abhängig von der Größe und dem Umfang Ihres Projekts ändert, sondern ich denke, dass sie sich sogar bis auf Modulebene ändert. Abhängig davon, was Ihre Methode tut oder was die Klasse darstellen soll, ist es durchaus möglich, dass 2 Argumente zu viele sind und ein Symptom für zu viel Kopplung sind.

    Die Moral hier ist, keine Angst davor zu haben, Ihren Kollegen Ihren Code zu zeigen, mit ihnen zu diskutieren und zu versuchen, "Bereiche zu identifizieren, in denen Sie einen geringen Zusammenhalt und eine enge Kopplung haben" .

  • Schließlich denke ich, dass wnoise Nick sehr zustimmt und schließt seinen satirischen Beitrag mit dieser poetischen Vision (siehe Kommentare unten) der Programmierkunst ab:

    Programmierung ist kein Engineering. Die Organisation von Code ist eine Kunst, weil sie von menschlichen Faktoren abhängt, die für eine harte Regel zu stark vom Kontext abhängen.


16

Diese Antwort setzt eine OO-Sprache voraus. Wenn Sie keine verwenden, überspringen Sie diese Antwort (mit anderen Worten, dies ist keine sprachunabhängige Antwort.

Wenn Sie mehr als 3 Parameter übergeben (insbesondere intrinsische Typen / Objekte), ist es nicht so, dass es "zu viele" sind, sondern dass Sie möglicherweise die Chance verpassen, ein neues Objekt zu erstellen.

Suchen Sie nach Gruppen von Parametern, die an mehr als eine Methode übergeben werden. Selbst eine Gruppe, die an zwei Methoden übergeben wird, garantiert fast, dass Sie dort ein neues Objekt haben sollten.

Dann überarbeiten Sie die Funktionalität Ihres neuen Objekts und würden nicht glauben, wie sehr dies sowohl Ihrem Code als auch Ihrem Verständnis der OO-Programmierung hilft.


Bitte nennen Sie eine Sprache, die weder Routinen noch Parameter verwendet. Ich kann mir keine vorstellen, selbst bei der Montage könnte man Routinen (Beschriftungen) haben.
Auron

x86-Assembly hat definitiv Routinen (Call / Return). Andere erfordern möglicherweise cmp / jmp-Kombinationen.
Brian Knoblauch

Entschuldigung, "ret", nicht "return". Seufzt. Es war schon ein langer Tag.
Brian Knoblauch

Tut mir leid wegen der mehrdeutigen Formulierung Auron, ich glaube, ich habe es behoben. Es war meine Antwort, die sprachspezifisch war, nicht die Frage.
Bill K

1
Nicht alle Sprachen erlauben das Übergeben von Strukturen. Das Übergeben einer Struktur bedeutet auch, dass die Empfangsmethode den Code haben muss, um die Struktur zu handhaben, und daher möglicherweise mehr Parameter benötigt. Außerdem benötigen Sie in einer Nicht-OO-Sprache im Allgemeinen einen zusätzlichen Parameter - alle OO-Sprachen haben einen "Hidden" -Parameter von "this", der ansonsten übergeben werden sollte (oder in einer schrecklicheren Sprache / einem schrecklicheren Design global sein könnte zugänglich)
Bill K

13

Es scheint, als gäbe es andere Überlegungen als nur Zahlen. Hier sind einige, die mir in den Sinn kommen:

  1. logische Beziehung zum Hauptzweck der Funktion im Vergleich zu einmaligen Einstellungen

  2. Wenn es sich nur um Umgebungsflags handelt, kann die Bündelung sehr praktisch sein


12

In einem der bekannten Programmierepigramme von Alan Perlis (in ACM SIGPLAN Notices 17 (9), September 1982) heißt es: "Wenn Sie eine Prozedur mit 10 Parametern haben, haben Sie wahrscheinlich einige verpasst."



9

Wenn die Liste in meiner IDE eine Zeile überschreitet, ist für mich ein Parameter zu viel. Ich möchte alle Parameter in einer Zeile sehen, ohne den Augenkontakt zu unterbrechen. Aber das ist nur meine persönliche Präferenz.


Dies ist gut, bis Sie mit einigen Entwicklern foo versuchen würden (int a, float b, string c, double d). Versuchen Sie am besten zu vermeiden, mit ihnen zu arbeiten, denke ich. : D
Rontologist

4
Wenn jemand anderes Klassen lächerlich lange Namen gegeben hat, würde ich nicht zulassen, dass dies die Definition oder den Aufruf meiner Routinen beeinflusst.
Finnw

9
Darf ich Ihnen den "Wagenrücklauf" vorstellen?

3
Wenn die Liste eine Zeile in Ihrer IDE überschreitet, ist Ihr Monitor zu klein, um ihn mit diesem Code zu verwenden, und Sie sollten eindeutig einen Monitor mit einer höheren horizontalen Auflösung kaufen. Ein Zeilenumbruch oder eine Reduzierung der Anzahl der Parameter sind nur Problemumgehungen, die das Grundproblem nicht lösen: Ihr Monitor ist zu klein für diese Codebasis!
Kaiserludi

9

Ich stimme im Allgemeinen mit 5 überein. Wenn es jedoch eine Situation gibt, in der ich mehr brauche und es der klarste Weg ist, das Problem zu lösen, würde ich mehr verwenden.


8

Sieben Dinge im Kurzzeitgedächtnis?

  1. Name der Funktion
  2. Rückgabewert der Funktion
  3. Zweck der Funktion
  4. Parameter 1
  5. Parameter 2
  6. Parameter 3
  7. Parameter 4

Gut. Es ist eine Faustregel. Wenn Sie den Hauptteil einer Funktion codieren, ist Ihnen ihr Name egal, und der Rückgabewert und ihre Bedeutung hängen eng zusammen.
Auron

7
8. Reihenfolge der Parameter
Eva

7

In Worst 5 Code Snippets , überprüfen Sie die zweite : „Ist das ein Konstruktor“. Es hat wie über 37 ⋅ 4 ≈ 150 Parameter:

Hier hat ein Programmierer diesen Konstruktor geschrieben [...] Einige von Ihnen denken vielleicht, dass es ein großer Konstruktor ist, aber er hat Eclipse-Tools zur automatischen Codegenerierung verwendet. [.] NOO, in diesem Konstruktor gab es einen winzigen Fehler, den ich entdeckt habe und der mich dazu gebracht hat schlussfolgern, dass dieser Konstruktor von Hand geschrieben wurde. (Übrigens ist dies nur der obere Teil des Konstruktors, er ist nicht vollständig).

Konstruktor mit über 150 Parametern


Das ist so traurig ... Nicht über "Datensätze" oder "Strukturen" oder "Wertobjekte" Bescheid zu wissen, die mehrere Werte bündeln und ihnen einen gemeinsamen Namen geben, damit Sie viele von ihnen auf lesbare Weise hierarchisch darstellen können, ist wie herumlaufen mit Schuhen, die seit Jahren nicht mehr geschnürt sind, weil dir noch nie jemand gesagt hat, dass du das überhaupt machen kannst 🙈
yeoman

6

Eins mehr als nötig. Ich will nicht glib sein, aber es gibt einige Funktionen, die notwendigerweise einige Optionen benötigen. Beispielsweise:

void *
mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t offset);

Es gibt 6 Argumente, von denen jedes wesentlich ist. Darüber hinaus gibt es keine gemeinsame Verbindung zwischen ihnen, um eine Bündelung zu rechtfertigen. Vielleicht könnten Sie "struct mmapargs" definieren, aber das wäre schlimmer.


Nun, protund flagshätte zusammengerollt werden können, wenn der Designer der Meinung wäre, dass 5 irgendwie eine magische Zahl ist, die viel besser als 6 ist. Ein bisschen wie die Art und Weise, wie opender Lese- / Schreibmodus mit allen anderen verschiedenen Flags kombiniert wird. Und vielleicht könnten Sie es loswerden, offsetindem Sie angeben, dass der zugeordnete Abschnitt an der aktuellen Suchposition von beginnt filedes. Ich weiß nicht, ob es Situationen gibt, in denen Sie mmapeine Region erreichen können, zu der Sie nicht in der Lage sind lseek, aber wenn nicht, ist dies nicht unbedingt erforderlich.
Steve Jessop

Ich denke, dies mmapist ein gutes Beispiel dafür, dass einige Designer und Benutzer eine lange Liste von Parametern bevorzugen, während andere es vorziehen, einige Schritte durchzugehen, um eine kleinere Anzahl von Parametern vorzubereiten, bevor sie den Anruf tätigen.
Steve Jessop

1
@Steve: Das vorherige Festlegen der Suchposition mit einem separaten Anruf hätte zu einer unbegründeten Rennbedingung geführt. Bei einigen APIs (OpenGL) gibt es so viele Parameter, die sich auf einen Aufruf auswirken, dass Sie den Status wirklich verwenden müssen. Normalerweise sollte jedoch jeder Aufruf so weit wie möglich für sich allein stehen. Fernwirkung ist der Weg zur dunklen Seite.
Ben Voigt

5

Laut Perl Best Practices ist 3 in Ordnung, 4 ist zu viel. Es ist nur eine Richtlinie, aber in unserem Shop versuchen wir, uns daran zu halten.


5

Ich würde die Grenze für öffentliche Funktionen selbst auf 5 Parameter ziehen.

Meiner Meinung nach sind lange Parameterlisten nur in privaten / lokalen Hilfsfunktionen zulässig, die nur an bestimmten Stellen im Code aufgerufen werden sollen. In diesen Fällen müssen Sie möglicherweise viele Statusinformationen weitergeben, aber die Lesbarkeit ist nicht so wichtig, da nur Sie (oder jemand, der Ihren Code verwaltet und die Grundlagen Ihres Moduls verstehen sollte) sich darum kümmern müssen Aufruf dieser Funktion.


Was genau der Grund ist, warum viele Leute an diesem Punkt alles machen würden, was kein tatsächliches Argument ist, sondern ein Zustand, der herumgetragen wird, nur der Zustand eines Objekts in Form von Feldern (Mitgliedsvariablen). Dieses Objekt würde als Klasse dargestellt. Es würde entweder einmal oder für jede Verwendung instanziiert. Manchmal hat ein solches Objekt nur eine private oder öffentliche Paketmethode, die dann die Arbeit mit jeweils wenigen Argumenten an private Methoden delegiert. Nur wenige Argumente sind jetzt möglich, da Konfiguration und Status jetzt einen richtigen Platz haben :)
yeoman

5

Eine verwandte Frage, die Sie berücksichtigen sollten, ist, wie kohärent die Routine ist. Eine große Anzahl von Parametern kann ein Geruch sein, der Ihnen sagt, dass die Routine selbst versucht, zu viel zu tun, und daher ist der Zusammenhalt verdächtig. Ich stimme zu, dass eine feste und schnelle Anzahl von Parametern wahrscheinlich unmöglich ist, aber ich würde vermuten, dass eine Routine mit hoher Kohäsion eine geringe Anzahl von Parametern implizieren würde.



4

Ich halte als allgemeine Faustregel bei drei Parametern an. Mehr und es ist Zeit, stattdessen ein Array von Parametern oder ein Konfigurationsobjekt zu übergeben, wodurch auch zukünftige Parameter hinzugefügt werden können, ohne die API zu ändern.


Wenn sich die API ändert, sollte sich die API tatsächlich ändern, nicht nur eine Stealth-Änderung, bei der die Inkompatibilität möglicherweise noch auftritt, sondern auch weniger offensichtlich sein.
wnoise

Wenn Sie jedoch einen weiteren Parameter zum Konfigurieren eines Edge-Falls benötigen, sollte dieser nicht mithilfe der API an nicht verwandte Komponenten weitergegeben werden
Eran Galperin

4

Eine Längenbeschränkung für eine Parameterliste ist nur eine weitere Einschränkung. Und Einschränkung bedeutet angewandte Gewalt. Es klingt lustig, aber Sie können auch beim Programmieren gewaltfrei sein. Lassen Sie einfach den Code die Regeln diktieren. Es ist offensichtlich, dass bei vielen Parametern der Hauptteil der Funktions- / Klassenmethode groß genug ist, um diese zu verwenden. Und große Codefragmente können normalerweise überarbeitet und in kleinere Teile aufgeteilt werden. Sie erhalten also eine Lösung gegen viele Parameter als kostenlosen Bonus, da diese auf die kleineren überarbeiteten Codeteile aufgeteilt werden.


4

Eine Sache, die ich aus Sicht der Leistung hervorheben möchte, ist, dass abhängig davon, wie Sie Parameter an eine Methode übergeben, das Übergeben vieler Parameter nach Wert das Programm verlangsamt, da jeder Parameter kopiert und dann auf den Stapel gelegt werden muss.

Die Verwendung einer einzelnen Klasse zur Erfassung aller Parameter würde besser funktionieren, da ein einzelner Parameter, der als Referenz übergeben wird, elegant und sauberer und schneller wäre!


Ich gebe dieser Antwort eine +1, weil sie die einzige ist, die etwas anderes als Code-Sauberkeit oder willkürliche Grenzen behandelt, die beide subjektiv sind. Einige Leute denken möglicherweise nicht darüber nach, was Sie mit dem Stapel tun, wenn Sie sich in einer Schleife befinden und Dutzende von Argumenten auf den Stapel schieben. Wenn es sich um eine Schleife handelt, sollten Sie die Anzahl der Argumente berücksichtigen, die von REGISTERS in dem ABI übergeben werden, für das Sie kompilieren. In der MS x64-ABI werden beispielsweise maximal 4 Argumente durch die Register geleitet. Die ABI "System V" (von Nicht-Windows-Betriebssystemen verwendet) verwendet mehr Register, sodass die Verwendung von 4 Argumenten ziemlich portabel ist
Lakey,

3

Meiner Meinung nach könnte es Fälle geben, in denen Sie 4 oder eine feste Anzahl überschreiten. Dinge, auf die man achten sollte, könnten sein

  1. Ihre Methode macht zu viel und Sie müssen umgestalten.
  2. Möglicherweise möchten Sie eine Sammlung oder eine Datenstruktur verwenden.
  3. Überdenken Sie Ihr Klassendesign, vielleicht müssen einige Dinge nicht weitergegeben werden.

Unter dem Gesichtspunkt der Benutzerfreundlichkeit oder des Lesens von Code denke ich, wenn Sie Ihre Methodensignatur irgendwie "umbrechen" müssen, sollten Sie innehalten und nachdenken, es sei denn, Sie fühlen sich hilflos und alle Bemühungen, die Signatur kleiner zu machen, führen dazu kein Ergebnis. Einige sehr gute Bibliotheken in Vergangenheit und Gegenwart verwenden mehr als 4-5 Kinderwagen.


3

Meine Faustregel lautet, dass ich mich lange genug an die Parameter erinnern muss, um einen Anruf zu betrachten und zu sagen, was er tut. Wenn ich mir also die Methode nicht ansehen und dann zu einem Aufruf einer Methode wechseln kann und mich daran erinnere, welcher Parameter was tut, gibt es zu viele.

Für mich entspricht das ungefähr 5, aber ich bin nicht so klug. Ihr Kilometerstand kann variieren.

Sie können ein Objekt mit Eigenschaften erstellen, die die Parameter enthalten, und diese übergeben, wenn Sie den von Ihnen festgelegten Grenzwert überschreiten. Siehe Martin Fowlers Refactoring- Buch und das Kapitel über die Vereinfachung von Methodenaufrufen.


1

Dies hängt stark von der Umgebung ab, in der Sie arbeiten. Nehmen Sie zum Beispiel Javascript. In Javascript können Sie Parameter am besten mit Objekten mit Schlüssel / Wert-Paaren übergeben. In der Praxis bedeutet dies, dass Sie nur einen Parameter haben. In anderen Systemen liegt der Sweet Spot bei drei oder vier.

Am Ende läuft alles auf den persönlichen Geschmack hinaus.


1

Ich bin damit einverstanden, dass 3 in Ordnung ist, 4 ist zu viel als Richtlinie. Mit mehr als 3 Parametern erledigen Sie zwangsläufig mehr als eine Aufgabe. Mehr als eine Aufgabe sollte in separate Methoden aufgeteilt werden.

Wenn ich mir jedoch das neueste Projekt anschaue, an dem ich gearbeitet habe, gibt es viele Ausnahmen und in den meisten Fällen ist es schwierig, drei Parameter zu ermitteln.


1

Wenn ich 7-10 Parameter in einer Routine habe , möchte ich sie in einer neuen Klasse bündeln, aber nicht, wenn diese Klasse nichts anderes als eine Reihe von Feldern mit Gettern und Setzern wäre - die neue Klasse muss etwas anderes tun , als Werte in und zu mischen aus. Ansonsten würde ich mich lieber mit der langen Parameterliste abfinden.


1
Ich werde es mit einer Nur-Daten-Klasse bündeln, wenn es an mehr als einer Stelle verwendet wird, aber selbst dann erstelle ich normalerweise beide Konstruktoren.
Leahn Novash

1

Es ist eine bekannte Tatsache, dass Menschen im Durchschnitt 7 +/- 2 Dinge gleichzeitig im Kopf behalten können. Ich verwende dieses Prinzip gerne mit Parametern. Unter der Annahme, dass Programmierer alle überdurchschnittlich intelligente Menschen sind, würde ich sagen, dass alles, was 10+ ist, zu viel ist.

Übrigens, wenn Parameter in irgendeiner Weise ähnlich sind, würde ich sie eher in einen Vektor oder eine Liste als in eine Struktur oder Klasse einfügen.


1

Ich würde meine Antwort darauf stützen, wie oft die Funktion aufgerufen wird.

Wenn es sich um eine Init-Funktion handelt, die immer nur einmal aufgerufen wird, sollten 10 oder mehr Parameter benötigt werden, wen interessiert das?

Wenn es ein paar Mal pro Frame aufgerufen wird, neige ich dazu, eine Struktur zu erstellen und nur einen Zeiger darauf zu übergeben, da dies tendenziell schneller ist (vorausgesetzt, Sie erstellen die Struktur nicht jedes Mal neu).


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.