5 Stimmen

Bewährte Verfahren für die Anzahl der Argumente für Unterprogramme in C

Ich habe vor kurzem begonnen, an der Entwicklung von in C geschriebenen APIs zu arbeiten. Ich sehe einige Unterprogramme, die 8(Acht) Parameter erwarten, und für mich sieht es hässlich und umständlich aus, 8 Parameter zu übergeben, während ich dieses bestimmte Unterprogramm aufrufe. Ich habe mich gefragt, ob es nicht eine akzeptablere und sauberere Methode geben könnte.

6voto

Joey Punkte 329386

Wenn sich mehrere Argumente logisch zusammenfassen lassen, können Sie eine Struktur erstellen, die sie enthält, und diese Struktur einfach als Argument übergeben. Zum Beispiel anstatt zwei Koordinatenwerte zu übergeben x et y könnten Sie eine POINT stattdessen eine Struktur.

Aber wenn eine solche Gruppierung nicht anwendbar ist, dann sollte jede Anzahl von Argumenten in Ordnung sein, wenn Sie sie wirklich brauchen, obwohl es ein Zeichen dafür sein könnte, dass Ihre Funktion ein wenig zu viel tut und dass Sie die Arbeit auf mehrere, aber kleinere Funktionen verteilen könnten.

5voto

Brian Hooper Punkte 21040

Eine große Anzahl von Argumenten in einem Funktionsaufruf zeigt in der Regel ein Designproblem auf. Es gibt Möglichkeiten, die Anzahl der Parameter zu reduzieren, z.B. durch die Erstellung von Strukturen, die anstelle von einzelnen Variablen übergeben werden, oder durch globale Variablen. Ich würde empfehlen, beides NICHT zu tun und sich um das Design zu kümmern. Es gibt keine schnelle oder einfache Lösung, aber die Leute, die den Code warten müssen, werden Ihnen dafür danken.

4voto

T.E.D. Punkte 42630

Ja, 8 ist mit Sicherheit zu viel.

Hier ein paar Begriffe aus der Softwaretechnik der alten Schule für Sie. Kohäsion und Kopplung. Kohäsion ist, wie gut ein Unterprogramm allein zusammenhält, und Kupplung ist, wie sauber die Schnittstellen zwischen Ihren Routinen sind (oder wie autark Ihre Routinen sind).

Bei Kupplungen gilt im Allgemeinen: je lockerer, desto besser. Eine Kopplung nur über Parameter ("Datenkopplung") ist eine gute niedrige Kopplung, während die Verwendung globaler Variablen ("allgemeine Kopplung") eine sehr hohe Kopplung bedeutet. Bei einer hohen Anzahl von Parametern hat man in der Regel versucht, die gemeinsame Kopplung mit einem dünnen Furnier aus Datenkopplung zu verbergen. Das ist schlechtes Design mit einem Anstrich.

Bei der Kohäsion gilt: je höher (kohäsiver), desto besser. Jede Routine, die acht verschiedene Dinge modifiziert, leidet mit ziemlicher Sicherheit unter geringer Kohäsion. Ich müsste den Code sehen, um sicher zu sein, aber ich würde darauf wetten, dass es sehr schwierig wäre, in einem kurzen Satz klar zu erklären, was diese Routine tut. Aus dem Stegreif würde ich vermuten, dass sie zeitlich kohäsiv ist (nur eine Reihe von Dingen, die ungefähr zur gleichen Zeit erledigt werden müssen).

2voto

Randy Punkte 16242

8 könnte eine richtige Zahl sein. oder es könnte sein, dass viele dieser 8 sollten alle gehören zu einer richtigen Klasse als Mitglieder, dann könnten Sie eine einzelne Instanz der Klasse übergeben... schwer zu sagen, nur durch diese Art von High-Level-Diskussion.

edit: in c - Klassen wären in diesem Fall ähnlich zu Strukturen.

1voto

Paolo Perego Punkte 383

Ich schlage auch die Verwendung von Strukturen vor. Vielleicht sollten Sie das Design Ihrer APIs überdenken.

Denken Sie daran, dass Ihre APIs von Entwicklern verwendet werden, und es wäre schwierig, einen Funktionsaufruf mit 8 Parametern zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X