Linqが.NETプログラマーに気のめいるような影響を与えていますか?


36

私たちの多くは、jQueryを使用してクエリ文字列を取得するなどの非常に正気でないことを行う方法を尋ね始めた約1年前に、jQueryでこの現象を見始めました。ライブラリ(jQuery)と言語(JavaScript)の違いは、多くのプログラマーで明らかに失われ、多くの不適切で複雑なコードが必要のない場所に書き込まれます。

たぶんそれは私の想像だけかもしれませんが、ソートされた配列の範囲を見つけるなど、人々がLinqで同様の非常識なことをするように求めている質問の数が増えていると確信しています。Linq拡張機能がその問題を解決するのにどれほど不適切であるかを克服することはできませんが、さらに重要なことは、著者が理想的な解決策が実際にそれについて考えずにLinq含むと仮定したという事実です(私が知る限り)。私たちは歴史を繰り返しており、言語(C#/ VB.NET)とライブラリ(Linq)の違いがわからない新世代の.NETプログラマーを育てているようです。

この現象の原因は何ですか?誇大広告ですか?カササギの傾向?Linqは魔法の形としての評判を獲得しましたか?実際にコードを書く代わりに、正しい呪文を発声するだけでいいのでしょうか?私はそれらの説明にはほとんど満足していませんが、他に何も考えられません。

さらに重要なのは、それが本当に問題なのか、もしそうなら、これらの人々を啓発するための最善の方法は何ですか?


6
「理想的な解決策は、実際にそれを考えずにLinqが関与すると仮定した」ための+1。それは本当に私を超えています。
ジャコプレトリアス

1
Linqが遅い

2
@Pierre:どのような根拠でその主張をしていますか?
アーロンノート

5
@Mason:それは、彼らが何をしているのかをはっきりと知らない誰かによって書かれた絶対に恐ろしいベンチマークです。ティックのベンチマーク ハンガリー記法?そして、Linqバージョンは同じことすら行わず、最初に停止するのではなく、すべての結果を反復しようとします。言うまでもありませんが、今日のホットな質問で自信を持って議論されたように、前提全体は馬鹿げています
アーロンノート

3
そして、偶然@ Mason、Linqには多くの最適化が組み込まれています。最適化できるほとんどすべてのメソッドについて、最初に最適化されたメソッドをサポートするインターフェイスを探します。等結合などの他のセットベースのメソッドの場合、ハッシュテーブルが作成されます。それはあなたのコードを最適化していないあなたのために、どちらか任意の遅くあなたのコードを作ることはないだろう。実際に文書化された実際のスローダウンのほとんどは、Linqに依存しないラムダ/クロージャーによるものです。
アーロンノート

回答:


52

基本的に、プログラミングが根本的に難しいからです。多くの人がどうすればいいのか分からないような、多くの論理的で構造化された思考が必要です。(またはあなたが誰に耳を​​傾けるかによって、単にできないことです。)

LINQやjQueryのようなものは、特定の一般的なデータ操作タスクを非常に簡単にします。それは私たちが何をしているかを知っている人にとっては素晴らしいことですが、残念なことに副作用はバーを下げることです。何をしているのかわからない人でも、コードの記述を開始して作業を進めるのが簡単になります。そして、彼らが現実に出会って、彼らのシンプルで高抽象度レベルの技術が適していない根本的に難しいものを見つけると、彼らは自分のライブラリが構築されているプラ​​ットフォームを理解していないため、失われます。

あなたの質問は正しい軌道に乗っていますが、暴力的なビデオゲームの「子供を暴力的にする」という長年の論争によく似ており、リンクの方向が逆になっています。簡単なプログラミング手法は、プログラマをバカにしません。彼らはただ愚かな人々をプログラミングに引き付けます。そして、あなたがそれに対してできることは本当に多くありません。


30
「簡単なプログラミング技術はプログラマをバカにするものではありません。バカな人をプログラミングに引き付けるだけです。」
スティーブンエバーズ

1
LINQの素晴らしい点の1つは、機能的なアプローチでソリューションのプロトタイプを作成できることです。その後、バグのないソリューションが得られたら、最適化された命令型バージョンのテストベンチとして使用できます。タスクが単一のフィルターを適用するような単純なものであれば、私も気にしません。
ChaosPandion

5
私はLINQが無能なプログラマを引き付けることをまだ疑っています-私が見たものから、それは初心者にとって理解するのが最も難しい概念の1つであると思われます-しかし、これはこれまでの最良の答えのようです。
アーロンノート

1
あなたはその最後の文に著作権を置くべきです。よく言った、先生。
AJジョンソン

1
おかしい。私にとって、LINQは特に習得しやすい概念ではありません。微妙なことをしている場合は、ステアリングホイールについて考えるのをやめて、トランスミッションの理解を始める必要があります。私はあなたにラムダを見ています!
ブライアンマッケイ

13

私にとってそれは新しいおもちゃの現象です。何か新しいものが登場し(LINQ)、今ではすべての開発者がそれで遊びたいと思っています。

彼らはLINQをハンマーと見なし、すべての問題は釘です。別の方法で行う方が簡単な場合、誰が気にしますか?LINQが答えでなければなりません!誰もがすべてにXMLを使用していたときのように!構成ファイル?XML。データを保存しますか?XML。などなど


5
ここでXMLの議論を始めたくはありませんが、XMLが実際にはこれらの両方に優れていることを指摘する価値があります。常に最適とは限りません-構成ファイルを構造化する必要がない場合、KVPの方が優れています。また、アプリケーション間の互換性が要件でない場合、ストレージ/シリアル化にはバイナリ形式が明らかに優れています。しかし、XMLは完全に不適切ではなく単に最適ではない領域で使用されていることに気付くので、XMLがこのような素晴らしい例だとは思いません。
アーロンノート

4
+1:テクノロジーを学習しているときにツールを伸ばして、爪の形にどれだけ多くの問題を打ち込むことができるかを確認する価値があります。
スティーブンエバーズ

+1:この種の魔法のハンマーの他の例は、jQuery(質問で述べたように)と正規表現です。これらのことは悪いことではなく、実際には本当に便利ですが、すべてに対する答えではありません。
ティムグッドマン

14
「LINQはハンマーであり、すべての問題は釘である」という類推は、それを少し押しやりすぎていると思います。LINQは非常に優れたハンマーであり、作業の大部分が釘に関係している場合、溝に差し込むことができ、ねじをたたいただけでは気付かないでしょう。あなた悪いプログラマーでなくても。
カーソン63000

@Aaronaught:一方、長いフィールド名でのXMLの使用は、低帯域幅で信頼性の低い無線リンクを介したデータ伝送には最適ではないと思われました。繰り返しになりますが、それはその製品のデータベース設計についても私が考えたことです。
デヴィッドソーンリー

10

LINQは、より機能的なアプローチを使用して問題を解決する上で、C#で本当に良い機会を提供すると思います。すでに機能するものがあるからといって、新しいスタイルの問題解決を放棄すべきではありません。

SQLのバックグラウンドが重いため、C#でセットベースのロジックを使用して、操作の意図をより適切に説明するオプションがあります。

それは言った; コンテキストは王様であり、何でも使いすぎる可能性があります。


誰が解雇していますか?私は常にLinqを使用しています。明らかにそれが反復ベースであり、セットベースではない問題に対して、それを使用している(または使用しようとしている)人の発生数に関心があるだけです。
アーロンノート

私は、SQLで記述する必要のある問題を解決しようとしており、カーソルではなくセットベースのロジックを使用して解決することに非常に慣れています。ツールの不正使用は常に発生しますが、少なくとも、貧弱な手続き型コードの代わりに貧弱なLINQコードを記述すれば、後続バージョンの.NETは少なくともそれを簡単に並列化できると思います。
dotjosh

2

LINQとjQueryは最新の「おもちゃ」であり、開発者は最新のものを使用してどのように作業できるかを披露するのが大好きです。


私はこの声明に同意します。この特定の現象を説明しているかどうかはよくわかりません。これらの質問をしている人々は、本当に見せびらかすタイプではないようです-他のプログラマーがなぜ質問に答えようとするのかを説明するのに役立ちますが、賢明なアプローチを提唱するのではありません。
アーロンノート

@Aaronaught-ええ、私は人々がこのアプローチを使用して質問で答える理由をもっと考えていたと思います。
ダンディプロ

2

Linqを適切に使用し、内部でそれを理解すれば、あらゆる種類の新しい最先端のプログラミング手法が見つかります

そのため、この機能強化について深く考えた場合、より優れたプログラマーになると思います。特定のプログラマが実際にこれを行うかどうかは、Linqのせいではありません。

オブジェクトリレーショナルマッパーに対しても同じ引数を使用できます。誰もが実際にデータベーステーブルに対して生のSQLクエリを書いているのでしょうか?:)


