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?
 

httpdigest

Top Contributor
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");
 

temi

Top Contributor
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.
 

VfL_Freak

Top Contributor
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 ..... :cool:

VG Klaus
 

temi

Top Contributor
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.
 

VfL_Freak

Top Contributor
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
 

temi

Top Contributor
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.
 

VfL_Freak

Top Contributor
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 ..... :rolleyes:

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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Best Practice überprüfen von Übergabeparametern Allgemeine Java-Themen 17
S best practice: Einordnung Enitity und Datenklasse Allgemeine Java-Themen 11
Airwolf89 JUnit: Vorschläge/ Best Practice Allgemeine Java-Themen 7
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
H Best Practice zu vielen konstanten Objekten? Allgemeine Java-Themen 10
F best practice Allgemeine Java-Themen 5
J Input/Output Dateien bearbeiten - "Best Practice" Allgemeine Java-Themen 3
R Statische Klasse: Best practice mit flags (2) Allgemeine Java-Themen 3
musiKk Best Practice für kleine Variationen in gegebenen Modellklassen Allgemeine Java-Themen 11
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
Daniel_L Best Practice zum Löschen von Log-Files? Allgemeine Java-Themen 8
Ameise03 Best&Worst Case bei Insertionsort Allgemeine Java-Themen 10
S Best Practices CopyConstrutor mit ArrayList Allgemeine Java-Themen 1
F Error Logging - best practices? Allgemeine Java-Themen 3
M Best Practices für Undo/Redo Allgemeine Java-Themen 16
G Best Practices Software-Engineering‏ Allgemeine Java-Themen 3
G Best Practices Allgemeine Java-Themen 10
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
S best practise Allgemeine Java-Themen 6
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
M Best Match / Best Fit auf Strings Allgemeine Java-Themen 9
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
M Datensatz auf ein bestimmten Parameter einzugrenzen Allgemeine Java-Themen 11
B JAX - RS.... Multiple parameter application/x-www-form-urlencoded.... Allgemeine Java-Themen 6
B Parameter Konstruktor plus rechnen Allgemeine Java-Themen 6
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F URI mit Parameter klappt nicht Allgemeine Java-Themen 1
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
MiMa If-Abfrage mit Parameter Allgemeine Java-Themen 8
I Javaaufruf aus Batch inkl. Parameter (Adminrechte) Allgemeine Java-Themen 2
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
K Java FX Zu startenden FXML-Controller per Parameter wählen Allgemeine Java-Themen 2
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
T Klassen Parameter weitergabe Allgemeine Java-Themen 1
C Überschreiben mit kontravariante Parameter Allgemeine Java-Themen 13
M Parameter auslesen im Servlet Allgemeine Java-Themen 0
perlenfischer1984 Wann ist ein Parameter Check sinnvoll Allgemeine Java-Themen 7
Neumi5694 Vererbung Parameter muss 2 Bedingungen erfüllen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
T Parameter Allgemeine Java-Themen 6
R Parameter Adapter - Design Allgemeine Java-Themen 1
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
H Generics als Parameter Allgemeine Java-Themen 1
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
OnDemand Maximale Parameter Allgemeine Java-Themen 5
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
S Servlet, per URLConnection Mit String Http Parameter mitsenden Allgemeine Java-Themen 3
M Parameter-Datei einlesen (zeilenweise); Dateiintegrität Allgemeine Java-Themen 7
H JasperReport: Parameter befüllen Allgemeine Java-Themen 7
Joew0815 JList + JTableModel: Parameter der Tabelle übergeben Allgemeine Java-Themen 10
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
F Parameter im Link /jar-Aufruf Allgemeine Java-Themen 12
S OOP Designrichtlinie Parameter Prüfung Allgemeine Java-Themen 7
C char und char-Array als parameter übergeben Allgemeine Java-Themen 6
B Array Parameter Problem Allgemeine Java-Themen 3
C Reflektions, Benutzer soll Konstruktor auswählen und Parameter übergeben können Allgemeine Java-Themen 5
S Keytool: mögliche Werte für Parameter Allgemeine Java-Themen 4
H Externes Programm, Parameter Allgemeine Java-Themen 6
C Webservice: XML Parameter übergabe. Allgemeine Java-Themen 7
M Session-Parameter setzen? Allgemeine Java-Themen 10
P VM-Parameter -D... Allgemeine Java-Themen 3
V Wildcard aus Parameter in return type Allgemeine Java-Themen 2
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
W ScriptEngine + Wie Parameter übergeben bei Fukntion? Allgemeine Java-Themen 2
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
F Parameter für Java Applikation per xml ins Meta-inf speichern? Allgemeine Java-Themen 3
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
R VM-Error - BadWindow (invalid Window parameter) Allgemeine Java-Themen 4
J Parameter an Java übergeben Allgemeine Java-Themen 10
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
P VM Parameter und .jar Allgemeine Java-Themen 3
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
J Parameter absichtlich für außen verändern Allgemeine Java-Themen 4
A wie kann man Parameter an ein Task übergeben? Allgemeine Java-Themen 3
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G setter und getter: Parameter Überprüfung Allgemeine Java-Themen 6
G JVM Parameter Allgemeine Java-Themen 7
G Parameter Bedeutung Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
J Unicode: cmd parameter (main args); exec params; filenames Allgemeine Java-Themen 2
C US_export_policy.jar und local_policy.jar VM Parameter Allgemeine Java-Themen 1
J Casten ueber generischen Parameter? Allgemeine Java-Themen 5
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
G Parameter oder Attribut (wann nehme ich was?) Allgemeine Java-Themen 12
S .rar-Dateien ein Passwort als Parameter übergeben Allgemeine Java-Themen 5
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
D Parameter parsen? Allgemeine Java-Themen 15
G Typ Parameter & Reflections Allgemeine Java-Themen 4
F mehrere Verzeichnisse als Parameter Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben