Wie mit vielen Funktionparametern umgehen?
-
Pikkolini schrieb:
Hallo,
in meinem momentanen Projekt habe ich eine Funktion, welche momentan ca. 15 Funktionsparameter braucht, es aber auch mehr werden können. Nun will aber eine ewig lange Parameterliste vermeiden, und habe mir gedacht, ich könnte ein struct machen, in wessen Konstruktor ich die Funktionsparameter reinschreibe.Und welchen Sinn sollte das haben? Du verlagerst nur die "ewig lange Parameterliste" von deiner Funktion in den Konstruktor von MyData, außerdem mußt du die Werte öfter hin und her kopieren.
-
HighLigerBiMBam schrieb:
Ich sehe keinen Fehler, mein Compiler nimmt das btw. In C++ ist struct auch nur eine public class.
Kompilieren und Funktionieren tuts ja, jedoch spuckt der Compiler immer eine Warnung aus, was mich daran zweifeln lässt.
CStoll schrieb:
Und welchen Sinn sollte das haben?
Der Code wird übersichtlicher.
-
Eventuell liegt das an:
b(a)weil int b nicht verwendet wird, oder daran , dass data in der Funktion nicht verwendet wird. /Wall wirft dir halt alles als Warnung.
-
Also ich halte das bei sehr viele Parametern für eine sinnvolle Lösung, man kann das Parameterstruct ja als Referenz übergeben, dann entfällt das kopieren.
-
HighLigerBiMBam schrieb:
Eventuell liegt das an:
b(a)weil int b nicht verwendet wird, oder daran , dass data in der Funktion nicht verwendet wird. /Wall wirft dir halt alles als Warnung.
Das b(a) ist nur ein Tippfehler, war ja nur ein Minimalbeispiel.
Und als Warnungsstufe habe ich nur /4 drin, da bei /Wall auch ein haufen Warnungen wegen der WinAPI und der STL Header fliegen...
-
Ein vernünftig strukturiertes Interface macht schon aus organisatorischen Gründen eine Menge Sinn. Ganz konkret gibt es außerdem bei manchen Compilern Probleme mit überlangen Parameterlisten - beispielsweise frisst std::tr1::bind in MSVC 2008 höchstens zehn Parameter.
Ansonsten sollte der Code, so wie er da steht, funktionieren. Hast du vielleicht ein & unterschlagen?
-
Pikkolini schrieb:
CStoll schrieb:
Und welchen Sinn sollte das haben?
Der Code wird übersichtlicher.
Also ich finde, daß
MyFunction(47,11);übersichtlicher aussieht als
MyFunction(MyData(47,11));. Aber das könnte man natürlich als Ansichtssache betrachten.
(nur am Rande: Über wieviele PArameter am Stück reden wir hier eigentlich?)
-
Warum nicht:
MyData data; data.myblub = 1; data.bla = 2; data.test = "hallo"; MyClass(data);
-
CStoll schrieb:
(nur am Rande: Über wieviele PArameter am Stück reden wir hier eigentlich?)
Wie im Anfangspost beschrieben 15+
theliquidwave schrieb:
Warum nicht:
MyData data; data.myblub = 1; data.bla = 2; data.test = "hallo"; MyClass(data);Mach das mal mit 15+ Parametern für zehn Funktionsaufrufe...
Die Warnung tritt jedoch nur auf, wenn ich etwas dereferenziere, und da mit Referenzen das kopieren auch erspart wird, lasse ich es jetzt einfach so.
-
Normalerweise hat man auch nicht 15 völlig unabhängige Variablen, sondern die Variablen sind in einem bestimmten Bezug zueinander, werden gemeinsam erzeugt, verändert etc. Dann kann man sie auch gemeinsam in ein struct packen. Funktionen mit mehr als 3 Argumenten kann man meistens übersichtlicher gestalten, mehr als ~5 sollten eigentlich nie nötig sein. (Und dabei gehts nicht darum die Argumentzahl nur künstlich zu verringern)
-
Und Außerdem kann man da mit mehreren Konstruktoren und ggf. Default-Werten sicherlich was schönes basteln
