流れるようなスタイル with With (VB.NET)

おはようございます!久しぶりに忙しくなかったので夕方に仮眠のつもりで寝て起きたら11時間くらい経過していたので早起きできました。…おはようございます…。
今日は「流れるようなインターフェース」のサンプルをじーっと見ているとVB.NETのWith文を使ったコードに見えてくるというお話です。

「流れるようなインターフェース」にある流れるようなスタイルのサンプルはこんな感じでした。

  private void makeFluent(Customer customer) {
       customer.newOrder()
               .with(6, "TAL")
               .with(5, "HPK").skippable()
               .with(3, "LGV")
               .priorityRush();
   }

これをVB.NETで書いてみましょう。

    Private Sub MakeFluent(ByVal customer As Customer)
        With customer.NewOrder
            .With(6, "TAL")
            .With(5, "HPK") : .Skippable()
            .With(3, "LGV")
            .PriorityRush()
        End With
    End Sub

似ていませんか?
顧客と注文の定義はこうできます。With()やSkippable()などでCustomerを返す必要はありません(= FunctionではなくSubにできます)。

Public Class Order
    Public Sub [With](ByVal amount As Integer, ByVal productName As String)
        ' ... 注文明細を追加するコード ...
    End Sub
    Public Sub Skippable()
        ' ... 呼ばれた時点での最後の注文明細をスキップするコード ...
    End Sub
    Public Sub PriorityRush()
        ' ... 注文の状態を至急にするコード ...
    End Sub
End Class

Public Class Customer
    Public Function NewOrder() As Order
        Dim o As New Order
        ' ... 何かするコード ...
        Return o
    End Function
End Class

なので良い点があるとすれば流れるようなインターフェースを定義しなくても(コマンド・クエリ分離の原則に則しつつ)流れるようなスタイルで書けるところでしょうか。流れるようなスタイルと流れるようでないスタイルのどちらでも理解できるメソッド名を考えるのがつらそうですが…。

Dictionaryの初期化 + With文ならこうですね(2個目のdictが省略できればもっとナイスなんですけれど…。VB 10だとC#のコレクション初期化子に似た形で初期化ができるそうです)。

        Dim dict As New Dictionary(Of String, Integer) : With dict
            .Add("boo", "nobuyo")
            .Add("foo", "katsue")
            .Add("woo", "tetsuko")
        End With

JavaScriptにもwith文がありますが、JavaScriptのwith文ではメソッド(プロパティ)を使うときにドットがいらないので、ぱっと見で誰(withで指定したオブジェクトなのかその上のスコープなのか)の持ち物を使っているのかがわかりづらそうです。

今日は流れるようなスタイルを実現するには言語レベルとかメタレベルで対応がされている方がうれしいかもしれませんというお話…ではありませんでした。単に流れるようなスタイルとVB.NETのWith文を使ったコードが似ているということでしたね!
それではー。