Як і будь-яке правило, я думаю, що тут важливо враховувати мету правила, дух і не заплутуватися в аналізі того, як саме це слово було сформульовано в деяких підручниках, і як застосувати це до цього випадку. Нам не потрібно підходити до цього, як до юристів. Мета правил - допомогти нам написати кращі програми. Це не так, як метою написання програм є дотримання правил.
Мета правила про єдину відповідальність - полегшити розуміння та підтримку програм, змусивши кожну функцію виконувати одну самостійну, цілісну річ.
Наприклад, я одного разу написав функцію, яку я назвав чимось на кшталт "checkOrderStatus", який визначав, чи є замовлення відкладеним, відправленим, зворотним замовленням і будь-яким іншим, і повертає код із зазначенням якого. Потім прийшов інший програміст і модифікував цю функцію, щоб також оновити кількість на руках, коли замовлення було відправлено. Це суттєво порушило принцип єдиної відповідальності. Інший програміст, який читає цей код пізніше, побачить ім'я функції, побачить, як використовується повернене значення, і, можливо, ніколи не підозрює, що він здійснив оновлення бази даних. Хтось, кому потрібно було отримати статус замовлення без оновлення кількості на руках, опинився б у незручному положенні: чи повинен він написати нову функцію, що дублює частину статусу замовлення? Додайте прапор, щоб сказати, чи потрібно робити оновлення db? І т.д.
З іншого боку, я б не зрозумів, що становить "дві речі". Я нещодавно написав функцію, яка надсилає інформацію про клієнтів з нашої системи в систему нашого клієнта. Ця функція виконує певне переформатування даних, щоб відповідати їх вимогам. Наприклад, у нас є деякі поля, які можуть бути нульовими в нашій базі даних, але вони не дозволяють нулю, тому нам доведеться заповнити якийсь манекен текст, "не вказаний", або я забуваю точні слова. Можливо, ця функція виконує дві речі: переформатувати дані та надіслати їх. Але я дуже свідомо ставлю це в єдину функцію, а не в тому, щоб "переформатувати" і "відправити", тому що я не хочу ніколи, ніколи надсилати без переформатування. Я не хочу, щоб хтось писав новий дзвінок і не усвідомлював, що він повинен зателефонувати переформатувати і потім відправити.
У вашому випадку оновлення бази даних та повернення зображення записаної записи здаються двома речами, які цілком можуть поєднуватися логічно та неминуче. Я не знаю деталей вашої заявки, тому я не можу остаточно сказати, хороша це ідея чи ні, але це звучить правдоподібно.
Якщо ви створюєте об'єкт в пам'яті, який зберігає всі дані для запису, виконуючи дзвінки бази даних, щоб записати це, а потім повернути об'єкт, це має багато сенсу. У вас предмет в руках. Чому б просто не повернути його назад? Якщо ви не повернули об'єкт, як би його викликав? Чи доведеться йому читати базу даних, щоб отримати об’єкт, який ви тільки що написали? Це здається досить неефективним. Як він знайде запис? Чи знаєте ви первинний ключ? Якщо хтось заявляє, що "законно", щоб функція запису повертала первинний ключ, щоб ви могли перечитати запис, чому б просто не повернути весь запис, щоб цього не потрібно? Яка різниця?
З іншого боку, якщо створення об'єкта - це велика робота, що відрізняється від запису бази даних, і абонент може захотіти зробити запис, але не створити об'єкт, то це може бути марним. Якщо абонент може захотіти об'єкт, але не зробити запис, то вам доведеться надати інший спосіб отримати об'єкт, що може означати написання зайвого коду.
Але я думаю, що сценарій 1 є більш імовірним, тому я б сказав, мабуть, не проблема.