Was tun bei falschen Parametern?
-
Hallo!
ich habe eine kleine Frage zu Parametern. Ich habe eine Funktion foo:
VECTOR foo(float f); Der Parameter f darf nur im Interval [0,1] liegen, sonst kann ich einfach in foo nichts sinnvolles berechnen.Ich bin mir nicht ganz sicher, wie ich am besten in solchen Situationen vorgehen soll? Ist es die Aufgabe des Aufrufers dafür zu sorgen, dass f immer im gültigen Intervall liegt? Oder soll ich das in foo handhaben? Und falls ja: wie? Soll ich einen Nullvektor zurückliefern? Oder ein assert() zu Beginn von foo() einbauen oder eine Exception werfen, wenn f außerhalb [0,1] liegt?
Wie entscheide ich sowas generell?
Danke!

-
Ich würde sagen, dass du das dem Aufrufer überlässt, dass er richtige Werte übergibt und in der Funktion ein assert einbauen und bei einem falschen Wert eine Exception werfen.
-
paraFrage schrieb:
Ist es die Aufgabe des Aufrufers dafür zu sorgen, dass f immer im gültigen Intervall liegt?
Ja.
Oder soll ich das in foo handhaben?
Wie du magst.
Und falls ja: wie? Soll ich einen Nullvektor zurückliefern? Oder ein assert() zu Beginn von foo() einbauen oder eine Exception werfen, wenn f außerhalb [0,1] liegt?
Wie Du magst.
Ich würde assert nehmen.
-
Ein assert liefert ja nur im Debug Modus eine Exception, wenn ich das richtig verstehe. Im Release Modus läuft die Anwendung dann in ihr Verderben.
Ist ein assert() also im Grunde nur ein Hilfsmittel um Fehler während des Entwicklungsprozesses zu finden?
-
paraFrage schrieb:
Ein assert liefert ja nur im Debug Modus eine Exception, wenn ich das richtig verstehe. Im Release Modus läuft die Anwendung dann in ihr Verderben.
Ist ein assert() also im Grunde nur ein Hilfsmittel um Fehler während des Entwicklungsprozesses zu finden?ja.
das assert in deiner funktion hilft dem aufrufer, der keine falschen zahlen reintun darf, eventuell durchschlüpfende fehlerchen doch sofort zu finden.deine funktion darf bei falschen parametern im releasemodus machen, was sie mag. insbesondere darfst du den rechner abstürzen lassen und das betriebssystem löschen.
-
Du darfst im Prinzip machen was du willst.
Was du dir aussuchst definiert dann halt dein Interface, und du solltest es nichtmehr ändern.Doof ist z.B. wenn du heute beschliesst eine Exception zu werfen, und in der nächsten Version dann bloss ein assert() dortstehen hast, da du damit das Verhalten der Funktion verändert hast. Programme die mit der alten Version korrekt funktionieren könnten mit der neuen dann Probleme haben.
Sogesehen ist assert() gut, da du damit a) dem Programmierer hilfst Fehler zu finden aber b) es ihm trotzdem unmöglich machst diese Fehler einfach zu ignorieren, da im Release-Build dann schlimme Dinge passieren.
Eine andere Möglichkeit wäre noch die Werte einfach zu clampen, also alles < 0 als 0 zu behandel und alles > 1 als 1.
Was Sinn macht ist wohl von Fall zu Fall verschieden. Bzw. ist es natürlich auch "Geschmackssache".