explicit factoring by functions と implicit factoring by hierarchy

Expert F# 2.0 (Expert's Voice in F#)

Expert F# 2.0 (Expert's Voice in F#)

この本を読んでいます。
その中で関数を使って振る舞いを変えているものと継承を使って振る舞いを変更しているものの比較があってなるほどと思いました。
それぞれ「explicit factoring by functions」と「implicit factoring by hierarchy」という用語で説明されているんですが、一般的な言葉というわけでもないようですね。検索してもF#の本しかhitしないし。

自分なりに解釈して簡単に書くとコード例はこんな感じになります。

explicit factoring by functions

open NUnit.Framework

type Greeing =
{ Hello : (string -> string)
GoodBye : (string -> string) }

let say (greeing: Greeing) name =
(greeing.Hello(name), greeing.GoodBye(name))
||> sprintf "%s %s"

[<Test>]
let ``explicit factoring by functions``() =
let japanese =
{ Hello=(fun name -> "こんにちは " + name);
GoodBye=(fun name -> "さようなら " + name) }
Assert.AreEqual("こんにちは hoge さようなら hoge", say japanese "hoge")

implicit factoring by hierarchy

open NUnit.Framework

type IGreeing =
abstract Hello : string -> string
abstract GoodBye : string -> string

let say (greeing: IGreeing) name =
(greeing.Hello(name), greeing.GoodBye(name))
||> sprintf "%s %s"

[<Test>]
let ``implicit factoring by hierarchy``() =
let japanese =
{new IGreeing with
member
this.Hello(name) = "こんにちは " + name
member this.GoodBye(name) = "さようなら " + name}
Assert.AreEqual("こんにちは hoge さようなら hoge", say japanese "hoge")

使い方の指針としては、最初に「explicit factoring by functions」を検討し、それから「implicit factoring by hierarchy」を検討しろとのことです。後者を検討するのは、他のライブラリとの相互接続性を考慮する場合や.NETが提供するインタフェースを実装する場合です。