2010-02-09 6 views
3

Je travaille sur API qui devrait fournir un accès simple au nombre de ressources basées sur le Web à distance.Comment init class avec un nombre inconnu de paramètres String?

Certaines de ces ressources distantes nécessitent des paramètres spéciaux avant leur interaction. Par exemple, l'un d'entre eux nécessite la transmission d'une paire de clés de développeur, un autre nécessite une paire de clés et un identifiant unique. Troisième ne nécessite pas ces paramètres du tout. Je travaille avec 3 services maintenant mais leur nombre peut être agrandi.

Pour chaque service web, j'ai l'implémentation correspondante de mon API. Le problème est que je ne sais pas comment introduire à mon API possibilité de passer un nombre inconnu de chaînes avec des significations inconnues.

Certains de mes suggestions:

1.

ServiceFactory.createService (ServiceEnum type, Properties keys); 

2.

ServiceFactory.createService (ServiceEnum type, ServiceParams params); 

Où ServiceParams est un marqueur-interface. Dans ce cas, je vais avoir une classe d'assistance comme ceci:

public class ServiceHelper { 

    public static ServiceParams createFirstServiceParams (String secretKey, String publicKey); 

    public static ServiceParams createSecondServiceParams (String secretKey, String publicKey, String uid); 

    public static ServiceParams createThirdServiceParams(); 
} 

Avantages: noms de paramètres significatifs pour chaque service. Inconvénients: si je fournis un support pour le quatrième service, l'utilisateur devra mettre à jour le module des usines. Dans le premier cas, l'utilisateur n'aura qu'à télécharger un nouveau module.

3.

ServiceFactory.createService (ServiceEnum type, String ... params); 

Avantages: le plus facile à utiliser. L'utilisateur n'a pas besoin de faire d'autres actions (comme créer des propriétés de ServiceParams).

Contre: la manière la plus évidente. L'utilisateur doit savoir quel ensemble de paramètres correspond au service qu'il veut créer.

4-6:

les mêmes variantes mais params sont passés pas à la méthode usine, mais à l'instance de service (dans sa méthode init() par exemple). Avantages: l'utilisateur peut changer les clés de son service s'il en a besoin sans avoir besoin de créer une nouvelle instance du même service. Contre: manière plus compliquée, le bénéfice est discutable.

Quelle variante préférez-vous? Pourquoi? Vos variantes sont les bienvenues.

Répondre

3

Vous pourriez avoir deux méthodes d'usine, celui où vous passez un Map contenant des paramètres, et l'autre sans paramètres:

ServiceFactory.createService(ServiceEnum type); 
ServiceFactory.createService(ServiceEnum type, Map<String,?> params); 

Dans ce cas, il est de la responsabilité de l'appelant pour obtenir les bons paramètres, mais cela vous donne une flexibilité maximale.

1

J'irais probablement avec l'option 1 et remplacer Properties avec Map, qui est ce que les propriétés utilise pour son implémentation sous-jacente.

Questions connexes