2013年12月17日火曜日

Visual Basic のラムダ式を改めて考える

ごめんなさい。ごめんなさい。ごめんなさい。

すっかり忘れていたのですが VB Advent Calendar 向けの投稿です。

Visual Basic で悪評高い構文の一つがラムダ式の記述だと思います。

実際 C# と VB、両方使ってみてわかるのですが C# ではさくっと記述できるラムダ式も VB ではFunction ~ End Function や Sub ~ End Sub といった記述のために、中括弧だけでコードブロックを記載できる C# と比較するとどうしても冗長的で読みにくいと感じる人は多いのではないでしょうか。

勿論 VB でも、ワンライナーで記載することは可能ですが、その場合も

   1: Dim res = hogeList.Where(Function(x) x.IsHoge)

というように

   1: var res = hogeList.Where(x => x.IsHoge());

C# と比較するとやはり冗長に思えます。ですが、個人的にはこの冗長さこそが VB の特徴というかメリットなのではないか、と最近は思えるようになりました。

   1: Dim res = hogeList.Select(
   2:     Function(vl, idx)
   3:         Return New With {vl, idx}
   4:     End Function).OrderBy(Function(x) x.idx)

上記のサンプルではワンライナーで記載することができるものですが、意図的にコードブロックとしてみました。この場合、Select で行っていることが 値(Vl)とインデックス(idx)を返却しているのが、Return を記述できているためにパッと見で理解しやすい記述にできています。

OrderBy の方では Return が記述されていないために、慣れた人でなければ配列のインデックス(idx)の値でソートを行っているというのが、つかみにくい記述となっています。このあたりは感覚的なところが大きいので、私が思っているのとは違う意見を持たれる方も多いでしょうが・・・。

とかく LINQ などを利用すると~.~.~・・・と、どんどんメソッドをつなげて記述していってしまい、結果非常に長いロジックを作成しやすくなってしまいます。C# の世界ではフリーフォーマットという特色がありますので、それでも見やすいところで適宜改行を挟むことが可能ですが、VB の場合は改行を行える位置にかなりの規制があります。先ほどの例を書き換えてみると

   1: Dim res = hogeList.
   2:             Select(
   3:                 Function(vl, idx)
   4:                     Return New With {vl, idx}
   5:                 End Function).
   6:             OrderBy(Function(x) x.idx)

このような形で、行末がドットの位置で改行をすることになります。これはこれでなれればよいのかもしれませんが、今までの改行文字(_)を利用しているのとさほど違いがありません。一つ前の行末に文字があるかないかで、この行は単独の処理なのかどうかを目で判断するのは良い記述とは言えません。

VB の場合は、短くすることにあまりこだわらず見た目にわかりやすい方向性でコードを書くことが行いやすいのではないでしょうか。もともとの言語構文的特色もあり、C# よりも会話言語的な記述を行うのが VB の特色の一つです。コードの短さにこだわるよりも、文章としての読みやすさを求めるのが VB を利用する場合には大事なのではないでしょうか。

言語はシンプルに短いものがベストと言われる考え方もあり、それは反対するところではありませんが、VB という言語においてはシンプルで「読みやすい」ものがベストなのではないか、と私は思います。コードの短さを追求するのではなく、あくまでも文章的に。そうすることが他の言語にはない VB らしさを生み出せるのではないでしょうか。

0 件のコメント:

コメントを投稿