2016-12-27 2 views
0

Ich habe eine class wie util, Es enthält alle vorbereitenden und aufrufenden Anforderungen (Ich möchte einfach Anforderungen verwalten). Ex:Bestes Muster, um eine util-Klasse zu ersetzen

public void reqLogin(String emailAddress, String password) { 
    JsonRequestBody parameters = new JsonRequestBody(); 
    parameters.put(USER_NAME, emailAddress); 
    parameters.put(PASSWORD, password); 
    mService.login(parameters.createRequestBody()); 
} 
public void reqRegister(LocationWrapper location) { 
    JsonRequestBody jsonRequestBody = new JsonRequestBody(); 
    jsonRequestBody.put(DEVICE_TOKEN, "myToken"); 
    jsonRequestBody.put(DEVICE_TOKEN_TYPE, "type"); 
    mService.register(jsonRequestBody.createRequestBody()); 
} 

... 

Aber Problem dieser Konstruktion ist, dass LoginFragment in I Register request nennen kann, und in RegisterFragment kann ich Login request nennen. Also, ist es eine schlechte Lösung, um diese util Klasse zu erstellen? Gibt es ein Muster, um meine issue zu lösen?

Antwort

2

Also, ist es eine schlechte Lösung, um diese Util-Klasse zu erstellen?

Util Klassen delegieren die Verarbeitung nicht an andere Klassen. Sie arbeiten an den Eingaben, berechnen etwas und geben das Ergebnis zurück. In Ihrem Beispiel delegieren Sie Aufgaben an Serviceklassen von util. Das ist einfach nicht richtig. Stattdessen sollten Serviceklassen zu util-Methoden aufrufen.

Und Utils sollte keine Geschäftslogik haben. Schauen Sie sich Math Klasse an.

+0

Danke, Ihre Antwort ist für mich geklärt. Angenommen, die Klasse ist kein 'util 'wie @Lebedevsd sagte, können Sie mir vorschlagen, wie ich mein Problem lösen, ich möchte alle Anfragen in 1 Klasse gruppieren. – NamNH

0

eine der Lösungen könnten zwei verschiedene Schnittstellen für Ihre Klasse sein:

class RequestManager implemets LoginRequest, RegistrationRequest{ 
    @Override //method from LoginRequest 
    public void reqLogin(String emailAddress, String password) { 
     JsonRequestBody parameters = new JsonRequestBody(); 
     parameters.put(USER_NAME, emailAddress); 
     parameters.put(PASSWORD, password); 
     mService.login(parameters.createRequestBody()); 
    } 
    @Override //method from RegistrationRequest 
    public void reqRegister(LocationWrapper location) { 
     JsonRequestBody jsonRequestBody = new JsonRequestBody(); 
     jsonRequestBody.put(DEVICE_TOKEN, "myToken"); 
     jsonRequestBody.put(DEVICE_TOKEN_TYPE, "type"); 
     mService.register(jsonRequestBody.createRequestBody()); 
    } 
} 

andere Lösung könnte nur 2 separate Klassen tun Anmeldung und Registrierung sein.

Wie oben erwähnt, ist diese Klasse keine Utils-Klasse, sondern eher Netzwerkprozessor oder Request Manager.

+0

Danke für Ihre Antwort, aber es ist nicht gut, wenn viele Schnittstellen verwendet werden – NamNH

+0

@JohnSteve können Sie erklären, warum es nicht gut für Sie ist? innerhalb von verschiedenen Klassen verhält sich Ihr Objekt nur wie eine exakte Instanz der Schnittstelle, die Sie zugewiesen haben. Ich denke, es ist die beste Option, um alle Funktionen über Anfragen in einer Klasse zu behalten, aber nur einen Teil davon für den Client über die Schnittstelle anzuzeigen. – Lebedevsd

+0

@JohnSteve andere Option wird Subklassen von RequestManager erstellen, und fragen Sie nach ihnen: RequestManager.provideLoginRequestManager(), die innere Klasse sein wird (so wird der gesamte Kontext von RequestManager sichtbar sein, aber wieder von anderen Klassen maskiert) – Lebedevsd

1

Um zu vermeiden, GodObject Antipattern, nachdem Sie 60 API-Aufrufe haben, können Sie zum Beispiel so etwas wie Command Entwurfsmuster verwenden.

interface APIOperation { 
    void execute(); 
} 

class LoginAPIOperation implements APIOperation { 
    private final String mEmail, mPass; 

    public LoginAPIOperation(String emailAddress, String password) { 
     mEmail = emailAddress; 
     mPass = password; 
    } 

    public void execute() { 
     JsonRequestBody parameters = new JsonRequestBody(); 
     parameters.put(USER_NAME, mEmail); 
     parameters.put(PASSWORD, mPass); 
     mService.login(parameters.createRequestBody()); 
    } 
} 

new LoginAPIOperation("[email protected]","qwerty").execute(); 

Sie können dies in verschiedenen Klassen wiederverwenden.

+0

Das sieht gut aus! – NamNH

Verwandte Themen