Linq는 .NET 프로그래머에게 마음의 영향을 미칩니 까?


36

우리 중 많은 사람들 이 jQuery를 사용하여 쿼리 문자열을 검색하는 것과 같은 절대적으로 미친 일을하는 방법을 묻기 시작한 약 1 년 전에 jQuery 에서이 현상을보기 시작했습니다 . 많은 프로그래머들에게는 라이브러리 (jQuery)와 언어 (JavaScript) 의 차이점 이 사라지고, 필요하지 않은 곳에 부적절한 부적절한 코드가 작성됩니다.

어쩌면 그것은 단지 내 상상일지도 모르겠지만, 나는 사람들이 Linq와 비슷한 미친 짓 을하기 위해 정렬 된 배열의 범위 찾기 와 같은 질문을 많이 시작하기 시작했다고 맹세 합니다. Linq 확장이 그 문제를 해결하는 데 얼마나 부적절한지를 극복 할 수는 없지만 더 중요한 것은 저자 가 이상적인 솔루션이 실제로 Linq생각 하지 않고 Linq포함한다고 생각한다는 사실 을 알았습니다 (내가 말할 수있는 한). 언어 (C # / VB.NET)와 라이브러리 (Linq)의 차이를 알 수없는 차세대 .NET 프로그래머를 키워 역사를 반복하고있는 것 같습니다.

이 현상의 원인은 무엇입니까? 그것은 과대 광고입니까? 까치 경향? Linq는 마법의 형태로 명성을 얻었습니다. 실제로 코드를 작성하는 대신 올바른 주문을 말해야합니까? 나는 그 설명에 거의 만족하지 않지만 실제로 다른 것을 생각할 수는 없습니다.

더 중요한 것은 정말로 문제일까요? 그렇다면 사람들을 깨우는 가장 좋은 방법은 무엇입니까?


6
"최상의 솔루션은 실제로 생각하지 않고 Linq를 포함한다고 가정합니다." 그것은 정말로 저 너머입니다.
Jaco Pretorius

1
Linq는 느리다.

2
@ 피에르 : 어떤 근거로 그 주장을합니까?
Aaronaught

5
@Mason : 그것은 그들이하고있는 일을 명확하게 모르는 누군가가 작성한 끔찍한 벤치 마크입니다. 진드기에 벤치마킹 ? 헝가리 표기법? 그리고 Linq 버전도 같은 작업을 수행하지 않으며 처음부터 멈추지 않고 모든 단일 결과를 반복하려고 시도합니다. 말할 것도없이, 오늘날뜨거운 질문 에서 명백히 논의 된 바와 같이, 전제는 전적으로 바보 입니다 .
Aaronaught

3
Linq는 @Mason을 통해 많은 최적화 기능을 내장하고 있습니다. 최적화 할 수있는 거의 모든 방법에 대해 먼저 최적화 된 방법을 지원하는 인터페이스를 찾습니다. equijoins와 같은 다른 집합 기반 메서드의 경우 해시 테이블을 만듭니다. 코드 최적화하지는 않지만 코드 느리게 만들지는 않습니다. 실제 문서화 된 실제 속도 저하의 대부분은 Linq와 독립적 인 람다 / 클로즈로 인한 것입니다.
Aaronaught

답변:


52

기본적으로 프로그래밍이 어렵 기 때문입니다. 많은 사람들이 어떻게 해야할지 모르는 방식으로 논리적이고 체계적인 사고 방식이 필요합니다. (또는 당신이 듣는 사람에 따라 단순히 할 수 없습니다 .)

LINQ 및 jQuery와 같은 것들로 인해 일반적인 데이터 조작 작업이 훨씬 쉬워집니다. 우리가 무엇을하고 있는지 아는 사람들에게는 좋지만 불행한 부작용은 막대를 낮추는 것입니다. 코드 작성을 시작하고 일을하기 위해 무엇을하고 있는지 잘 모르는 사람들이 더 쉽게 만들 수 있습니다. 그리고 그들이 현실에 부딪쳤을 때, 그들의 단순하고 높은 수준의 어트랙션 레벨 기술이 적합하지 않은 근본적으로 어려운 것을 발견하면 라이브러리가 구축 된 플랫폼을 이해하지 못하기 때문에 길을 잃게됩니다.

귀하의 질문은 올바른 궤도에 있지만, 폭력적인 비디오 게임에 대한 다년간의 논쟁과 마찬가지로 "어린이를 폭력적으로 돌리기"와 비슷합니다. 링크의 방향이 거꾸로되어 있습니다. 쉬운 프로그래밍 기술은 프로그래머를 바보로 만들지 않습니다. 그들은 단지 바보 같은 사람들을 프로그래밍에 끌어들입니다. 그리고 당신이 할 수있는 일은 많지 않습니다.


30
+1 "쉬운 프로그래밍 기술은 프로그래머를 바보로 만들지 않으며, 바보 같은 사람들을 프로그래밍에 끌어 들이기 만합니다."
Steven Evers

1
LINQ의 장점 중 하나는 기능적 접근 방식으로 솔루션을 프로토 타입 할 수 있다는 것입니다. 그런 다음 버그가없는 솔루션이 있으면 최적화 된 명령형 버전의 테스트 벤치로 사용할 수 있습니다. 단일 필터를 적용하는 것처럼 작업이 충분히 단순하다면 귀찮게하지 않을 것입니다.
ChaosPandion

4
나는 여전히 LINQ가 무능한 프로그래머를 끌어 들이고 있다는 것을 의심하고있다. 내가 본 것으로부터 초보자가 이해하기 가장 어려운 개념 중 하나 인 것 같다.
Aaronaught

1
마지막 문장에 저작권을 넣어야합니다. 잘 말씀하셨습니다.
AJ Johnson

1
이상한. LINQ는 특히 마스터하기 쉬운 개념이 아닙니다. 미묘한 일을하는 경우 매우 빠르게 스티어링 휠에 대한 생각을 멈추고 변속기를 이해해야합니다. 나는 당신을보고있다.
Brian MacKay

13

나에게 그것은 새로운 장난감 현상이다. 새로운 것이 나오고 (LINQ) 이제 모든 개발자가 게임을 즐기고 싶어합니다.

그들은 LINQ를 망치로보고 있으며 모든 문제는 못입니다. 다른 방법으로하는 것이 더 쉬운 지 누가 신경 쓰나요? LINQ가 답이되어야합니다! 모두가 모든 것을 위해 XML을 사용했을 때처럼! 구성 파일? XML. 데이터 저장? XML. 기타


5
여기서 XML 토론을 시작하고 싶지는 않지만 XML이 실제로 두 가지 모두에 우수하다는 점을 지적 할 가치가 있습니다. 항상 최적 인 것은 아닙니다. 구성 파일을 구성 할 필요가 없으면 KVP가 더 뛰어나고 응용 프로그램 간 호환성이 필요하지 않은 경우 저장소 / 직렬화에 이진 형식이 더 좋습니다. 그러나 XML이 완전히 부적합한 것이 아니라 단지 차선책이었던 영역에서 사용되는 경향이 있기 때문에 XML이 좋은 예라고 생각하지 않습니다.
Aaronaught

3
+1 : 기술을 배울 때 손톱 모양에 몇 가지 문제가 생길 수 있는지 확인하기 위해 도구를 늘리는 것이 좋습니다.
Steven Evers

+1 : 이런 종류의 마술 망치의 다른 예는 jQuery (질문에 언급 된)와 정규 표현식입니다. 이러한 것들이 나쁘다는 것은 아니지만 실제로는 실제로 유용하지만 모든 것에 대한 답은 아닙니다.
Tim Goodman

13
"LINQ는 망치이고 모든 문제는 못"이라고 생각합니다. LINQ는 많은 양의 작업이 손톱과 관련이있을 때 그루브에 들어갈 수 있으며 나사로 망치는 것을 알지 못하는 좋은 망치 라고 말합니다 . 당신 나쁜 프로그래머 가 아니더라도 .
Carson63000

@Aaronaught : 반면에, 긴 필드 이름을 가진 XML을 사용하는 것은 저 대역폭과 완전히 신뢰할 수없는 무선 링크를 통한 데이터 전송에 적합하지 않은 것으로 보입니다. 그런 다음, 해당 제품의 데이터베이스 디자인에 대해서도 생각했습니다.
David Thornley

10

LINQ는 C #에서보다 기능적인 접근 방식을 사용하여 문제를 해결할 수있는 좋은 기회를 제공한다고 생각합니다. 우리는 이미 작동하는 것을 가지고 있기 때문에 새로운 스타일의 문제 해결을 무시해서는 안됩니다.

무거운 SQL 배경에서 온 C #에서 집합 기반 논리를 사용하여 작업의 의도를 더 잘 설명하는 옵션을 선호합니다.

그것은 말했다; 문맥은 왕이며, 무엇이든 남용 할 수 있습니다.


누가 닫고 있습니까? 나는 항상 Linq를 사용하고 있으며, 반복적이고 명확하지 않은 문제에 대해 사람들이 그것을 사용하거나 사용하려고 시도하는 횟수에 대해 걱정하고 있습니다.
Aaronaught

SQL로 작성해야 할 문제를 해결하고 커서 대신 세트 기반 논리를 사용하는 데 익숙합니다. 도구 남용은 항상 발생하지만 적어도 절차 코드가 아닌 잘못된 LINQ 코드를 작성하면 후속 버전의 .NET이 적어도 쉽게 병렬화 할 수 있다고 생각합니다.
dotjosh

2

LINQ 및 jQuery는 최신 "장난감"이며 개발자는 최신 작업을 사용하여 작업을 수행 할 수있는 방법을 과시합니다.


이 진술에 동의합니다. 그것이이 특정 현상을 설명하는지 확실하지 않습니다. 이러한 질문을하는 사람들은 실제로 과시 유형이 아닌 것 같습니다. 비록 다른 프로그래머 가 더 성가신 접근 방식을 옹호하는 대신 요청에 따라 질문 에 대답 하려고하는 이유를 설명하는 데 도움이됩니다 .
Aaronaught

@Aaronaught-예, 사람들 이이 접근법을 사용하여 질문에 대답하는 이유를 더 많이 생각하고 있다고 생각합니다.
Dan Diplo

2

Linq를 올바르게 사용하고 후드 아래에서 이해한다면 모든 종류의 새로운 최첨단 프로그래밍 기술을 찾을 수 있습니다.

따라서 개선 사항에 대해 깊이 생각하면 더 나은 프로그래머가 될 것이라고 주장합니다. 주어진 프로그래머가 실제로이 작업을 수행하는지 여부는 Linq의 잘못이 아닙니다.

객체 관계형 매퍼에 대해서도 같은 주장을 할 수 있습니다. 누구든지 더 이상 데이터베이스 테이블에 대해 원시 SQL 쿼리를 작성합니까? :)


