2017-02-16 1 views
1

Je développe une application Android qui fait beaucoup de demandes de réseau. Je veux concevoir ma demande de telle sorte que: -Meilleure pratique de conception pour les opérations liées au réseau dans Java

  1. Toutes mes réseau tâches liées sont centralisées dans une seule classe et chaque fois que je veux faire une demande que je devrais juste instancier cette classe et de faire ma demande. Fondamentalement, je ne veux pas polluer mes activités avec des appels réseau.

  2. La conception devrait être telle que Si à l'avenir je veux changer la bibliothèque que j'utilise pour les appels de réseau (okhttp, retrofit, async etc.) je ne dois pas faire beaucoup de changement de code ou s'il y a changement de code, ils doivent tous être dans une classe, les activités ne devraient pas être en mesure de faire la différence. Je devrais juste pouvoir changer les bibliothèques que j'utilise avec un minimum de changement de code.

  3. Je veux suivre les principes SOLID autant que possible.

  4. La classe devrait être testable à l'unité. Je devrais être facile à se moquer au cas où je veux tester n'importe quelle autre classe qui utilise les paramètres ou les méthodes de cette classe.

J'ai quelques idées dans mon esprit et je ne veux pas d'exemples de code, j'ai juste besoin des conseils de vous les gars pour que je puisse suivre les meilleures pratiques de conception dès le début de mon développement d'applications.

Merci

Répondre

0

Je pense que vous pouvez créer une classe pourrait Requester cette classe a un attribut qui détiennent l'objet de la bibliothèque de communication et cet attribut de type d'une interface qui devrait être une enveloppe pour les bibliothèques de communication afin ici, vous pouvez implémenter un modèle de stratégie.

Votre classe de demandeur ne doit effectuer que des appels réseau et la charge utile doit être transmise à vos fonctions.

J'espère que cela vous aide.

+0

Je suis en train de faire quelque chose semblable à ceci. – Ezio

0
  1. Toutes mes tâches liées au réseau sont centralisées dans une seule classe et chaque fois que je veux faire une demande que je devrais juste instancier cette classe et faire ma demande. Fondamentalement, je ne veux pas polluer mes activités avec des appels réseau.

Je crois que vous avez une classe pour garder constantes, nous pouvons l'utiliser lui-même.

Ce que vous pouvez faire, c'est créer une classe et l'instancier avec les charges de l'application. Votre code peut ressembler à ceci:

public class Constants { 
    // Your code. 
    static { 
     instantiateNetworkHelper(); 
    } 

    public static NetworkHelper netowrkHelper = null; 

    private static void instantiateNetworkHelper() { 
     /* implementation */ 
    } 
} 

De cette façon, vous êtes juste une seule instance crée de votre classe d'aide que vous pouvez l'utiliser partout dans votre application ...


  1. La conception doit être telle que si à l'avenir je veux changer la bibliothèque que j'utilise pour les appels réseau (okhttp, rénovation, async etc.) I ne pas avoir à faire beaucoup de changement de code ou s'il y a un changement de code ils doivent tous être dans une classe, les activités ne devraient pas être en mesure de dire la différence. Je devrais juste être en mesure de changer les bibliothèques que je suis en utilisant avec un minimum de changement de code.

Vous pouvez utiliser la mise en œuvre ci-dessus, mais cette fois, vous pouvez utiliser les concepts d'abstraction. Vous pouvez créer une classe abstraite qui effectue les appels réseau et vous pouvez créer des méthodes abstraites pour obtenir les protocoles réseau ou tout ce que vous voulez configurer/modifier. Un exemple ressemblerait à ceci:

public abstract class NetworkHelper { 
    public void doNetworkCall() { 
     String protocol = getProtocol(); 
     /* implementation */ 
    } 

    protected String getProtocol(); 
} 

Et cette façon vous pouvez avoir plusieurs NetworkHandlers, par exemple, chacun aidant à gérer un protocole spécifique, et vous pouvez l'unité de les tester et en créant des mises en œuvre ou en utilisant celles qui existent déjà.

0

La première chose que vous pouvez faire est de concevoir une interface qui représentent les opérations dont vous aurez besoin, puis créer une implémentation de la bibliothèque que vous utilisez, par exemple:

interface NetworkService { 
    void getRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler); 
    void postRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler); 
} 

class AsyncNetworkService { 

    AsyncImpl networkImpl;//injected so can ne mocked 

    void getRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler){ 
     //async specific implementation 
    } 
    void postRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler){ 
     //async specific implementation 
    } 

}