2012-06-06 3 views
1

다음과 같은 코드가 있습니다. ->Select case using LINQ - [인터넷에서 가져온] 실제 코드가 아닙니다. LINQ를 사용하여 사례 선택 개념을 표시하려고합니다. 조건이 내가 새로운 목록을 만드는 오전에 따라 내 코드에서 는C#/LINQ/Select Case : 코드 냄새입니까?

Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 }; 

var numberText = 
(
    from n in numbers 
    where n > 0 
    select new 
    { 
     Number = n, 
     Text = 
     (
      n == 1 ? "One" : 
      n == 2 ? "Two" : 
      n == 3 ? "Three" : "Unknown" 
     ) 
    } 
); 

개체를하지만, 페이지 here 말한다 - "다형성과 조건을 바꾸기".

그래서, 문제는 구현의 같은 종류의 코드 냄새이며이 항상 엄격히 피해야 여부? LINQ는 컬렉션을 반복하고 새로운 개체를 조건부로 만드는 동안 확실한 선택입니다. 잘못 될 수 있습니까?

+1

코드가 잘 보이네 – Alex

+4

하지만 조건이 유형에 따라 다르면 참조 페이지에서 다형성으로 조건을 바꾸라고 말합니다. 이 조건은 값이 아닌 유형에 따라 다르므로 페이지가 적용되지 않습니다. –

+1

코드에 32 비트 부호있는 정수의 전체 ASCII * 표현을 포함시키려는 계획이 아니라면 꽤 나쁜 냄새라고 말할 수 있습니다.) – Polynomial

답변

1

근본적인 차이가 있습니다. LINQ는 (질문에서 보여준 것처럼) 콜렉션을 쿼리 할 수있게 해주는 API입니다. 스위치 (또는 다른 조건부) 문은 프로그램 흐름을 제어하는 ​​데 사용됩니다.

일부 유형을 기반으로 프로그램 흐름을 제어하는 ​​많은 조건문이있을 때 리팩터링 코드에 대해 언급하고있는 페이지입니다.이 경우 모든 조건을 일부 다각형으로 바꾸고 싶을 수도 있습니다. . 따라서이 경우에는 코드 냄새가 있습니다. 그러나 LINQ 문에서 조건문을 사용하는 것은 괜찮습니다. LINQ를 구조화하는 데는 여러 가지 방법이 있습니다. 일부는 다른 것보다 성능이 좋고 일부는 다른 것보다 더 잘 읽을 수 있지만 LINQ에서 조건문을 사용하는 것은 코드 냄새라고 말하지는 않습니다.

+2

그러나 이것은 답변보다 더 많은 코멘트입니다. –

+0

@RobertMS ::하지만, 스위치 또는 Linq 또는 if-else를 통해 조건부 로직을 달성하든간에 모든 로직이 잘못 되었습니까? 질문은 LINQ에 관한 것이 아닙니다. 문제는 매번 이러한 모든 종류의 로직이 다형성 구현으로 변환 될 수 있는지 여부입니다. 구현에 특화된 질문이 아니라 개념적인 질문입니다. –

+0

@Tim Schmelter - 동의, 조금 확장했습니다 ... – RobertMS

-1

여기에 질문은 없습니다.

위치 'D'에있는 switch 문에 'D'본문에만 관련이있는 데이터가 포함되어있어 LINQ 절의 목적에 매우 부합 할 수있는 독립성이있는 경우 그러나 나는 E, F 또는 G의 파생 된 문이 선택적으로 A, B, C, D, E의 논리를 결합 할 수 있으므로 LINQ 절 외부에서 호출 할 수있는 첫 번째 클래스 function으로 'D'를 승격하는 것이 좋습니다. , F 또는 G 또는 이들의 임의 조합을 포함 할 수있다.

이렇게하면 동일한 논리를 다시 사용하여 반복되는 논리를 아래로 접고 코드 재사용을 높일 수 있습니다.

또한 Generic 스타일 스위치를 수행하는 함수가 값 유형간에 다양한 형변환을 캡슐화하는 데 유용하다는 것을 알 수 있습니다.

일반적으로 같은 논리는 코드를 다시 사용하려는 경우 다음 레이블이 function 또는 일류 function되지 이미있는 경우에 위치로 이동 function 선언에 적용됩니다. 두 가지 기술을 결합하여 다양한 마이크로 사용자 정의에 적합하며 일반적으로 폴드 스루와 goto 문과 결합 할 때 상태 시스템을 아주 적은 노력으로 프로그래밍 할 수 있습니다.

LINQ를 닫으면 더 큰 집합을 선택하거나 필터링 할 수 있지만 명시 적으로 선언하지 않으면 선택 또는 필터가 수행되는 논리를 대체 할 수 없습니다 ... 논리의 유용성에 따라 어떤 경우에 이전에 언급 한대로 고용인을 홍보 할 것입니다.

은 추가 다형성의 추가 오버 헤드 ...

없이이 아니 코드 냄새를 언급하지 않는하지만 냄새 나는 것입니다 ..필터링 된 열거 형을 기반으로하는 튜플을 반환 할 수 있었고 다형성을 사용하여 캡슐화하지 않아도되었습니다.

0

게시 한 기사가 정확하지만 해당 기사가 귀하의 검색어에 전혀 적용되지 않습니다. 조건부 진술 문이 사용됩니다. 예에서

는 전체 방법 (및 전체 개체) 는 (심지어 그 목적을 나타낸다 _type을 명명) 객체의 하나 개 값에 기초하여 동작을 변경한다. 실제로 다형성의 경우입니다. _type 필드 대신에 각 유형을 나타내는 다른 클래스가있어 스위치 문을 불필요하게 만들 수 있습니다.

그러나 귀하의 경우에는 하나의 가치에서 다른 가치로의 전환 일뿐입니다.
전체 개체의 동작은 변경되지 않습니다.
조건부 논리를 쿼리 본문 밖으로 이동시키는 일부 변환기를 구현한다고 생각할 수도 있지만 그렇지 않은 경우 코드는 문제가 없습니다.

+0

.... 정확히 뭐라고 말 했나요? 어떤 대답이 이것입니까? 이것은 어떻게 질문에 대한 답변을 시도합니까? 게으른 ... 많은 개선이 필요합니다. – Jay

+0

@ Botz3000 ::하지만 조건에 따라, 새 목록 개체를 만드는 경우 어떻게해야합니까? 나는이 물건과 실제로 약간 혼란 스럽다. –

+0

@AngshumanAgarwal 무슨 뜻인지 이해가 안됩니다. 텍스트 Text 속성에 지정 하시겠습니까? 또는 결과의 일부로'List '을 돌려 주시겠습니까? 링크 된 기사에서는 모든 조건문을 다형성으로 대체해야한다고 말하지 않습니다. 조건부 대신 다형성을 사용하는 것이 적절한 경우 좋은 예를 보여줍니다. 예제와 같은 쿼리에서 조건문을 사용하면 코드 냄새가 없으며 괜찮습니다. – Botz3000