9
이봐, 난 원시 SQL을 작성 ... sniff
Aaronaught

2
당신이하고있는 일을 알고 있다면 원시 SQL이 가장 좋습니다.
Fosco

1
"더 나은 프로그래머가된다"는 +1 linq와 특히 그것을 지원하는 방법을 이해하면 매우 유용한 프로그래밍 개념에 대한 이해가 확실히 향상되었습니다.
John M Gant

1
누군가 ORM 대 원시 SQL 주석에 공격을했다고 생각합니다. 내가 아니었다. 나는 두 가지를 모두 사용하며 그 말이 혀로 혀인 것으로 이해했다.
Aaronaught

1
ORM이 작성하는 쓰레기에 대한 복잡한 데이터베이스 쿼리를 절대 신뢰할 수는 없습니다. 간단한 작업에는 좋지만 유형 쿼리를보고하는 것은 좋지 않습니다. 다시 말하지만, ORM이하는 일을 아는 사람의 손에는 데이터베이스를 이해하기에는 너무 게으른 사람의 손에는 재난이 있습니다.
HLGEM

1

그 미친 것들 중 일부는 사람들이 잘못된 망치를 사용하고 있기 때문에, 다른 사람들은 정말 우아한 슈퍼 해머를 만들고 있기 때문에 극복해야 할 이상한 공 디테일을 겪었습니다.

