Nơi nào chúng ta đặt ra câu hỏi về mã thế giới khi chúng ta tách tính toán khỏi các tác dụng phụ?


10

Theo nguyên tắc phân tách truy vấn lệnh , cũng như suy nghĩ về dữ liệuDDD với các bài thuyết trình Clojure, người ta nên tách các tác dụng phụ (sửa đổi thế giới) khỏi các tính toán và quyết định, để dễ hiểu và kiểm tra cả hai phần.

Điều này để lại một câu hỏi chưa được trả lời: chúng ta nên đặt "hỏi thế giới" ở đâu? Một mặt, việc yêu cầu dữ liệu từ các hệ thống bên ngoài (như cơ sở dữ liệu, API của dịch vụ ngoại vi, v.v.) không được minh bạch về mặt tham chiếu và do đó không nên ngồi cùng với mã tính toán và ra quyết định thuần túy. Mặt khác, nó có vấn đề hoặc có thể không thể trêu chọc họ ngoài phần tính toán và chuyển nó thành một đối số vì chúng tôi có thể không biết trước dữ liệu nào chúng tôi có thể cần yêu cầu.


1
Đó là nơi có các khái niệm về cuộc gọi lại. Nếu bạn không biết trước dữ liệu nào có thể cần thiết, hãy cung cấp một cuộc gọi lại cho mã tính toán nơi nó có thể chỉ định dữ liệu nào cần và các lớp khác thực hiện tìm nạp và cung cấp thực tế . Nếu nó không đồng bộ, cuộc gọi lại thậm chí có thể chỉ định một chức năng khác để gọi với dữ liệu được tìm nạp khi nó trở nên khả dụng.
Marjan Venema

1
@MarjanVenema, đây là lựa chọn duy nhất xuất hiện trong đầu tôi. Chỉ từ quan điểm lý thuyết: nếu phương pháp, nếu không có tác dụng phụ, gọi lại cuộc gọi lại hiệu quả phụ thì nó trở nên có hiệu lực. Có lẽ vấn đề của tôi ở đây là tôi cho rằng việc tính toán tách khỏi các tác dụng phụ đòi hỏi sự tính toán phải được minh bạch. Mặc dù nó không cần thiết đúng.
Alexey

1
Nếu đó là lo lắng của bạn, đơn giản là tính toán của bạn không đủ tốt. Bạn cần trừu tượng hóa việc ra quyết định về những dữ liệu / bước khác cần thiết. Vì vậy, phân chia tính toán đầy đủ trong các bước dựa trên nơi quyết định được đưa ra như dữ liệu nào là cần thiết. Sau đó, có một số "giám đốc" quản lý quy trình làm việc để tính toán đầy đủ: bắt đầu từng bước, lấy lại thông tin từ mỗi bước, sử dụng điều đó để quyết định bước tiếp theo và dữ liệu cần thiết, bắt đầu quá trình tìm nạp để có được nó dữ liệu được tìm nạp đến bước tiếp theo trong tính toán.
Marjan Venema

Câu trả lời:


1

Mặt khác, nó có vấn đề hoặc có thể không thể trêu chọc họ ngoài phần tính toán và chuyển nó thành một đối số vì chúng tôi có thể không biết trước dữ liệu nào chúng tôi có thể cần yêu cầu.

Đây là một ví dụ trong đó, như đã lưu ý trong các nhận xét, truyền vào khả năng truy xuất dữ liệu (ví dụ: chức năng hạng nhất, một đối tượng thực hiện giao diện, v.v.) cung cấp một cơ chế thuận tiện để cô lập các tác dụng phụ.

Hàm bậc cao hơn có cơ thể thuần khiết có độ tinh khiết không trộn lẫn: http://books.google.com.vn/books?id=Yb8azEfnDYgC&pg=PA143#v=onepage&q&f=false

Tôi đã viết về điều này, gọi loại chức năng này là một chức năng có khả năng thuần túy: http://adamjonrichardson.com/2014/01/13/potively-pure-fifts/

Nếu bạn kết hợp một hàm có khả năng thuần túy với các hàm rơi (thiếu các cấu trúc phân nhánh và làm ít nhất có thể), một tổ hợp tôi gọi là các bộ cách ly, bạn có thể cách ly các hiệu ứng phụ khá hiệu quả và tạo mã rất dễ kiểm tra: http: // adamjonrichardson.com/2014/01/15/isolating-side-effects-USE-isolation-sets/


0

Bạn lưu trữ kết quả trong lớp, điều này có vẻ hơi lạ lúc đầu, nhưng không dẫn đến mã đơn giản hơn. ví dụ không có biến tạm thời trong người gọi

class database_querier
    feature -- queries
        was_previous_query_ok : boolean is
            do
                Result = …
            end

        previous_query_result : string is 
            requires
                was_previous_query_ok
            do
                Result = query_result
            end

    feature -- commands
        query_db (…) is
            do
                …
                query_result = bla
            end

    feature {none} --data
        query_result : string

1
Tình yêu nhìn thấy eiffel trong tự nhiên.
SBI

@sbi nó chỉ là mã giả. :-)
ctrl-alt-delor

Đủ gần để làm tôi hạnh phúc;)
SBI
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.