MVC - Преобразование данных из одной модели в другую?
В шаблоне Model View Controller, где должно происходить преобразование данных?
У меня есть модель, которая хранит очень конкретные математические данные. Мне нужно преобразовать эти данные для симулятора физики (который принимает данные только в определенном формате), и мне интересно, где должен находиться код для этого? В общем, где вы размещаете код, который превращает одну модель в модель другого типа?
3 ответа
Лично мне нравится помещать этот код в конструктор производного типа модели. Таким образом, код, который выполняет преобразование, находится в классе, который должен его использовать. Я считаю, что такой способ организации кода облегчает понимание, тестирование и сопровождение.
Используя ваш пример, предположим, что у вас есть класс следующим образом (вы не упомянули, какой язык вы использовали, поэтому я приведу код ниже на C#, но он очень похож на Java):
public class MathematicalData
{
//members of class
}
Допустим, вам нужно взять члены экземпляра MatumaticData и преобразовать их в другой класс с именем PhysicsSimulator. Я бы потребовал, чтобы конструктор PhysicsSimulator взял экземпляр MateticData в качестве входного параметра, а затем заполнил члены PhysicsSimulator в этом конструкторе:
public class PhysicsSimulator
{
//constructor
public PhysicsSimulator(MathematicalData input)
{
//put code here to use the members of input to populate members of this instance of PhysicsSimulator
}
}
Если вы хотите создать хранилище PhysicsSimulator единственным способом, используя экземпляр MatumaticData, я бы не стал создавать конструктор по умолчанию для PhysicsSimulator. Таким образом, единственный способ создать PhysicsSimulator - передать экземпляр MateticData.
Мне кажется, что для этого нужно разработать интерфейс адаптера. Создание конструктора цели (PhysicsSimulator
) принять источник (MathData
) объект связал бы их обоих так, чтобы при изменении источника по какой-либо причине цель должна была измениться.
Адаптер ограничит изменения в адаптере и не заставит цель меняться для каждого изменения в источнике.
Надеюсь это поможет.
Вот типичный шаблон, которому я следую для веб-приложения MVC. Ввод данных из сети происходит в модели, а затем контроллер берет на себя ответственность за преобразование веб-модели в модель бизнес-уровня перед вызовом действия бизнес-уровня.
Чтобы не допустить раздувания Контроллера с помощью кода преобразования, я буду выгружать преобразования в AutoMapper, когда это подходит.