流れるようなスタイル 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文を使ったコードが似ているということでしたね!
それではー。