2010-09-29 5 views
0

Dites que j'appelle une API tierce qui renvoie un message, et que je veux transférer cela et en transférer des propriétés dans ma propre classe Post. J'ai eu dans le passé une méthode comme public static my.Post build(their.Post post) qui mappe les propriétés comme je le veux.Construction d'un objet avec un autre

Cependant, est-il préférable/valide d'avoir un constructeur qui accepte their.Post et fait la correspondance de la propriété là-dedans? Ou devrait-il toujours y avoir une classe séparée qui fait la conversion, et laisse my.Post dans un état plus POJO?

Merci pour votre avis!

+0

Ne pas transférer. Déléguer. –

Répondre

1

Ces réponses commencent toujours par "ça dépend". En général, les gens s'opposent à l'utilisation de méthodes statiques publiques, car il est difficile de se moquer d'eux (je n'apprécie pas ce mouvement).

Cela se résume à la conception, voulez-vous que leur poste fasse partie de votre classe? Si vous l'ajoutez en tant que constructeur "copie", il fera maintenant partie de votre classe et vous dépendez des modifications à publier. S'ils changent de poste, votre code doit s'adapter.

La meilleure solution est de le découpler. Vous auriez besoin de trouver une méthode extensible pour cartographier les deux. Une façon consiste à utiliser une méthode de construction statique (comme vous l'avez mentionné) ou si vous voulez aller plus loin, une solution plus compliquée serait d'extraire les informations que vous voulez de leur poste dans un certain type de classe de collecte générique. Créez ensuite un constructeur qui acceptera cette classe constructeur. De cette façon, s'ils modifient leur conception, votre classe reste intacte et tout ce que vous avez à faire est de mettre à jour les mappages de leur post à votre représentation générique.

public class MyPost{ 

    public MyPost(ICollectionOfProperties props){ 
     //copy all properties. 
    } 

} 

public static class TheirPostExtensions{ 
    public static ICollectionOfProperties ExtractProperties(this TheirPost thePost){ 
     return new CollectionOfProperties(){ 
       A = thePost.PropA, 
       B = thePost.PropB 
     }; 
    } 
} 


public class Example{ 
    public Example(){ 
     TheirPost tp = new TheirPost(); 
     ICollectionOfProperties props = tp.ExtractProperties(); 
     MyPost mp = new MyPost(props); 
    } 

} 
Questions connexes