Примеры для создания структур данных заглушки с динамическими языками JVM?
За прошедшие годы, я думаю, я видел и попробовал все возможные способы создания заглушенных структур данных (поддельных данных) для сложных графов объектов. Это всегда становится волосатым в Яве.
* * * *
A---B----C----D----E
(Простите дешевый UML)
Ключевой вопрос заключается в том, что между значениями существуют определенные отношения, поэтому определенный экземпляр C может подразумевать заданные значения для E.
Любая попытка применения единого шаблона или группы патентов для решения этой проблемы в Java в конечном итоге приводит к беспорядку.
Я рассматриваю, может ли Groovy или любой из динамических языков VM работать лучше. Должно быть возможно сделать вещи значительно проще с замыканиями.
У кого-нибудь есть какие-либо ссылки / примеры этой проблемы, решаемой с помощью (предпочтительно) groovy или scala?
Редактировать: я не знал, что "Мать объекта" - это имя шаблона, но у меня проблемы с ним: Когда структура объекта, генерируемая Мать объекта, достаточно сложна, вы всегда будете иметь довольно сложная внутренняя структура внутри самой Матери Объекта (или путем составления нескольких Матери Объектов). Учитывая достаточно большую целевую структуру (скажем, 30 классов), найти структурированные способы реализации объекта-матери (ов) действительно сложно. Теперь, когда я знаю название шаблона, я могу лучше его погуглить;)
2 ответа
Вы можете найти образец Матери Объекта полезным. Я использовал это в своем текущем проекте Groovy/Grails, чтобы помочь мне создать пример данных.
Он не специфичен для Groovy, но динамический язык часто облегчает создание чего-то подобного, используя утки и замыкания.
Я обычно создаю объектные матери, используя шаблон строителя.
public class ItineraryObjectMother
{
Status status;
private long departureTime;
public ItineraryObjectMother()
{
status = new Status("BLAH");
departureTime = 123456L;
}
public Itinerary build()
{
Itinerary itinerary = new Itinerary(status);
itinerary.setDepartureTime(departureTime);
return itinerary;
}
public ItineraryObjectMother status(Status status)
{
this.status = status;
return this;
}
public ItineraryObjectMother departs(long departureTime)
{
this.departureTime = departureTime;
return this;
}
}
Тогда это можно использовать так:
Itinerary i1 = new ItineraryObjectMother().departs(1234L).status(someStatus).build();
Itinerary i2 = new ItineraryObjectMother().departs(1234L).build();
Как сказал Тед, это можно улучшить / упростить с помощью динамического языка.