Привет.
Есть дерево объектов, типа
City
{
Name
}
Issuer
{
Code
City
}
Passport
{
Date
Issuer
}
User
{
Name
Surname
Passport
}
Данные записываются в бинарный формат, где в соответствующий атрибут (в примере это цифровые значения, например 123456) заносятся данные из объектов
Например
SetData(user.Name, 123456)
SetData(user.Surname, 123457)
SetData(user.Passport.Issuer.Code, 123458)
SetData(user.Passport.Issuer.City.Name, 123459)
Одно и тоже значение может записываться в несколько атрибутов
SetData(user.Passport.Issuer.Code, 123458)
SetData(user.Passport.Issuer.Code, 233458)
Могут быть условия
if(user.Surname != String.empty)
SetData(user.Surname, 123457)
else
SetData(user.Name, 123457)
То есть если одно поле пустое, то записываем значение из другого поля
Все это добро было захардкожено в коде. Теперь понадобилось дать возможность настройки пользователям
Насколько понимаю, это подходит под понятие dsl.
Погуглил по этому поводу.
Пока в голове два примерных варианта
Вариант 1:
@User
Surname = 123457
Surname = 323457
Name = 123457
if empty surname then name 123457
@Issuer
Code = 123458
Вариант 2:
user.Name = 123456
user.Surname = 123457
user.Surname = 323457
if empty user.Surname then user.Name 123457
user.Passport.Issuer.Code = 123458
Предпологается использовать так. на вход подается экземпляр user, далее при помощи reflection считываются значения из соответствующих свойств и записываем эти данные в бинарный формат с атрибутами полученными из файла конфигурации.
В этом плане, вариант 2 полегче будет для работы через reflection. Первый вариант легче читается и пользователю будет его легче поддерживать.
Хотелось бы услышать мнение людей по этому поводу. Может я не туда полез и это можно сделать проще/правильнее.
Спасибо.
Здравствуйте, Аноним,
Откровенно говоря то что вы делаете — чудовищный велосипед. Давно уже все написано и придусывать ничего не надо, только кастомизировать под себя. Могу книгу порекомендовать по данной теме —
Groovy for Domain-Specific