예를 들어, linq를 사용하여 10 회 중 9 회까지 비 동적 linq에 대해 동적 linq를 생성하는 것에 대한 질문이 있으면 가능하면 궁금하거나 잘못된 나무를 짖는 사람이있을 수 있습니다. 이 방법으로 해결할 수있는 것들은 다른 방법으로는 해결하기 어려운 이유입니다.

나는 이런 종류의 질문을 두 부분으로 나눕니다.

  1. 그렇게 할 수 있다면, 어떻게 보일까요?
  2. 해야합니까, 위험이 있거나 더 나은 대안이 있습니까?

나는 거의 항상 그 순서대로 수행한다는 것을 알았습니다. 질문에 대한 답변을 제공하고 잠재적 대안에 대해 더 잘 설명 할 수 있도록 도와줍니다.


0

나는 개발자의 마음에 어떤 마비 효과를 알고 있지만 살펴하지 않습니다 여기에 환율 numble 생각을 가진 도구 / 언어의 효과. 바를 낮추는 것에 대해 이야기하십시오!


0

Mason Wheeler에 동의합니다. 그러나 "시퀀스"에서 작동하여 https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linq 를 해결하려고 시도하는 것이 완전히 미친 것은 아닙니다 . 문제는 Java 및 .Net의 반복자가 현재 값, 다음 값 및 다음으로 이동의 세 가지 작업을 모두 지원하지 않는다는 것입니다. Clojure는 3 가지를 모두 수행 할 수 있으며 Clojure에서는이 작업을 더 쉽게 수행 할 수 있다고 생각합니다. 파이썬에는 공동 루틴이 있으며, 그것을 해독하려고합니다. http://clojure.org/sequences http://www.try-clojure.org/

