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.
너무 독단적으로 들립니다. 때때로, 당신은 당신의 계층 구조에서 당신의 op를 분리하기를 원할 것입니다 : 아마도 1) 당신은 당신이 계층 구조를 소유하지 않은 b / c 계층 구조에 op를 추가 할 수 없습니다; 2) 작전을 원하는 수업이 계층과 일치하지 않습니다. 3) 계층 구조에 op를 추가 할 수는 있지만 대부분의 클라이언트가 사용하지 않는 많은 쓰레기로 계층 구조의 API를 혼란스럽게하고 싶지는 않습니다.