whereeaglesdare
@whereeaglesdare

Можно ли в геттерах создавать новые сущности?

Добрый день
Везде много раз читал, что каждый метод должен делать одно действие
Например, геттер - только чтобы достать значение поля

Но вот столкнулся с такой задачей
у меня есть сервис, который получает текущее состояние объекта, например
public State getState(Long chatId)
я бы хотел, чтобы в геттере, если состояние не было определено для этого сhatId, то оно создавалось
Правильный ли это подход? За такое отрывают руки сеньоры?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 3
trapwalker
@trapwalker
Программист, энтузиаст
Вы собираетесь внедрить побочный эффект функции, которую можно было сделать "чистой" и идемпотентной.
Вообще предоставленных данных не достаточно, но если у вас есть концепция состояний, то архитектурно неправильно было бы делать состояния изменяемыми, а это значит что стартовое состояние вы можете делать либо при создании объекта, либо при каждом запросе этого стартового состояния, если конструктор состояния дешев а состояние не несет в себе зависимости от контекста (что тоже был бы ошибкой).

Приведу пример для ясности:
Положим у вас есть сущность Блокнот. Ваша бизнес-модель предполагает создание большого количества разных уникальных Блокнотов и только в малой их части будет что-то редактироваться с сохранением состояний. Вы можете создать Блокнот и инцициализировать ему сразу нулевое состояние, а можете сэкономить на нулевых состояниях и сделать его только в процессе сохранения первой правки (первого состояния). При этом методы, которые через геттер будет брать сведения о текущем состоянии нетронутых блокнотов будут отдавать только что созданное и каждый раз пересоздаваемое нулевое состояние. Какой смысл хранить чисто формальное пустое состояние, если на него никто не ссылается и к нему редко обращаются.

Короче, мало данных для конкретных рекомендаций. Однако менять внутреннее состояние объекта в читающем (по логике вещей) методе, а тем более в геттере свойства -- это плохая идея, она ухудшит код.
Ответ написан
dimsog
@dimsog
Переносил код с PHP 4 на 7.4...
Я бы так не делал, потому что если состояние не найдено для chatId, то это точно не обязанность класса это состояние создавать. Класс лишь возвращает состояние, если оно есть, а теперь получается. что класс еще и за создание этого состояния отвечает. А если объект состояния сложный, то в сущность придется передать целую фабрику, что как минимум принцип единой ответственности нарушает.

В таком случае, лучше вернуть null и делать проверку на null. Либо поступить правильнее и создать функцию:
public boolean checkState(Long chatId)
{
    return false;
}


и исходя из наличия состояния его либо вернуть, либо создать.
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Это у тебя что-то типа ленивой фабрики получается. Всё зависит от окружающего кода, имхо. Сам геттер, если он нужен только для того, чтобы доставать поля, вообще не нужен. Можно так-то и полем торчать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@xez
Senior Junior Roo
Лучше сделать два метода:
get
И
getOrCreate
Ответ написан
Dreamka
@Dreamka
Web-разработчик.
Чисто технически ничто не мешает так сделать, но для создания новой сущности я бы лично использовал другой метод. Если сущьность в гетере невозможно получить надо вернуть false например и проверять получение типа
if ($model->getState()) {

} else {

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы