best practice: Parameter überprüfen, wo?

temi

Top Contributor
An welcher Stelle werden Parameter am besten überprüft?
Java:
class Foo {
    void doSomething(int para) {
        // Hier prüfen?
        bar.doSomething(para);
    }

    private Bar bar;
}

class Bar {
    void doSomething(int para) {
        // Hier prüfen?
        // möglicherweise weitere Aufrufe auf andere Klassen
    }
}

Die Hierarchie kann ja noch tiefer geschachtelt sein. Sollte die Prüfung dann nur in der obersten Ebene oder in der untersten Ebene oder in jeder Ebene erfolgen?
 
Wenn du eine Methode hast, für die bestimmte Vorbedingungen gelten bezüglich der Argumentwerte, dann sollte die Überprüfung schon innerhalb der Methode, die diese Vorbedingungen hat, passieren. Es kann ja sein, dass die Methode eben nicht nur eine sondern 100 Aufrufstellen hat. Und jetzt an jeder einzelnen dieser Aufrufstellen eine Zusicherung für die Vorbedingung der Methodenargumente zu machen, wäre Code Duplication und schlecht für die Wartbarkeit.
Das heißt, die Methode, die die Parameter direkt verwendet und eine Zusicherung für die Parameter benötigt, sollte am Anfang der Methode in etwa sowas stehen haben:
Java:
java.util.Objects.requireNonNull(theParameter, "theParameter must not be null");
 
Wenn du eine Methode hast, für die bestimmte Vorbedingungen gelten bezüglich der Argumentwerte, dann sollte die Überprüfung schon innerhalb der Methode, die diese Vorbedingungen hat, passieren.
Das bedeutet, dass die Überprüfung im obigen Beispiel in "Bar.doSomething()" erfolgen sollte, weil der Parameter in "Foo.doSomething()" nur durchgereicht wird. Habe ich das so richtig interpretiert.
 
na ja, grundlegend ist es egal, solange es irgendwo passiert!!

Macht bei einmaliger Verwendung keinen wirklichen Unterschied (außer dass Du ggf. einen Aufruf sparst)!

Bei den erwähnten 100 Aufrufstellen würdest Du zwar auch jeweils den Aufruf sparen, müsst aber die Vorbedingung eben auch 100-mal programmieren!
Und wehe, jetzt ist eine kleine Änderung notwendig ..... 😎

VG Klaus
 
grundlegend ist es egal, solange es irgendwo passiert

Das würde ich jetzt nicht unterschreiben wollen. Nochmal bezogen auf das obige Beispiel, würde die Überprüfung in "Foo.doSomething()" passieren (wo der Parameter nicht verwendet, sondern nur weitergegeben wird) und nicht mehr in "Bar.doSomething()", dann könnte ein Aufruf von "Bar.doSomething()" an einer anderen Stelle zu Fehlern führen, weil dort keine Überprüfung mehr stattfindet. Irgendwo kann also nicht ganz richtig sein.

Edit: Das bedeutet dann allerdings, dass die Prüfung unter Umständen auch mehrfach erfolgen muss, wenn eine Methode den Parameter verwendet und zusätzlich an eine andere Methode (in einer anderen Klasse) übergibt. Die andere Klasse könnte ja auch separat verwendet werden und benötigt damit ihre eigene Prüfung.
 
mit irgendwo meinte ich doch: entweder in der Methode oder vor dem Aufruf der Methode!!
Und dass ist IMHO grundsätzlich egal!

Java:
class Foo
{
    void doSomething(int para)
    {
        if( para > 0 )
        {
            bar.doSomething(para);
        }
    }
    private Bar bar;
}
// versus
class Bar
{
    void doSomething(int para)
    {
        if( para > 0 )
        {
            // mache irgendwas
        }
    }
}

VG Klaus
 
entweder in der Methode oder vor dem Aufruf der Methode!!
Und dass ist IMHO grundsätzlich egal!
Es wäre in der gezeigten Konstellation egal, aber es wäre nicht mehr egal, wenn die Klasse "Bar" ohne die Klasse "Foo" benutzt wird. Die Methode wäre dann nicht mehr geschützt, wenn die Prüfung in "Foo" stattfindet.

Ich nehme für mich mit, dass eine Klasse sich selbst schützen muss, sofern für übergebene Werte Vorbedingungen bestehen.
 
Es wäre in der gezeigten Konstellation egal, aber es wäre nicht mehr egal, wenn die Klasse "Bar" ohne die Klasse "Foo" benutzt wird. Die Methode wäre dann nicht mehr geschützt, wenn die Prüfung in "Foo" stattfindet.
das ist doch genau dass, was wir hier die ganze Zeit sagen ..... 🙄

Sobald Du doSomething an einer (oder hundert) anderen Stellen aufrufst, musst Du dann jedesmal die Prüfung voranstellen, was natürlich grundsätzlich geht, aber ggf. eben sehr aufwändig werden kann! Deswegen ist es halt besser, die Überprüfung so nah wie möglich an der Verwendung zu machen!

VG Klaus
 

Zurück
Oben