10
ちょっと、生のSQLを書く... スニッフ
アーロンノート

2
Raw SQLは、自分が何をしているのかを知っている場合の最善策です。
Fosco

1
「あなたをより良いプログラマにする」という議論に対して+1。linqと、特にlinqをサポートするメソッドを理解することで、非常に役立つプログラミングの概念を理解しやすくなりました。
ジョンMガント

1
私は誰かがORM対生のSQLコメントに腹を立てたと思います。それは私ではありませんでした。私は両方を使用しますが、この発言は冗談だと理解しました。
アーロンノート

1
ORMが書いたがらくたに対する複雑なデータベースクエリは決して信用しません。単純なものには問題ありませんが、タイプクエリの報告には不向きです。繰り返しますが、自分が何をしているかを知っている誰かの手に、ORMは良いことです。
HLGEM

1

これらの非常識なもののいくつかは、人々が間違ったハンマーを使用しているためであり、他の人は本当にエレガントなスーパーハンマーを構築しているためですが、克服する必要がある奇妙な詳細に遭遇しました。

たとえば、linqを使用して動的linqを生成し、非動的linqに対して10回のうち9回使用することに関する質問が表示された場合、その人は可能であれば好奇心が強いか、間違ったツリーをbarえますが、いくつかありますこの方法で解決でき、他の方法では解決できないほど難しいもの。

