ดูเหมือนว่ารหัส F # มักจะจับคู่รูปแบบกับประเภท อย่างแน่นอน
match opt with
| Some val -> Something(val)
| None -> Different()
ดูเหมือนทั่วไป
แต่จากมุมมองของ OOP ที่ดูน่ากลัวอย่างมากเช่นโฟลว์ควบคุมตามการตรวจสอบประเภทรันไทม์ซึ่งโดยทั่วไปแล้วจะขมวดคิ้ว หากต้องการสะกดคำใน OOP คุณอาจต้องการใช้การโหลดมากเกินไป:
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"
นี่คือรหัสเพิ่มเติมอย่างแน่นอน OTOH ดูเหมือนว่า OOP-y ในใจของฉันจะมีข้อได้เปรียบทางโครงสร้าง:
- การขยายสู่รูปแบบใหม่
T
นั้นง่าย - ฉันไม่ต้องกังวลกับการค้นหาเส้นทางการควบคุมการเลือกเส้นทางซ้ำซ้อน และ
- การเลือกเส้นทางนั้นไม่เปลี่ยนแปลงในแง่ที่ว่าเมื่อฉันมี
Foo
ในมือฉันไม่จำเป็นต้องกังวลเกี่ยวกับBar.Route()
การนำไปใช้
มีข้อได้เปรียบในการจับคู่รูปแบบกับประเภทที่ฉันไม่เห็นหรือไม่ มันถือว่าเป็นสำนวนหรือเป็นความสามารถที่ไม่ได้ใช้กันทั่วไปหรือไม่?
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.
- ฟังไม่เชื่อฟังเกินไป บางครั้งคุณต้องการแยก ops ของคุณออกจากลำดับชั้น: บางที 1) คุณไม่สามารถเพิ่ม op ในลำดับชั้น b / c ที่คุณไม่ได้เป็นเจ้าของลำดับชั้น 2) คลาสที่คุณต้องการให้ op ไม่ตรงกับลำดับชั้นของคุณ 3) คุณสามารถเพิ่ม op ให้กับลำดับชั้นของคุณ แต่ไม่ต้องการ b / c คุณไม่ต้องการถ่วง API ของลำดับชั้นของคุณด้วยอึมากมายที่ลูกค้าส่วนใหญ่ไม่ได้ใช้