Có vẻ như mã F # thường khớp mẫu với các loại. Chắc chắn
match opt with
| Some val -> Something(val)
| None -> Different()
có vẻ phổ biến
Nhưng từ góc độ OOP, trông rất giống luồng điều khiển dựa trên kiểm tra loại thời gian chạy, thường sẽ bị nhăn mặt. Để đánh vần nó, trong OOP có lẽ bạn thích sử dụng quá tải:
type T =
abstract member Route : unit -> unit
type Foo() =
interface T with
member this.Route() = printfn "Go left"
type Bar() =
interface T with
member this.Route() = printfn "Go right"
Đây chắc chắn là nhiều mã hơn. OTOH, dường như tâm trí OOP-y của tôi có lợi thế về cấu trúc:
- mở rộng cho một hình thức mới
T
là dễ dàng; - Tôi không phải lo lắng về việc tìm kiếm sự trùng lặp của luồng điều khiển chọn tuyến đường; và
- lựa chọn tuyến đường là bất biến theo nghĩa là một khi tôi đã có
Foo
trong tay, tôi không bao giờ phải lo lắng vềBar.Route()
việc thực hiện
Có những lợi thế nào cho việc khớp mẫu với các loại mà tôi không thấy? Nó được coi là thành ngữ hay nó là một khả năng không được sử dụng phổ biến?
But from an OOP perspective, that looks an awful lot like control-flow based on a runtime type check, which would typically be frowned on.
- nghe có vẻ quá giáo điều. Đôi khi, bạn muốn tách ops của mình khỏi hệ thống phân cấp của mình: có thể 1) bạn không thể thêm op vào hệ thống phân cấp b / c mà bạn không sở hữu hệ thống phân cấp; 2) các lớp bạn muốn có op không khớp với thứ bậc của bạn; 3) bạn có thể thêm op vào hệ thống phân cấp của mình, nhưng không muốn b / c bạn không muốn làm lộn xộn API phân cấp của mình với một loạt các crap mà hầu hết khách hàng không sử dụng.