2014/09/01

[C#]LINQを使用するメリット

このエントリーをはてなブックマークに追加
LINQを使用するメリットが解らなかったのです。
前の記事ではLINQについておさらいしました。
[C#]LINQを覚えた(ラムダ式と型推論も)

LINQを使用するメリットが解らなかった

さて、どうしてもLINQを使わないとできないことなんてないということが、わりとLINQを学習するきっかけを失わせる壁でした。今まで書いてたコードがLINQを使うとこうなるというのは解るのだけど、それの何がいいのかが全然納得いかなかったりするのです。LINQを使うと、foreachを書かなくて済むなんていうのだけれど、それのどこがメリットなのか解らない。
つまり、foreach書かないといけないときは、結局foreachで書くわけだから、最初からforeachで書けばいいじゃんと思ってしまう。foreachを書かなくていいことに何のメリットがあるんだろう? 書き方が完結になるとかいうのは、わざわざ特殊な省略してるってことじゃないのかと、特殊な省略なんて理解が中途半端だとしょうもないトラブルのもとにもなる、そういう懸念がずっとあった。
特殊な記述が増えてしまうのは紛らわしいだけで、今まで書いたコードを全部書き換えて、新しい記法の学習と、振る舞いの検証を強制されるだけじゃないかと思ってました。

たとえば、処理効率が全く必要ないところであっても、ループの中で変数宣言してるような書き方に生理的な嫌悪を抱いてしまう人は少なくないのではないかなと思います。近しいものがあって、きっとわざわざ学習しようなどと考えることがなかったのです。
よくありそうな誤解が、ループの効率と遅延実行についての仕組みです。これについては改めてまた書くかもしれません。

LINQを使用すれば意識が変わる

LINQ記法はデータの、集合に対するアプローチなのだということが理解できた。(なんかWikipediaにもそういう風にも書いていたかもしれない)

自分はまだ十分に書き慣れているとは言い難いし、めちゃくちゃ便利で人に薦めたいと思っているわけでもないのだけど、なんとなく自分の中でブレイクスルーがあったので、それについて書いておきます。的外れなことを言ってしまっていたらごめんなさい。

どういうことかというと、たとえばcolorsという集合から黄色のものだけを抽出して、newColorsという集合をつくるコードを例にします。

IEnumerable<Color> colors = CreateColors();
List<Color> newColors = new List<Color>();
foreach(Color color in colors ){
    if(color.isYellow()){
        newColors.Add(color);
    }
}
foreach文を使って書いているものは、細かな部品を意識的に組み合わせて意図する処理を表現しているというのが、普通なはずです。
LINQを使うと、このようになります。
IEnumerable<Color> colors = CreateColors();
IEnumerable<Color> newColors = colors.Where(c => c.isYellow());
書くときに意識することが全然違う(はず)。
ある集合を抽出する条件を設定するというコードなので、意味合いが直接的なのです。
foreachは当然だけど、データ集合に対するアプローチという意味合いはどこにもなくて、配列を順番に繰り返す構文でしかない。集合を抽出する条件でふるいに掛ける、という目的に合わせてforeachに分解したコードとして翻訳して書いているということなのです。

きっとLINQを書き慣れるほど、その書き方にどっぷり慣れるのだろうと予想していて、なるほど、慣れてしまった人は他の言語でループに翻訳展開する過程がものすごく億劫になるのかもしれません。
コードとしても、データの集合に対するアプローチが直接的にコードとして展開できなら、細かなところに目がいかなくていいので可読性も増すのかなと。

記法がシンプルだったら、利用頻度もあがるだろうし、コード展開もそれに合わせて設計するようになるというスパイラルがあるわけですね。

設計をLINQに合わせて行うようになって、さくさく書ける代わりに、大きな認識違いをしてしまって非効率極まりないコードを走らせてしまうという可能性も十分にあるわけだけど、考え方をシンプルにするということは突っ走るためには何よりいいことなので、失うものを気にするよりも享受するほうがよさそうです。

軽々に流行りの情報に引っ掻き回されるのは何より疲弊してしまう困ったことなのだけど、警戒して高い壁を作りすぎて新しいことの受け入れを拒絶しすぎるのも困りごとですね。あんまりコード書く機会もなかったから仕方ないのだけど、価値を見出してしまった以上、これからがんがん使っていきたいと思います。

0 件のコメント :

コメントを投稿