BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース ループをやめるべきか?

ループをやめるべきか?

LINQ、拡張メソッドおよび改善されたanonymous delegateが追加されたおかげで、もはや多くのアルゴリズムが明確なループを必要としていない。「ループを使用している場合、誤って実行している」 というタイトルの投稿メッセージで、Chuck Jazdzewski氏はC#の今後について予測をしている(source)

Chuck Jazdzewski氏は、 APLを教えている大学教授の引用句を情報筋として始めている。APL(source)は、1960年代からの言語であり、ベクトルおよびマトリクス操作に重点を置いてい る。ループが存在していながら、一般的には必要とされていなかった。Chuck氏は以下のように続けている。

LINQと同様、ループを使用している場合、誤って実行している。この頃、プロトタイプ化に没頭している。そして自分にLINQを使用するように無理強い している。それが嫌いだからではなく、それどころか本当にLINQを気に入っているからである。しかし、ループを使用することが精神に染み付いてしまって いるので、それを止めなければならず、無理にLINQを受け入れようとしている。集合や配列を含むループを記述しようとする度に、代わりにLINQを使え るかと、自分自身に問いかける。データベースバックグラウンド以上の知識があるプログラマは、極めて自然にLINQに慣れる。彼らはセットやベクトルで考 えるが、わたしはそうではない。しかし、徐々にそうなってきた。

Chuck氏は、LINQ式および拡張メソッドに大いに依存しているが、ループを完全に除去しているわけではない。1つには、それらを IEnumerable拡張メソッドに移動する必要があるからである。IEnumerable拡張メソッドは、呼び出し機能から複雑性を分からないように する。これは汎用機能Reduceのためにおこなわれる。それによりアイテムのリストを受け取り、適合する隣接するアイテムを結合する。適合基準および実 際の結合方法は、匿名機能としてパスされる。同様の機能を記述することが不要になる。

Chuck氏が示したコードの目標は、「空白」または「キーワード」のような範囲、テキストおよび名前のシーケンスを持つ機能を作成して、それにスタイルを適用することである。最後に、その機能は3つの照会ステートメントに要約される。

  • 空白領域を先行領域とマージする。
  • スタイルを範囲にマップする。
  • 隣接する範囲を同じスタイルとマージする。

たいていの評者は前向きな考えであるが、すべての人がこれが適した方法だと納得しているわけではない。Holger Flick氏は、以下のように書いている。

見出しは、「ループを使用している場合、それをアナライズする必要なしに、コードを読まれてしまうかもしれない」にすべきである。

誤解してもらいたくないのがだが、わたしはかなりLINQを使用しているし、好きだ。しかしながら、この場合、ソースコードを読んでも複雑すぎて理 解することができない。それゆえにIMHOの管理が困難である。たとえば単線アプローチを使用するのではなく、むしろ「複線」を使用する場合について書 く。

将来、C#コードはほとんどループがなくなることになるのか?ついでに言えば、それは良いことなのか?

原文はこちらです:http://www.infoq.com/news/2008/04/No-more-loops

この記事に星をつける

おすすめ度
スタイル

BT