Viele von uns haben dieses Phänomen vor ungefähr einem Jahr bei jQuery festgestellt, als die Leute fragten, wie man absolut verrückte Dinge wie das Abrufen der Abfragezeichenfolge mit jQuery macht . Der Unterschied zwischen der Bibliothek (jQuery) und der Sprache (JavaScript) geht offensichtlich bei vielen Programmierern verloren und führt dazu, dass eine Menge unangemessener, verschlungener Code geschrieben wird, wo dies nicht erforderlich ist.
Vielleicht ist es nur meine Einbildung, aber ich schwöre, dass ich allmählich eine Zunahme der Fragen sehe, bei denen Leute fragen, ob sie mit Linq ähnlich verrückte Dinge tun sollen, wie beispielsweise Bereiche in einer sortierten Anordnung zu finden . Ich kann nicht übersehen, wie gründlich unangemessen die Linq-Erweiterungen zur Lösung dieses Problems sind, aber was noch wichtiger ist, dass der Autor gerade davon ausgegangen ist, dass die ideale Lösung Linq beinhalten würde, ohne darüber nachzudenken (soweit ich das beurteilen kann). Es scheint, dass wir die Geschichte wiederholen und eine neue Generation von .NET-Programmierern hervorbringen, die den Unterschied zwischen der Sprache (C # / VB.NET) und der Bibliothek (Linq) nicht erkennen können.
Was ist für dieses Phänomen verantwortlich? Ist es nur ein Hype? Elster Tendenzen? Hat Linq einen Ruf als eine Art Magie erlangt, bei der man, anstatt Code zu schreiben, nur die richtige Beschwörung aussprechen muss? Mit diesen Erklärungen bin ich kaum zufrieden, aber mir fällt eigentlich nichts anderes ein.
Was noch wichtiger ist, ist es wirklich ein Problem, und wenn ja, wie kann man diese Menschen am besten aufklären?
quelle
Antworten:
Das liegt im Grunde daran, dass das Programmieren von Grund auf schwierig ist. Es erfordert eine Menge logischer, strukturierter Überlegungen, von denen viele einfach nicht wissen, wie sie zu machen sind. (Oder kann es einfach nicht, je nachdem, wem du zuhörst.)
Dinge wie LINQ und jQuery vereinfachen bestimmte übliche Datenmanipulationsaufgaben erheblich. Das ist großartig für diejenigen von uns, die wissen, was wir tun, aber der unglückliche Nebeneffekt ist, dass es die Messlatte senkt. Es erleichtert Menschen, die keine Ahnung haben, was sie tun, Code zu schreiben und Dinge zum Laufen zu bringen. Und wenn sie dann in die Realität geraten und etwas grundlegend Schwieriges finden, für das ihre einfachen Techniken auf hoher Abstraktionsebene nicht gut geeignet sind, sind sie verloren, weil sie die Plattform, auf der ihre Bibliothek aufbaut, nicht verstehen.
Ihre Frage ist irgendwie auf dem richtigen Weg, aber ähnlich wie die ewige Kontroverse über gewalttätige Videospiele "Kinder gewalttätig machen", hat sie die Richtung des Links nach hinten. Einfache Programmiertechniken machen Programmierer nicht dumm. Sie ziehen einfach dumme Leute zum Programmieren an. Und da kann man wirklich nicht viel machen.
quelle
Für mich ist es das neue Spielzeugphänomen. Es kommt etwas Neues heraus (LINQ) und jetzt will jeder Entwickler damit spielen.
Sie sehen LINQ als Hammer und jedes Problem ist ein Nagel. Wen interessiert es, ob es einfacher ist, es anders zu machen? LINQ muss die Antwort sein! Als ob jeder XML für ALLES benutzt hätte! Konfigurationsdatei? XML. Daten speichern? XML. Etc
quelle
Ich denke, LINQ bietet in C # eine wirklich gute Möglichkeit, Probleme mithilfe eines funktionaleren Ansatzes zu lösen. Wir sollten keine neue Art der Problemlösung ablehnen, nur weil wir bereits etwas haben, das funktioniert.
Ich komme aus einem starken SQL-Hintergrund und mag die Option, setbasierte Logik in meinem C # zu verwenden, um die Absicht meiner Operationen besser zu beschreiben.
Das gesagt; Der Kontext ist König und alles kann überbeansprucht werden.
quelle
LINQ und jQuery sind die neuesten "Spielzeuge" und Entwickler lieben es, zu zeigen, wie sie mit den neuesten Dingen Sachen machen können.
quelle
Wenn Sie Linq richtig verwenden und es verstehen, werden Sie alle möglichen neuen Programmiertechniken finden.
Wenn Sie also tief über die Verbesserungen nachdenken, behaupte ich, dass dies Sie zu einem besseren Programmierer macht. Ob ein bestimmter Programmierer dies tatsächlich tut oder nicht, ist nicht Linqs Schuld.
Dasselbe Argument kann für objektrelationale Mapper angegeben werden. Schreibt jemand wirklich noch rohe SQL-Abfragen für Datenbanktabellen? :)
quelle
Einige dieser verrückten Dinge sind, weil die Leute den falschen Hammer benutzen, andere, weil sie einen wirklich eleganten Superhammer bauen, aber sie sind auf ein seltsames Detail gestoßen, das überwunden werden muss.
Wenn Sie beispielsweise eine Frage zur Verwendung von linq zur Generierung von dynamischem linq gegen nicht dynamisches linq sehen, ist die Person entweder nur neugierig, ob es möglich ist, oder sie bellt den falschen Baum an, aber es gibt einige Dinge, die Sie auf diese Weise lösen können, sind so schwer zu lösen, dass sie nicht zumutbar sind.
Ich beantworte diese Art von Fragen in zwei Teilen:
Ich habe festgestellt, dass ich sie fast immer in dieser Reihenfolge mache. Es beantwortet die Frage und hilft Ihnen, mögliche Alternativen besser zu erklären.
quelle
Ich kenne keinen betäubenden Effekt auf den Verstand der Entwickler, aber wirf einen Blick darauf , wie sich betäubende Tools / Sprachen auf die Raten auswirken. Sprechen Sie über das Senken der Messlatte!
quelle
Ich stimme Mason Wheeler zu. Es ist jedoch nicht ganz verrückt zu versuchen, https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linq zu lösen, indem man eine "Sequenz" bearbeitet. Das Problem ist, dass die Iteratoren von Java und .Net nicht alle drei Operationen unterstützen: aktueller Wert, nächster Wert und Verschieben zum nächsten. Clojure kann alle 3, und ich vermute, dass es in Clojure einfacher ist, dies richtig zu machen. Python hat auch Co-Routinen, und ich möchte versuchen, das zu knacken. http://clojure.org/sequences http://www.try-clojure.org/
In der Tat, wenn die Eingabe eine unendliche Folge ist, wie zum Beispiel http://oeis.org/A007401 , dann ist faul der einzige Weg.
quelle
System.Linq
Namespace lebt .yield
Anweisung existierten vor Linq, ebenso wie Delegierte. Closures wurden in derselben Version wie Linq ausgeliefert, aber nur wenige reine "Linq" -Operationen erfordern tatsächlich die Erfassung lokaler Variablen. Fragen zu "Wie kann ich [Beschreibung der vollständig iterativen Operation / Funktion] mit Linq ausführen?" Verrät eine tiefe Unkenntnis sowohl von Linq selbst (was es tun soll) als auch der Sprache selbst.