tags:

views:

14

answers:

1

Say I am calling a third-party API which returns a Post, and I want to take that and transfer properties from it into my own Post class. I have in the past had a method like public static my.Post build(their.Post post) which maps the properties how I want.

However, is it better/valid to have a constructor that accepts their.Post and does the property mapping in there? Or should there always be a separate class that does the converting, and leaves my.Post in a more POJO state?

Thanks for your thoughts!

+1  A: 

These answers always starts with "it depends."

People generally argue against using public static methods, based on the fact that it is hard to mock them (I don't buy into that bandwagon).

This comes down to design, do you want their post to be part of your class? If you add it as a "copy" constructor then it will now be part of your class and you are dependent on changes to post. If they change their post, your code has to adapt.

The better solution is to decouple it. You would need to find some extenal method to map the two. One way is to use a static builder method (like you mentioned) or if you want to take it a step further, a more complicated solution would be to extract the information you want from their post into some type of generic collection class. Then create a constructor that will accept that constructor class. This way if they change their design your class stays in tact and all you have to do is update the mappings from their post to your generic representation of it.

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);
   }

}
Nix