2017-02-28 2 views
0

Ich möchte Eingabewerte für Methoden überprüfen, und ich möchte nicht, Code wie folgt schreiben:Welcher Ansatz eignet sich besser zur Validierung von Eingaben?

void name(String name) { 
    if(name != null) { 
     //some action 
    } else { 
     //some another action 
    } 
} 

So kann ich Dekorateur Muster oder Anmerkungen verwenden.

Decorator Beispiel:

public interface User { 
    void name(String name); 
} 

public final class dbUser { 
    //ctor... 

    void name(String name) { 
     //jdbc call for update user name 
    } 

} 

public final class CheckedNullUser { 
    private final CheckedNullUser user; 

    public CheckedNullUser(User user) { 
     this.user = user; 
    } 

    void name(String name) { 
     String inputName = "Some default value"; 

     if(name != null) { 
      inputName = name; 
     } 

     return user.name(inputName); 
    } 

} 

Annotation Beispiel:

public interface User { 
    void name(@NotNull String name); 
} 

public final class dbUser { 
    //ctor... 

    void name(@NotNull String name) { 
     //jdbc call for update user name 
    } 

} 

Welcher Ansatz ist besser? Gibt es bessere Ansätze?

+0

Was ist mit der Verwendung von Objects.requireNonNull (name) als erste Anweisung in der Methode dbUser.name? – toongeorges

+0

@RomcoBomco Ihr * Decorator * -Beispiel ist kein Beispiel für * Decorator *, sondern ein Beispiel für einfache Delegierung. Sie zeigen eine Klasse mit dem Namen 'dbUser' an, verwenden diese jedoch nie in Ihrem Code. Ihr Pseudocode ist ohne die fehlenden Komponenten nicht sinnvoll. – CKing

+0

@CKing Mein Code sollte wie neu aussehen CheckedNullUser (neuer dbUser (// ctor args)). Name ("CKing"); Die CheckedNullUser-Klasse schmückt also die Klasse dbUser. – RomcoBomco

Antwort

0

Welches ist besser? Dies hängt von Ihren Anforderungen und dem Verhalten Ihrer Anwendung ab.

Die Verwendung von Decorator-Muster erzeugt mehrere andere Objekte nur für die Validierung, also mehr Arbeit für den Garbage Collector. (Wenn Ihre Anwendung zu viele dieser Objekte generiert, werden Sie möglicherweise die Ausführung des Garbage Collectors "stop-the-world" sehen, was zu Einfrieren führt).

Die Verwendung von Annotationen (Bean Validation - JSR 349) nutzt die Reflektion. Wenn Ihre Anwendung eine Anforderung in der Nähe von Echtzeit hat, kann dies die Dinge verlangsamen.

Von diesen 2 bevorzuge ich besonders den Annotations-Ansatz, da der Code leichter zu verstehen und einfacher zu finden ist die Prüfungen, die auf jedem Feld durchgeführt werden.

https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/index.html

Jetzt über andere Ansätze, können Sie einen Marker-Schnittstelle erstellen, die einfach eine einzelne Methode enthält wie:

boolean validate() throws ValidationException

Dann Ihre Objekte diese Schnittstelle implementieren sollten, bevor Sie Ihr Objekt ausgeführt wird Rufen Sie die validate-Methode auf, die alle gewünschten Überprüfungen durchführt.

0

@NotNull Annotationen machen nichts. Es ist nicht die Art, den Null-Check zu behandeln. Es ist eher eine Art Dokumentation zu machen. Darüber hinaus informieren Sie die meisten IDEs über potenzielle Nullzeigerfehler. Wenn es um die Null-Check-Behandlung geht, sollten Sie sich diese Frage link ansehen. Wenn es um die Validierung von Geschäftslogik geht, denke ich, dass es besser wäre, sie zuerst zu überprüfen. Wenn die Logik zu komplex ist, können Sie einen Hilfsdienst für die Verarbeitung erstellen.

Verwandte Themen