Như với bất kỳ quy tắc nào, tôi nghĩ điều quan trọng ở đây là xem xét mục đích của quy tắc, tinh thần và không bị sa lầy trong việc phân tích chính xác cách quy tắc được diễn đạt trong một số sách giáo khoa và cách áp dụng điều đó cho trường hợp này. Chúng ta không cần phải tiếp cận điều này như luật sư. Mục đích của các quy tắc là giúp chúng tôi viết các chương trình tốt hơn. Nó không giống như mục đích của việc viết chương trình là để duy trì các quy tắc.
Mục đích của quy tắc một trách nhiệm là làm cho các chương trình dễ hiểu và duy trì hơn bằng cách làm cho mỗi chức năng thực hiện một điều độc lập, mạch lạc.
Ví dụ, tôi đã từng viết một hàm mà tôi gọi là "checkOrderStatus", xác định xem một đơn đặt hàng đang chờ xử lý, vận chuyển, đặt hàng lại, bất cứ điều gì và trả lại mã cho biết. Sau đó, một lập trình viên khác đã xuất hiện và sửa đổi chức năng này để cập nhật số lượng trong tay khi đơn hàng được chuyển đi. Điều này vi phạm nghiêm trọng nguyên tắc trách nhiệm duy nhất. Một lập trình viên khác đọc mã đó sau đó sẽ thấy tên hàm, xem cách sử dụng giá trị trả về và có thể không bao giờ nghi ngờ rằng nó đã cập nhật cơ sở dữ liệu. Một người nào đó cần có trạng thái đơn hàng mà không cập nhật số lượng trong tay sẽ ở trong một vị trí khó xử: anh ta có nên viết một chức năng mới sao chép phần trạng thái đơn hàng không? Thêm một cờ để cho nó biết có thực hiện cập nhật db không? V.v.
Mặt khác, tôi sẽ không tiết lộ những gì cấu thành "hai điều". Gần đây tôi đã viết một chức năng gửi thông tin khách hàng từ hệ thống của chúng tôi đến hệ thống của khách hàng. Hàm đó thực hiện một số định dạng lại dữ liệu để đáp ứng yêu cầu của họ. Ví dụ: chúng tôi có một số trường có thể là null trên cơ sở dữ liệu của chúng tôi, nhưng chúng không cho phép null nên chúng tôi phải điền vào một số văn bản giả, "không được chỉ định" hoặc tôi quên các từ chính xác. Có thể cho rằng chức năng này đang thực hiện hai điều: định dạng lại dữ liệu VÀ gửi nó. Nhưng tôi rất cố tình đặt điều này trong một chức năng duy nhất thay vì "định dạng lại" và "gửi" bởi vì tôi không muốn, không bao giờ gửi mà không định dạng lại. Tôi không muốn ai đó viết một cuộc gọi mới và không nhận ra anh ta phải gọi lại định dạng và sau đó gửi.
Trong trường hợp của bạn, cập nhật cơ sở dữ liệu và trả lại hình ảnh của bản ghi được viết có vẻ như hai điều có thể đi cùng nhau một cách hợp lý và chắc chắn. Tôi không biết chi tiết về ứng dụng của bạn vì vậy tôi không thể nói dứt khoát nếu đây là một ý tưởng tốt hay không, nhưng nghe có vẻ hợp lý.
Nếu bạn đang tạo một đối tượng trong bộ nhớ chứa tất cả dữ liệu cho bản ghi, thực hiện các cuộc gọi cơ sở dữ liệu để ghi điều này và sau đó trả lại đối tượng, điều này rất có ý nghĩa. Bạn có đối tượng trong tay của bạn. Tại sao không chỉ đưa nó trở lại? Nếu bạn không trả lại đối tượng, làm thế nào người gọi có được nó? Anh ta có phải đọc cơ sở dữ liệu để lấy đối tượng bạn vừa viết không? Điều đó có vẻ khá không hiệu quả. Làm thế nào anh ta sẽ tìm thấy hồ sơ? Bạn có biết khóa chính? Nếu ai đó tuyên bố rằng "hợp pháp" cho chức năng ghi trả về khóa chính để bạn có thể đọc lại hồ sơ, tại sao không trả lại toàn bộ hồ sơ để bạn không phải làm vậy? Có gì khác biệt?
Mặt khác, nếu việc tạo đối tượng là một nhóm công việc khá khác biệt so với việc viết bản ghi cơ sở dữ liệu và một người gọi có thể muốn thực hiện ghi nhưng không tạo đối tượng, thì điều này có thể lãng phí. Nếu một người gọi có thể muốn đối tượng nhưng không thực hiện ghi, thì bạn phải cung cấp một cách khác để có được đối tượng, điều đó có nghĩa là viết mã dự phòng.
Nhưng tôi nghĩ kịch bản 1 có nhiều khả năng, vì vậy tôi có thể nói, có lẽ không có vấn đề gì.