Обеспокоенность - это простая, но действенная концепция. Он существует для повторного использования кода. По сути, идея состоит в том, чтобы извлечь общие и / или контекстно-зависимые фрагменты кода, чтобы очистить модели и избежать их чрезмерного увеличения и неуправляемости.
Я хотел бы прямо указать, что вы должны использовать служебные объекты для обеспечения функциональности, не связанной с конкретным объектом. Например, в организации много пользователей. Теперь администратору организации необходимо экспортировать CSV всех пользователей этой организации. Этот код может быть помещен в модель организации, но, поскольку он не является обязанностью объекта организации, этот код следует поместить в класс, где вы просто передаете объект организации, и он возвращает CSV всех пользователей.
class Services::GenerateCsv
def self.get_users org
#add logic the fetch users for the org and generate the CSV and return the CSV data
end
end
Всякий раз, когда вам нужно создать CSV, вы можете поместить эту логику в вышеуказанный класс. Такой подход сохраняет объект (в данном случае модель организации) чистым от кода, который не должен входить в его обязанности. Общий принцип, которому я следую: если код изменяет объект self, переместите код в объект службы.
Примечание. Ваш вопрос касался проблем, но я подумал о добавлении некоторых дополнительных вещей, за которыми я следую, чтобы сохранить базу кода в чистоте и управляемости, поскольку это может помочь другим программистам. Этот подход спорен.