Имеет ли Linq ошеломляющий эффект для программистов .NET?

36

Многие из нас начали видеть это явление с jQuery около года назад, когда люди начали спрашивать, как сделать абсолютно безумные вещи, такие как получение строки запроса с помощью jQuery . Разница между библиотекой (jQuery) и языком (JavaScript), по-видимому, утеряна многими программистами и приводит к тому, что много неуместного, запутанного кода пишется там, где это не нужно.

Может быть, это только мое воображение, но я клянусь, я начинаю видеть рост числа вопросов, когда люди просят сделать такие же безумные вещи с Linq, например, найти диапазоны в отсортированном массиве . Я не могу понять, насколько неуместны расширения Linq для решения этой проблемы, но что более важно, тот факт, что автор просто предполагал, что идеальное решение будет включать в себя Linq, даже не задумываясь об этом (насколько я могу судить). Кажется, что мы повторяем историю, порождая новое поколение программистов .NET, которые не могут отличить язык (C # / VB.NET) от библиотеки (Linq).

Что ответственно за это явление? Это просто обман? Сороки склонности? Получил ли Linq репутацию формы магии, где вместо того, чтобы писать код, нужно просто произнести правильное заклинание? Я вряд ли удовлетворен этими объяснениями, но я не могу думать ни о чем другом.

Что еще более важно, действительно ли это проблема, и если да, то как лучше всего помочь просветить этих людей?

Aaronaught
источник
6
+1 за «предполагается, что идеальное решение будет включать в себя Linq, даже не задумываясь об этом». Это действительно за мной.
Жак Преториус
1
Линк медленно ...
2
@Pierre: На каком основании вы делаете это требование?
Aaronaught
5
@ Мейсон: Это абсолютно ужасный тест, написанный кем-то, кто явно не знает, что делает. Бенчмаркинг в клещах? Венгерская нотация? И версия Linq даже не делает то же самое, она пытается повторить каждый результат, вместо того, чтобы останавливаться на первом. Не говоря уже о том, что вся посылка глупа, как это было случайно обсуждено в горячем вопросе сегодняшнего дня .
Aaronaught
3
И, кстати, @Mason, в Linq встроено много оптимизаций. Практически для любого метода, который может быть оптимизирован, он сначала ищет интерфейс, поддерживающий оптимизированный метод. Для других основанных на множестве методов, таких как equijoins, он создает хеш-таблицы. Он не оптимизирует ваш код для вас, но и не замедлит ваш код; большинство фактических задокументированных замедлений в реальном мире происходят из-за лямбд / закрытий, которые не зависят от Linq.
Aaronaught

Ответы:

52

Это в основном потому, что программирование принципиально сложно. Это требует много логических, структурированных мыслей таким образом, что многие люди просто не знают, как это сделать. (Или просто не могу, в зависимости от того, кого вы слушаете.)

Такие вещи, как LINQ и jQuery, значительно облегчают выполнение некоторых общих задач по обработке данных. Это отлично подходит для тех из нас, кто знает, что мы делаем, но неприятный побочный эффект заключается в том, что он снижает планку. Людям, которые не имеют представления о том, что они делают, легче начать писать код и заставить его работать. И затем, когда они сталкиваются с реальностью и находят что-то принципиально сложное, для чего их простые методы высокого уровня абстракции не очень хорошо подходят, они теряются, потому что они не понимают платформу, на которой построена их библиотека.

Ваш вопрос как бы на правильном пути, но во многом напоминает многолетнюю полемику о насильственных видеоиграх «превращая детей в насильственных», он имеет направление обратной ссылки. Простые методы программирования не делают программистов глупыми; они просто привлекают глупых людей к программированию. И на самом деле вы ничего не можете с этим поделать.

Мейсон Уилер
источник
30
+1 за «Простые методы программирования не делают программистов глупыми; они просто привлекают глупых людей к программированию».
Стивен Эверс
1
Отличительной особенностью LINQ является то, что она позволяет мне создавать прототипы решения в функциональном подходе. Затем, когда у меня есть решение без ошибок, я могу использовать его в качестве тестового стенда для оптимизированной императивной версии. Если задача достаточно проста, например, применить один фильтр, я даже не буду беспокоиться.
ChaosPandion
5
Я все еще сомневаюсь, что LINQ привлекает некомпетентных программистов - из того, что я видел, это кажется одной из самых сложных концепций для новичков, чтобы понять - но, похоже, это лучший ответ на данный момент.
Aaronaught
1
Вы должны поставить авторское право на это последнее предложение. Хорошо сказано, сэр.
AJ Джонсон
1
Веселая. Для меня LINQ не является концепцией, которую особенно легко освоить. Если вы делаете что-то неважное, очень быстро вам нужно перестать думать о руле и начать понимать передачу. Я смотрю на тебя, Ламдас!
Брайан Маккей
13

Для меня это новый игрушечный феномен. Появляется что-то новое (LINQ), и теперь каждый разработчик хочет поиграть с этим.

Они считают LINQ молотком, а каждая проблема - гвоздем. Кому интересно, проще ли это сделать по-другому? LINQ должен быть ответом! Например, когда все использовали XML для ВСЕГО! Файл конфигурации? XML. Хранение данных? XML. И т. Д.

PSU_Kardi
источник
5
Не желая начинать дебаты по XML здесь, но стоит отметить, что XML действительно хорош в обеих этих вещах. Это не всегда оптимально - если файлы конфигурации не нужно структурировать, тогда лучше использовать KVP, а если совместимость между приложениями не требуется, тогда двоичный формат явно лучше для хранения / сериализации. Но я не думаю, что XML является таким хорошим примером, потому что он, как правило, использовался в областях, где он был просто неоптимальным, а не абсолютно неуместным.
Aaronaught
4
+1: стоит потянуть свои инструменты, чтобы увидеть, сколько проблем можно втиснуть в форму гвоздя, когда вы изучаете технологию.
Стивен Эверс
+1: Другими примерами такого рода магического молотка являются jQuery (как упоминалось в вопросе) и регулярные выражения. Не то чтобы эти вещи плохие, на самом деле они действительно полезны, но они не являются ответом на все вопросы.
Тим Гудман
14
Я думаю, что аналогия «LINQ - это молоток, а каждая проблема - гвоздь», слишком далеко заходит. Я бы сказал, что LINQ - это такой хороший молоток, что, когда большая часть вашей работы связана с гвоздями, вы можете попасть в паз и не заметить, что вы просто забили винт. Даже если вы не плохой программист.
Carson63000
@Aaronaught: С другой стороны, использование XML с длинными именами полей показалось мне неоптимальным для передачи данных по малополосной и не совсем надежной радиосвязи. Опять же, это также то, что я думал о дизайне базы данных для этого продукта.
Дэвид Торнли
10

Я думаю, что LINQ предлагает действительно хорошую возможность в C # решать проблемы, используя более функциональный подход. Мы не должны отклонять новый стиль решения проблем только потому, что у нас уже есть что-то, что работает.

Исходя из обширного опыта работы с SQL, мне нравится иметь возможность использовать логику, основанную на множестве, в моем C #, чтобы лучше описать цель моих операций.

Это сказал; контекст - король, и все, что угодно, может быть злоупотреблено.

dotjosh
источник
Кто увольняет? Я использую Linq все время, меня беспокоит количество случаев, когда я вижу людей, использующих его (или пытающихся его использовать) для задач, которые явно итеративны и не основаны на множествах.
Aaronaught
Я очень привык пытаться решать проблемы, которые должны были быть написаны на SQL, и использовал для этого логику на основе множеств вместо курсоров. Злоупотребление инструментами всегда будет происходить, но я думаю, что, по крайней мере, если они будут писать плохой код LINQ вместо плохого процедурного кода, последующая версия .NET будет легче, по крайней мере, его распараллелить.
dotjosh
2

LINQ и jQuery - новейшие «игрушки», и разработчики любят демонстрировать, как они могут делать что-то, используя самые последние вещи.

Дэн Диплом
источник
Я согласен с этим утверждением. Я не уверен, объясняет ли это именно это явление. Люди, задающие эти вопросы, на самом деле не кажутся типичным понты - хотя это помогло бы объяснить, почему другие программисты пытаются отвечать на вопросы, а не отстаивать более разумный подход.
Aaronaught
@Aaronaught - Да, я думаю, я больше думал о том, почему люди отвечают на вопросы, используя этот подход.
Дэн Дип
2

Если вы правильно используете Linq и понимаете это под капотом, вы найдете все виды новых передовых методов программирования.

Поэтому, если вы глубоко задумаетесь об улучшениях, я утверждаю, что это делает вас лучшим программистом. Ли данный программист на самом деле делает это или нет, это не ошибка Линка.

Тот же аргумент может быть сделан для объектно-реляционных картографов. Кто-нибудь действительно пишет сырые SQL-запросы к таблицам базы данных? :)

