以下の簡単な例を考えてみましょう。繰り返し可能なパターンマッチング
type PaymentInstrument =
| Check of string
| CreditCard of string * DateTime
let printInstrumentName instrument =
match instrument with
| Check number-> printfn "check"
| CreditCard (number, expirationDate) -> printfn "card"
let printRequisites instrument =
match instrument with
| Check number -> printfn "check %s" number
| CreditCard (number, expirationDate) -> printfn "card %s %A" number expirationDate
同じパターンマッチングロジックが2つの機能で繰り返されることがわかります。クラスを
PrintInstrumentName
とPrintRequisites
をしてから実装する - 決済手段ごとに1つずつ:私はOOPを使用する場合、私は、インターフェイスIPaymentInstrument
を作成する2つの操作を定義します。いくつかの外部条件に応じて機器をインスタンス化するには、例えば工場パターン(PaymentInstrumentFactory
)を使用します。
新しい支払い手段を追加する必要がある場合は、IPaymentInstrument
インターフェイスを実装し、ファクトリインスタンス化ロジックを更新する新しいクラスを追加するだけです。これらのクラスを使用する他のコードはそのままです。
機能的なアプローチを使用すると、をそれぞれ更新する必要があります。このタイプのパターンマッチングが存在する機能です。
PaymentInstrument
タイプを使用すると多くの機能が問題になる場合があります。
機能的アプローチを使用してこの問題を解決するにはどうすればよいですか?
これらのメンバ関数を少しきれいにすることができますが、繰り返しの一致があります。 –
[式の問題](http://c2.com/cgi/wiki?ExpressionProblem)の片側ですが、OOPアプローチはもう片方。あなたは本当にパターンマッチを消すことはできません。 –
私は@Patrykíwiekのコメントに同意します。パターンマッチの力は、OOPメカニズムの「ノイズ」を排除することです。この場合はほとんど役に立たないことです。現実のプロジェクトでは、各ブランチの内部のボディは、開発とテストを簡素化する別々の機能の中にあります。 OTOH、ある日に 'PaymentInstrument'が大きく成長し、それが異なる人々によって開発されると、既存の別々の処理機能を保持しながら、OOPアプローチに素早く切り替えることができます。 – bytebuster