2011-04-18 2 views
1

Tâche: Je suis en train de concevoir une bibliothèque qui sera utilisée par les développeurs.Comment puis-je concevoir ma bibliothèque Java/C# pour qu'elle reste compatible en cas de modifications futures?

Objectif: Je dois m'assurer que les changements dans les futures versions n'affecteront pas les développeurs existants.

Exemple:

Situation lors de la première sortie:

Il y a une classe

public class ClassSample 

{ 

String methodSample(String para1,String Para2, int Para3, String Para4); 

} 

Situation lors de la deuxième sortie:

Exigences:

La réponse de methodSample peut renvoyer plusieurs valeurs.

Plus de paramètres sont nécessaires dans la méthode methodSample.

Solution: Une façon peut être d'ajouter une autre méthode surchargée qui aura de nouveaux paramètres et de l'objet plutôt que de retourner intégré type de données.

Mais le problème avec la solution ci-dessus est, il aura trop de méthodes surchargées à l'avenir, trop de paramètres seront exagérés.

modifié Solution 1:

void methodSample(Request request, Response response) 

Dans chaque version (évidemment si nécessaire), je modifierai demande & cours de réponse d'avoir de nouvelles méthodes supplémentaires pour obtenir/valeurs de réglage. Il y aura un problème dans ce cas car à l'intérieur de la méthode, je ne serai pas en mesure de différencier si l'appelant est de Version10 ou Version20.

modifié Solution 2:

void methodSample(AbsractRequest request, AbstractResponse response) 

Dans chaque version, nous pouvons étendre la classe dérivée comme Request200 étend Request100 étend AbstractRequest, de même pour les classes de réponse. Dans ce cas, je peux vérifier à l'intérieur de la méthode si l'appelant est de Version10 ou Version20 en vérifiant la frappe de l'instance.

En résumé La solution modifiée 2 me semble bonne, qu'en pensez-vous?

Répondre

1

J'opterais pour la solution 1 modifiée, mais avec l'ajout d'une méthode de version get/set dans la classe.

Votre bibliothèque peut l'utiliser getVersion savoir quel comportement le programme utilisateur attend

1

Je me rends compte que cela pourrait être un peu en retard, mais la pensée pourrait être utile pour vous ou quelqu'un d'autre.

J'ai créé un SDK dans le passé qui nécessitait un versionnage et j'ai fait quelque chose de très similaire à ce que j'ai posté ci-dessous et cela a fonctionné.

L'idée étant que tous les messages proviennent d'une classe abstraite comme vous l'avez suggéré, mais il y a une statique qui est définie dans l'application appelante dès le début. Toutes les demandes définissent simplement une propriété Version égale à celle du static. De cette façon, il est seulement spécifié une fois dans l'ensemble de l'application.

Lorsque vous ajoutez de nouvelles versions, ajoutez-les simplement à l'énumération. J'ai effectivement utilisé un nombre entier dans le mien et l'ai incrémenté mais je pense qu'un Enum est toujours plus maintenable.

Profitez-en!

namespace SilverlightClassLibrary1 
{ 
    public enum SDKVersions 
    { 
     NonSpecific = 0, 
     Version100, 
     Version200, 
    } 

    public abstract class RequestBase 
    { 
     public static SDKVersions SystemSDKVersion { get; set; } 

     public SDKVersions RequestSDKVersion { get; set; } 

     protected RequestBase() 
     { 
      this.RequestSDKVersion = RequestBase.SystemSDKVersion; 
     } 
    } 

    public class SimpleDataRequest : RequestBase 
    { 
     public String Data { get; set; } 
    } 

    public class SimpleDataResponse 
    { 
     public String Response { get; set; } 
    } 

    public class SomeSDKFunctionality 
    { 
     public static void RandomSDKFunction(SimpleDataRequest request, out SimpleDataResponse response) 
     { 
      switch (request.RequestSDKVersion) 
      { 
       case SDKVersions.Version100: 
        //Legacy response 
        response = new SimpleDataResponse() 
           { 
            Response = "Helo " + request.Data, 
           }; 
        break; 

       default: 
        //Fixed/Updated Response 
        response = new SimpleDataResponse() 
           { 
            Response = "Hello " + request.Data + "!", 
           }; 
        break; 
      } 
     } 
    } 
} 

namespace MyExternalApplication 
{ 
    public class Main 
    { 
     public void ApplicationEntryPoint() 
     { 
      //Specify a specific version you intend to use 
      RequestBase.SystemSDKVersion = SDKVersions.Version100; 

     } 

     public void ButtonClickExample() 
     { 
      SimpleDataResponse response; 
      SomeSDKFunctionality.RandomSDKFunction(new SimpleDataRequest() 
                { 
                 Data = "James", 
                }, out response); 
     } 
    } 
} 
Questions connexes