Роберт Харви
источник
10
Эй, я пишу необработанный SQL ... нюхать
Aaronaught
2
Необработанный SQL - лучший выбор, если вы знаете, что делаете.
Фоско
1
+1 за аргумент «делает вас лучшим программистом». Понимание linq и особенно методов, которые его поддерживают, определенно улучшило мое понимание некоторых очень полезных концепций программирования.
Джон М Гант,
1
Я думаю, что кто-то обиделся на ORM против необработанного комментария SQL. Это был не я; Я использую оба, и я понял это замечание как насмешливое.
Аарона
1
Я бы никогда не доверил свои сложные запросы к базе данных дерьму, которое пишет ORM. Это хорошо для простых вещей, но тьфу для запросов типа отчетов. Опять же, в руках кого-то, кто знает, что они делают, ORM - хорошая вещь, в руках того, кто слишком ленив, чтобы разбираться в базах данных, - катастрофа впереди.
HLGEM
1

Некоторые из этих безумных вещей происходят из-за того, что люди используют неправильный молот, другие из-за того, что они строят действительно элегантный супер-молот, но они столкнулись со странной деталью, которую необходимо преодолеть.

Например, если вы видите вопрос об использовании linq для генерации динамического linq для использования против нединамического linq в девяти случаях из десяти, человеку либо просто любопытно, если это возможно, либо лай неправильного дерева, но есть несколько вещи, которые вы можете решить таким образом, которые трудно до такой степени неразумно решить иначе.

