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

StackOverflow https://stackoverflow.com/questions/4417748

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top