실제로 입력이 http://oeis.org/A007401 과 같은 무한 시퀀스 인 경우 게으른 방법이 유일한 방법입니다.


"Linq"는 "반복자"또는 "게으른"을 의미하지는 않습니다. 실제로 Linq의 대부분은 실제로 표현 트리에 관한 것입니다. 원하는 경우 C #에서 코드를 많이 사용하지 않고 클로저로 자체 3 값 또는 N 값 집계를 쉽게 구현할 수 있습니다. 사람들은 실제로 어떻게해야하는지, 심지어 시작하는 방법을 모르고 System.Linq네임 스페이스 에있는 마법의 주문을 찾고있을 때 문제가 발생 합니다.
Aaronaught

@Aaronaught ... '' ' "Linq"는 "반복자"또는 "게으른"을 의미하지는 않습니다 "' '-Linq는 SQL처럼 보일 수 있지만이 구문 설탕은 실제 IL 코드로 컴파일됩니다. , 함께 연결된 여러 IEnumerable [<T>]에 해당합니다. 그 물건은 게으르고 열거 형을 사용하는데, 다른 언어에서는 반복 자라고합니다. 그러나 문제는 LINQ가 코딩을 쉽게 보이고 자격이없는 것으로 시도한다는 것입니다. 일부는 여전히 괜찮은 프로그래머가 될 수 있습니다. C #이 모국어이고 완전히 멍청한 사람들이라면 큰 언어를 다루고 있습니다.
Job

물론 Linq to Objects (Linq to SQL, Linq to Entities, Linq to DataSet 또는 Linq의 다른 분기는 아님)는 반복자와 지연된 실행을 기반 으로하지만 모두 문제가됩니다. yieldLinq 이전 에는 반복자와 같은 블록과 명령문이 존재했습니다. 폐쇄는 Linq와 동일한 릴리스로 제공되었지만 실제 "Linq"작업은 실제로 로컬 변수 캡처를 필요로하지 않습니다. "Linq로 [반복 작동 / 기능 설명]을 어떻게 할 수 있습니까?" Linq 자체 (무엇을 의미하는지)와 언어 자체에 대한 깊은 무지를 배신합니다.
Aaronaught
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.