Я отвечаю на подобные вопросы в двух частях:

  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/sequence http://www.try-clojure.org/

На самом деле, если ввод представляет собой бесконечную последовательность, такую ​​как http://oeis.org/A007401 , ленивый является единственным способом.

работа
источник
«Linq» не обязательно означает ни «итераторы», ни «ленивые» - на самом деле большая часть Linq на самом деле относится к деревьям выражений. Вы можете легко, если хотите, реализовать свой собственный 3-значный или N-значный агрегат с замыканием и совсем небольшим количеством кода в C #. Проблема возникает, когда люди не знают, как на самом деле это сделать или даже как начать, и просто ищут какое-то волшебное заклинание, которое живет в System.Linqпространстве имен.
Aaronaught
@Aaronaught ... '' 'Linq "не означает ни" итераторы ", ни" ленивые ", обязательно"' "- ну, Linq может выглядеть как SQL, но этот синтаксический сахар компилируется в реальный код IL, который, если его декомпилировать , будет выглядеть эквивалентно куче IEnumerable [<T>], соединенных вместе. Этот материал ленив и использует перечислители, которые в других языках будут называться итераторами. Но да, проблема в том, что LINQ делает кодирование простым, а неквалифицированные пытаются это сделать. Некоторые все еще могут стать приличными программистами возможно. Если C # является их первым языком, и они всего лишь нубы, то они имеют дело с большим языком.
Работа
Конечно, Linq to Objects (не Linq to SQL, Linq to Entities, Linq to DataSet или любая другая ветвь Linq) основана на итераторах и отложенном выполнении, но это все под капотом. Блоки итераторов и yieldоператор существовали до Linq, как и делегаты. Замыкания пришли в том же выпуске, что и Linq, но немногие чистые операции "Linq" фактически требуют захвата локальной переменной. На вопрос "Как я могу сделать [описание полностью итеративной операции / функции] с Linq?" выдает глубокое незнание как самого Linq (что он должен делать), так и самого языка.
Aaronaught