给另一个建立一个对象

时间:2010-09-29 18:27:35

标签: oop

假设我正在调用返回Post的第三方API,我希望将其转移并将其中的属性传输到我自己的Post类中。我过去曾经有一个类似public static my.Post build(their.Post post)的方法,可以按照我想要的方式映射属性。

但是,拥有一个接受their.Post的构造函数并在那里进行属性映射是否更好/更有效?或者是否应该总是有一个单独的类进行转换,并使my.Post处于更多的POJO状态?

感谢您的想法!

1 个答案:

答案 0 :(得分:1)

这些答案总是从“它取决于”开始。

人们通常反对使用公共静态方法,因为它很难嘲笑它们(我不会购买那种潮流)。

这归结为设计,你想让他们的帖子成为你班级的一部分吗?如果您将其添加为“复制”构造函数,那么它现在将成为您的类的一部分,并且您依赖于发布的更改。如果他们更改帖子,您的代码必须适应。

更好的解决方案是将其解耦。您需要找到一些外部方法来映射这两个。一种方法是使用静态构建器方法(如您所提到的),或者如果您想更进一步,更复杂的解决方案是将您想要的信息从其帖子中提取到某种类型的泛型集合类中。然后创建一个将接受该构造函数类的构造函数。这样,如果他们改变了他们的设计,你的班级就会保持机智,你所要做的就是将他们的帖子中的映射更新为你的通用表示。

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

}