Một số người nói rằng nếu bạn đưa các nguyên tắc RẮN đến cực đoan của họ, bạn sẽ kết thúc chương trình chức năng . Tôi đồng ý với bài viết này nhưng tôi nghĩ rằng một số ngữ nghĩa bị mất trong quá trình chuyển đổi từ giao diện / đối tượng sang chức năng / đóng cửa và tôi muốn biết làm thế nào Lập trình chức năng có thể giảm thiểu tổn thất.
Từ bài viết:
Hơn nữa, nếu bạn áp dụng nghiêm ngặt Nguyên tắc phân chia giao diện (ISP), bạn sẽ hiểu rằng bạn nên ưu tiên Giao diện vai trò trên Giao diện tiêu đề.
Nếu bạn tiếp tục hướng thiết kế của mình tới các giao diện nhỏ hơn và nhỏ hơn, cuối cùng bạn sẽ đến Giao diện vai trò cuối cùng: một giao diện với một phương thức duy nhất. Điều này xảy ra với tôi rất nhiều. Đây là một ví dụ:
public interface IMessageQuery
{
string Read(int id);
}
Nếu tôi phụ thuộc vào một IMessageQuery
, một phần của hợp đồng ngầm là việc gọi điện Read(id)
sẽ tìm kiếm và trả lại một tin nhắn với ID đã cho.
So sánh điều này với việc phụ thuộc vào chữ ký chức năng tương đương của nó , int -> string
. Không có bất kỳ tín hiệu bổ sung, chức năng này có thể là một đơn giản ToString()
. Nếu bạn thực hiện IMessageQuery.Read(int id)
với một ToString()
tôi có thể buộc tội bạn đã cố tình lật đổ!
Vì vậy, các lập trình viên chức năng có thể làm gì để bảo tồn ngữ nghĩa của một giao diện có tên? Có phải thông thường, ví dụ, tạo một loại bản ghi với một thành viên không?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... Có lẽ đó là lý do tại sao tài liệu là một phần của hợp đồng ?