私はこの種の質問を2つの部分に分けます。

  1. それを行うことができますか、もしそうならそれはどのようになりますか
  2. それが行われるべきか、リスクがあるか、またはより良い代替案があるか

私はほとんどの場合、その順序でそれらを行うことがわかりました。質問に答え、また、潜在的な代替案をより適切に説明するのに役立ちます。


0

私は開発者の心に麻痺する効果については知りませんが、ここで率直なツール/言語の影響を調べます。バーを下げることについて話してください!


0

私はメイソン・ウィーラーに同意します。ただし、「シーケンス」を操作してhttps://stackoverflow.com/questions/3762202/get-range-of-integers-with-linqを解決しようとするのは完全にクレイジーではありません 。問題は、Javaと.Netのイテレーターが3つの操作(現在の値、次の値、次への移動)をすべてサポートしていないことです。Clojureは3つ​​すべてを実行できますが、Clojureではこれを正しく行う方が簡単だと思います。Pythonにもコルーチンがありますが、これをクラックしてみてください。http://clojure.org/sequences http://www.try-clojure.org/

実際、入力がhttp://oeis.org/A007401などの無限シーケンスである場合、レイジーが唯一の方法です。


「Linq」は「イテレータ」や「怠laz」を意味するわけではありません-実際、Linqの大部分は式ツリーに関するものです。必要に応じて、C#でコードをあまり使用せずに、クロージャーを使用して独自の3値またはN値の集計を簡単に実装できます。問題は、人々が実際にそれを行う方法、または開始する方法すらわからず、System.Linq名前空間に住む魔法の呪文を探しているときです。
アーロンノート

@Aaronaught ... '' '"Linq"は必ずしも「反復子」も「遅延」も意味しません' ''-LinqはSQLのように見えますが、この構文シュガーは実際のILコードにコンパイルされます。 、一緒に接続されたIEnumerable [<T>]の束に相当します。そのようなものは怠け者であり、他の言語ではイテレーターと呼ばれる列挙子を使用します。しかし、はい、問題はLINQによりコーディングが簡単に見えるようになり、資格のない人が試してみることです。一部の人はおそらくまともなプログラマになるかもしれません。C#が第一言語であり、完全な初心者である場合は、大きな言語を扱っています。
ジョブ

もちろん、Linq to Objects(Linq to SQL、Linq to Entities、Linq to DataSet、またはLinqのその他のブランチではありません)は、イテレーターと遅延実行に基づいていますが、それはすべて内部にあります。Iteratorブロックとyieldステートメントは、デリゲートと同様、Linqの前に存在していました。クロージャーはLinqと同じリリースで提供されましたが、実際にはローカル変数のキャプチャを必要とする純粋な "Linq"操作はほとんどありません。「[Linqで[完全に反復的な操作/機能の説明]を実行するにはどうすればよいですか?] Linq自体(意図されていること)と言語自体の両方に対する深い無知を裏切っています。
アーロンノート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.