Có tách lệnh / truy vấn áp dụng cho một phương thức tạo một đối tượng và trả về ID của nó không?


12

Hãy giả vờ rằng chúng tôi có một dịch vụ gọi là quy trình kinh doanh. Quá trình này sẽ gọi lớp dữ liệu để tạo một đối tượng loại A trong cơ sở dữ liệu.

Sau đó, chúng ta cần gọi lại trên một lớp khác của lớp dữ liệu để tạo một thể hiện của loại B trong cơ sở dữ liệu. Chúng ta cần truyền một số thông tin về A cho khóa ngoại.

Trong phương thức đầu tiên, chúng ta tạo một đối tượng (sửa đổi trạng thái) và trả về ID (truy vấn) trong một phương thức duy nhất.

Trong phương thức thứ hai, chúng ta có hai phương thức, một (createA) cho lưu và phương thức kia (getId) cho truy vấn.

    public void FirstMethod(Info info)
    {
        var id = firstRepository.createA(info);           
        secondRepository.createB(id);
    }

    public void SecondMethod(Info info)
    {
        firstRepository.createA(info);
        var key = firstRepository.getID(info);
        secondRepository.createB(key);
    }

Theo hiểu biết của tôi, phương pháp thứ hai theo sau phân tách truy vấn lệnh đầy đủ hơn. Nhưng tôi thấy thật lãng phí và phản trực giác khi truy vấn cơ sở dữ liệu để lấy đối tượng chúng ta vừa tạo.

Làm thế nào để bạn dung hòa CQS với một kịch bản như vậy?

Có phải chỉ có phương pháp thứ hai tuân theo CQS và nếu vậy thì có nên sử dụng nó trong trường hợp này không?


2
nếu A và B được tạo cùng với bất kỳ tần số nào, tôi có thể tạo một thủ tục được lưu trữ tạo cả hai cùng một lúc, và sau đó bạn loại bỏ khả năng tạo B trước hoặc A được tạo mà không có B nếu đó là những vấn đề.
Ryathal

Bước vào cuối trò chơi để cung cấp tùy chọn sử dụng tham số out. Về mặt kỹ thuật, đây không phải là giá trị hoàn trả! ;)

Câu trả lời:


13

CQS là một hướng dẫn chứ không phải là một quy tắc tuyệt đối. Xem bài viết wiki để biết ví dụ về các hoạt động không thể thực hiện được theo CQS nghiêm ngặt.

Tuy nhiên, trong trường hợp này, nếu bạn muốn duy trì CQS, bạn có thể tạo ID ở phía máy khách (chẳng hạn như GUID) hoặc máy khách có thể yêu cầu ID từ hệ thống trước khi tạo bất kỳ đối tượng nào, mà cảm thấy sạch hơn tôi hơn là tạo đối tượng sau đó truy vấn nó (nhưng khó hơn là chỉ sử dụng một cột định danh).

Cá nhân tôi chỉ cần trả lại ID và gọi nó là một trong những tình huống mà CQS không phù hợp.

Một bài viết hay với các ví dụ: Martin Fowler


3

Nếu bạn làm theo một phương pháp và nó dường như đưa bạn xuống những con đường xấu, bạn nên đánh giá lại nó.

Tôi thấy rằng định danh của một đối tượng mới được tạo là một điều hợp lệ để có như là một tham số trả về - nó không chỉ thuận tiện, mà còn "tốt" - vì bạn có thể thấy mã tốt hơn khi có.

Trong mọi trường hợp, tôi không quen với "phân tách truy vấn lệnh" nhưng tôi rất nghi ngờ rằng nó không cho phép các lệnh trả về thông tin về việc thực thi lệnh và nếu có, chỉ cần bỏ rác - thành công / thất bại luôn ở đó và tôi làm không nghĩ rằng "đối tượng của bạn đã được tạo OK" từ "đối tượng của bạn đã được tạo OK và id của nó là xxx" sẽ khác đi nhiều.


-1

Chỉ có phương pháp thứ hai sau CQS.

Tôi coi CQS là một hướng dẫn để khuyến khích thực hành mã hóa tốt. Sử dụng các thực hành mã hóa tốt trong quá trình phát triển và nếu sau này bạn phát hiện ra rằng phương pháp này chứa mã quan trọng về tài nguyên, bạn vẫn có thể tối ưu hóa nó.

Tối ưu hóa sớm là gốc rễ của mọi tội lỗi :)


Điều gì đặc biệt tốt trong phương pháp thứ hai?
CheatEx

Tôi không nói phương pháp thứ hai là "tốt". Tôi nói nó tuân theo mô hình CQS. Nếu bạn không theo CQS, tôi cho rằng phương pháp thứ hai không tốt cho bạn. Nếu bạn muốn biết lý do tại sao một số người cố gắng theo dõi CQS, hãy xem http://en.wikipedia.org/wiki/Command-query_separation
cheesus nói ngừng bắn mod

Bạn nói rằng CQS đang khuyến khích thực hành mã hóa tốt, nếu đó là sự thật thì chúng ta nên quan sát một số loại "lòng tốt" trong phương pháp thứ hai. Nó đâu rồi?
CheatEx

Rõ ràng bạn đã không đọc liên kết tôi cung cấp. Cụm từ bắt CQS: Đặt câu hỏi không nên thay đổi câu trả lời . Trong phương thức đầu tiên của bạn, bạn có một phương thức ('createdA') cung cấp 'câu trả lời', nhưng nó thay đổi câu trả lời mỗi khi bạn hỏi. Trong phương pháp thứ hai bạn không có điều đó, đây là 'lòng tốt' trong đó. Để rõ ràng: Tôi không phải là người theo chủ nghĩa thuần túy CQS, tôi không theo dõi nó mọi lúc.
cheesus nói ngừng bắn mod
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.