2010-09-29 3 views
0

Скажем, я вызываю сторонний API, который возвращает сообщение, и я хочу взять это и передать свойства из него в свой собственный класс Post. У меня в прошлом был метод вроде public static my.Post build(their.Post post), который отображает свойства, как я хочу.Создание одного объекта с учетом другого

Тем не менее, лучше/допустимо иметь конструктор, который принимает their.Post и выполняет ли отображение свойств там? Или должен всегда существовать отдельный класс, который выполняет преобразование, и оставляет my.Post в более состоянии POJO?

Спасибо за ваши мысли!

+0

Не передавать. Делегат. –

ответ

1

Эти ответы всегда начинаются с «это зависит».

Люди, как правило, возражают против использования публичных статических методов, основанных на том, что их сложно издеваться над ними (я не покупаю в эту подножку).

Это сводится к дизайну, вы хотите, чтобы их сообщение было частью вашего класса? Если вы добавите его как конструктор «copy», то он теперь станет частью вашего класса, и вы зависите от изменений в сообщении. Если они меняют свой пост, ваш код должен адаптироваться.

Лучшее решение - отделить его. Вам нужно будет найти метод extenal для сопоставления двух. Один из способов - использовать метод статического построителя (как вы упомянули), или если вы хотите сделать это еще дальше, более сложным решением будет извлечение требуемой информации из вашего сообщения в какой-то тип общего класса коллекции. Затем создайте конструктор, который примет этот класс конструктора. Таким образом, если они изменят свой дизайн, ваш класс останется в тактике, и все, что вам нужно сделать, - это обновить сопоставления со своего поста до вашего общего представления.

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

} 
Смежные вопросы