Лучшая практика - получение объекта домена в граммах статического поля?
-
08-10-2019 - |
Вопрос
Таким образом, у нас есть уникальные «коды» для некоторых наших объектов Grails (данные REF), и когда мы хотим их получить, мы сделаем это, позвонив им со своим статическим кодом:
Currency.findByCode(Currency.DOLLAR)
Возможно, я совершенно не прав, но это похоже на очень многословную и неровый способ извлечения объектов (особенно когда вам нужно сделать это несколько раз, для нескольких объектов).
Есть ли более принятый подход (возможно, имеет ссылку на саму объект где-то)? Если это лучший способ сделать это, это приемлемый ответ. Спасибо.
Решение
Это зависит. Это похоже на справочные данные. Если справочные данные никогда не изменится, я бы вообще не использовал слой настойчивости - я бы записал кучу статических переменных, которые являются статическими эталонными данными.
Если вы хотите иметь возможность изменить свои справочные данные без перераспределения, наиболее практичным способом будет загружать их из БД. У вас будет какой-то тип администратора, где вы можете манипулировать данными. Вы бы использовали 2-й уровень кэш-памяти, как EHCACHE, чтобы ограничить, насколько слой настойчивости фактически ударил DB - вы можете получить действительно хорошую производительность таким образом. См. Раздел 5.5.2.2 Руководство пользователя.
Однако с вашим текущим подходом придется перераспределиться с изменением ваших справочных данных, потому что валюта. Доллара должна быть закодирована.
Другие советы
Еще одна вещь, которую вы могли бы сделать, чтобы сократить код, если вы используете статические переменные - это использовать статический импорт (это на самом деле часть Java, но я не нашел его, пока я не переехал в Groovy):
Если вы выполняете статический импорт валюты (потенциально enum, удерживающий различные типы валюты, которые вы определены) в верхней части вашего класса:
static import com.example.CurrencyType.*
В вашем коде вам больше не нужно префиксировать все ссылки с CurrencyType
, вы можете просто сделать:
Currency.findByCode(DOLLAR)
Если им не нужно меняться, вы также можете добавить метод помощника в ваш класс валюты, чтобы получить его:
Currency.groovy:
static import com.example.CurrencyType.*
...
static transients = ['dollar']
...
static Currency getDollar() {
Currency.findByCode(DOLLAR)
}
Это позволило бы вам использовать Currency.dollar
в другом коде. В этих классах вы также можете использовать статический импорт там, чтобы просто обратиться к dollar
:
static import com.example.Currency.*
....
println dollar // gets the dollar from the db and prints it out