Во-первых, в отношении таблиц базы данных: возможно, вы могли бы еще больше нормализовать базу данных. Существует дублирование между таблицами locale и site_locale. Конечно, я не вижу здесь общей картины, так что может быть что-то позади того, как вы это сделали.
Честно говоря, любой из вариантов подойдет. Я бы выбрал дизайн, который сделает ваш код более читабельным и понятным. Например, если вы выбрали первый вариант, вы бы в конечном итоге получили такие циклы повсюду?
site_locales = site.listLocales()
foreach (site_locale in site_locales) {
if site_locale.isDefault() {
do_something(site_locale.getLocale())
}
}
Если так, то я бы избежал этого и пошел бы со вторым вариантом и в итоге получил бы:
do_something(site.getDefaultLocale())
Это гораздо понятнее с первого взгляда. Может быть, это даже улучшит производительность вашего сайта.
Тем не менее, если вы думаете, что собираетесь сделать большую работу, которая использует списки SiteLocales в будущем, но вы точно не знаете, что вы собираетесь делать, кроме getDefaultLocale()
, listActiveLocales()
, и listAllLocales()
, тогда, возможно, первый вариант может быть идеальным. Или вы могли бы даже использовать комбинацию из двух.
Что касается закона Деметры, он больше похож на Принцип Деметры. Можно нарушать любое правило, если вы делаете это сознательно, понимаете, почему вы это делаете, и понимаете последствия, если таковые имеются. Например, если нарушение закона приводит к созданию более понятного и удобочитаемого кода, но при этом вы по-прежнему сохраняете разделение проблем на высоком уровне в своем приложении, это в целом нормально. Поэтому я не буду беспокоиться о том, нарушает ли какой-либо из этих законов закон.