Лучшая практика - Получение объекта домена в Grails с помощью статического поля?

Таким образом, у нас есть уникальные "коды" для некоторых наших объектов grails (ссылки на данные), и когда мы хотим получить их, мы делаем это, вызывая их со статическим кодом:

Currency.findByCode(Currency.DOLLAR)

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

Есть ли более приемлемый подход (может быть, где-то есть ссылка на сам объект)? Если это лучший способ сделать это, это приемлемый ответ. Благодарю.

2 ответа

Решение

Это зависит. Это похоже на справочные данные. Если эталонные данные никогда не изменятся, я бы вообще не использовал слой постоянства - я бы закодировал набор статических переменных, которые являются статическими эталонными данными.

Если вы хотите иметь возможность изменять свои справочные данные без их повторного развертывания, наиболее практичным способом было бы загрузить их из базы данных. У вас будет какой-то тип экрана администратора, где вы можете манипулировать данными. Вы бы использовали кэш 2-го уровня, например, ehcache, чтобы ограничить, насколько сильно уровень персистентности достигнет БД - таким образом вы можете получить действительно хорошую производительность. См. Раздел 5.5.2.2 руководства пользователя.

Однако при вашем текущем подходе вам придется повторно развернуть изменение ваших базовых данных, поскольку необходимо кодировать Currency.DOLLAR. Вероятно, было бы неплохо не делать этого.

Еще одна вещь, которую вы могли бы сделать, чтобы сократить код, если вы используете статические переменные, - это использовать статический импорт (на самом деле это часть Java, но я не нашел его, пока не перешел на groovy):

Если вы делаете статический импорт CurrencyType (потенциально перечисление, содержащее различные типы валюты, которые вы определили) в верхней части вашего класса:

static import com.example.CurrencyType.*

Внизу в вашем коде вам больше не нужно ставить перед всеми ссылками префикс CurrencyType, вы можете просто сделать:

Currency.findByCode(DOLLAR)

Если они не нуждаются в изменении, вы также можете добавить вспомогательный метод в ваш класс Currency, чтобы получить его:

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
Другие вопросы по тегам