2011年06月23日
川俣晶の縁側ソフトウェア技術雑記total 13846 count

LINQはループ構文の代用にならない!! なるわけない!!!!

Written By: 川俣 晶連絡先

「まあ、こんな文章をたまたまネットで見かけたわけだ」

この LINQ と云う機能がどの程度メジャーなものなのか知りませんが、for や while も使えるようになっておいた方がよいでしょう。(既に使えるのなら問題ありませんが...)

「間違ったことは言ってないのじゃないか? いくらLINQでループしないで書けると言っても、forやwhileは使えた方がいいだろ?」

「なんだ、君までそう思うのかい?」

「まさか、全部LINQで書いて、もうforもwhileも使うなっていうのかい?」

「はははは。まるで逆だよ。君も無理解の病魔に冒されているね」

「なんだって? LINQではループしないで書けるって言ったのは君だろう」

「そうじゃない。より正確に言うと以下のように言っている」

  • LINQを使うことで、もはやループすらさせないでコレクションを処理させることも多い

「どう違うんだい?」

「いいかい。LINQというのは基本的にクエリを行うものなんだ。結果は列挙インターフェースで返る」

「それが基本形ってことだね」

「そうだ。そして、列挙インターフェースで返される値を受け取るには基本的にループが必要だ」

「えっ?」

「たいていの場合C#ではforeachが使われる」

「ループ構文じゃないか」

「forでもwhileでも無いけどな」

「そこは重要じゃないよ。要するにループ構文はLINQを使うようになっても『知っている』必要があるってことだね?」

「その通りだ。ループ構文を知ることはLINQを活用する上で必須であり、不要にはならない。ただ、ループをまわすまでもない決まり切った処理のためのメソッドがあるというだけだ。その結果、ループ構文の出番は減るがゼロになることは無い。単に出番が減るだけだ」

「ってことは、どうなるの?」

「『forやwhileは使えた方がいい』という認識は間違っていて、『forもwhileももちろんforeachも使えないとダメ』ってことだ。LINQメインで組んでいく場合であってもね」

別のケースでもいえる §

「そもそもLINQというのは広義のコレクションを扱う技術体系だ」

「広義のコレクション?」

「列挙可能なオブジェクト、RDB、XML文書など、複数のデータを扱う記憶可能な要素全般だ」

「それで?」

「でもさ。広義のコレクションを扱うことは、ループ構文の用途の1つに過ぎない」

「えっ?」

「だからさ。仮にLINQがループの代用になったとしても、LINQが対象にしていないループは依然としてループ構文で書かないとダメだってことだ」

「なんだって?」

「当たり前だろ? コレクションじゃないものはLINQの対象にならない」

「じゃあ、ループ構文覚えないと書けないじゃ無いか」

「そうだ。書けない。当たり前だ」

「ひぇ~」

「ちなみに、無からシーケンスを発生させるオブジェクトがあればそれでLINQは使えるケースもあるのだが、全てのケースで有効というわけじゃないよ」

「そうか」

「それから、何であろうとシーケンスを発生させるコードを書けばLINQで処理できるけど、そんな追加コードを書き足すような面倒をする意味も無い」

結論 §

「それじゃまとめようか」

「頼むよ」

  • C#プログラマはforやwhileだけでなくforeachも知らないとまともなコードは書けない
  • LINQを使うか使わないかは関係ない
  • LINQを使い込むとループの出番が減るのは事実だが、ループがゼロになることはない。もともとループを無くすための技術ではないから

「でもこれは真の結論じゃない」

「真の結論っていったい何?」

「こういうことだ」

  • 世間の一般的なLINQに対する理解度は『群盲象を撫でる』のレベルにとどまる

「それは、偉そうに意見を言っているようで、前提の理解が不十分だから、意見もおかしな方に流れているってことだね。でもなぜそうなるの?」

「うん。いい質問だ。パラダイムシフトって言葉を知っているかい?」

「常識が変わるような大きな変化だろう?」

「そうだ。これが起こると、根底から発想を切り替えねば対応できない」

「それで?」

「だからさ。LINQが使えない環境に止まっている人もかなり多い上に、LINQが使える環境に生きていても、発想を切り替えない人にはまるで分からないんだよ」

「えっ? Visual Studio 2005にとどまってる人がかなり多いという話じゃないの?」

「そうだ。2008にしようが2010にしようが、発想を切り替えない人はいつまでも古い常識のままコードを書ける。それがソースコードの互換性というものだ。実際に、こちらもVisual Studio 2005時代のソースを山ほど2010に持ち込んで無修正でコンパイルして動かしてるぞ」

裏の結論 §

「これで終わりじゃ無いだろ?」

「うん」

「何を語るんだ?」

「裏の結論」

「それは何?」

  • 世間の一般的なLINQに対する理解度が『群盲象を撫でる』のレベルにとどまるならば、LINQ使って書けば世間のたいていのプログラマには負ける気がしない

「わははは、言葉の意味はワカランがともかく凄い自信だ」

「ちなみにさ。最初の引用文を書いた人はforとwhileを例示して、C#では使用頻度の多いforeachを示さない。これはforeachを持って無い古典的な言語の知識しか持っていない可能性を示唆する」

「本当なの?」

「さあな。それはワカラン。分からないけどここにforeachないしFor Eachが出てこないことはとても奇異だ。do-whileへの言及はまだwhileって言ってるから省略しても奇異ではなけど」

「やはり常識を共有しない向こう側の人らしいってことだね」

2011/06/24追記 §

「たいへんだ、君が最初に引用した文章がネタだってネットで言ってる人がいるよ」

「ふーん。それで?」

「君の論拠が崩壊しちゃうじゃないか」

「いや、崩壊しないよ。だって複数の根拠から受けた印象をまとめた話を書いているのであって、たまたま目の前にいい事例があったから一例として採用したまでだ。1つぐらい事例が事実では無いとしても、全体としての印象は変わらないよ」

「えっ?」

「それからもう1つ。君はネットで見たと言うが、いったい誰が書いた文章なのかね?」

「えーと、知らない人」

「知らない人が言ったことを信じるのかい?」

「だって、そんな人を疑うようなことはしたくないじゃないか」

「じゃあ、その言葉がどの程度の信頼性があるか、他人を説得できるかい?」

「それは……難しいな。知らない人が言ってることがどれぐらい信じられるかなんて僕には何も言えないよ」

「まあそういうことだ。そういう発言があってもおかしくない、と判断されるような話を公開されている場に出してしまった以上、そういう発言なんだろうと思われることは致し方ない。それにこの語りは特定の意図があって語られていることだから、最初から元の文章の信頼性は不明という前提で書かれている。何がどうであっても、別に関係はないさ」

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20110623110538
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.