Görünüşe göre F # kodu genellikle model tiplerine karşı eşleşir. Kesinlikle
match opt with
| Some val -> Something(val)
| None -> Different()
yaygın görünüyor.
Ancak bir OOP perspektifinden bakıldığında, bu, tipik olarak kaşlarını çatmış olan bir çalışma zamanı tür kontrolüne dayanan kontrol akışına çok benziyor. Bunu hecelemek için, OOP'de muhtemelen aşırı yüklemeyi kullanmayı tercih edersiniz:
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"
Bu kesinlikle daha fazla kod. OTOH, OOP-y zihnime yapısal avantajları var gibi görünüyor:
- yeni bir biçime genişletmek
T
kolaydır; - Güzergah seçme kontrol akışının kopyasını bulmak konusunda endişelenmem gerekmiyor; ve
- rota seçimi, bir kez elimde olduğunda
Foo
, aslaBar.Route()
uygulanması için endişelenmem gerektiği anlamında değişmez
Görmediğim türlere göre desen eşleştirmenin avantajları var mı? Deyimsel kabul edilir mi yoksa yaygın olarak kullanılmayan bir özellik mi?
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.
- çok dogmatik geliyor. Bazen, op'larınızı hiyerarşinizden ayırmak isteyebilirsiniz: belki 1) bir hiyerarşiye op ekleyemezsiniz b / c hiyerarşiye sahip değilsiniz; 2) op olmasını istediğiniz sınıflar hiyerarşinizle eşleşmez; 3) op'yu hiyerarşinize ekleyebilirsiniz, ancak çoğu müşterinin kullanmadığı bir hiyerarşinin API'sı ile hiyerarşinizin API'sini karıştırmak istemezsiniz.