본문 바로가기
반응형

전체 글109

[Effective C#] Item 36 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 LINQ는 쿼리 언어와 그 쿼리 언어를 일련의 메서드 집합으로 변환하는 2개의 핵심 구조를 기반으로 한다. C# 컴파일러는 쿼리 언어로 작성된 쿼리 표현식을 메서드 호출 구문으로 변환해준다. C#은 쿼리 표현식 패턴에 포함된 개별 메서드가 어떤 의미를 가지고 있는지 전혀 개의치 않는다. 예로 들어 컴파일러는 Where()과 같은 메서드가 쿼리 표현식의 패턴에서 의도하는 동작을 온전히 수행하는지를 확인하지 않으며, 구문상의 오류만을 확인할 뿐이다. 따라서 유효한 구조의 메서드라 하더라도 그 메서드가 우리가 의도하는 바를 제대로 구현하고 있는지를 컴파일러가 확인할 수 없다. 따라서 우리는 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 제대로 알아둘 필요가 있다. where : Wher() where는 .. 2023. 2. 23.
[Effective C#] Item 35 확장 메서는 절대 오버로드 하지 마라 확장 메서드는 설계 의도를 드러내는 방법으로는 썩 훌륭하지 않다. 확장 메서드를 사용하는 대부분의 경우가 기존에 개발된 타입을 개선하기 위해서이지 타입의 본질적인 동작 방식을 변경하기 위해서는 아니기 때문이다. 왜 확장 메서드로 타입을 확장해서는 안 되는가? 확장 메서드를 이용하여 인터페이스에 대한 기본 구현체를 제공하는 것이 괜찮은 방법인 것은ㅇ 분명하지만 타입을 확장하기 위한 용도로 사용하는 것은 적절하지 않다. 확장 메서드를 과도하게 사용하거나 잘못 사용하면 메서드 충돌로 인해 유지보수 비용이 급격하게 증가하는 곤경에 처할 수 있기 때문이다. 예시) Person 클래스 public sealed class Person { public string FirstName { get; set; } public.. 2023. 2. 1.
[Effective C# Item 34] 함수를 매개변수로 사용하여 결합도를 낮춰라 보통의 경우엔 클래스 내의 메서드를 정의하기 위해서 베이스 클래스나 인터페이스를 정의하고 이렇게 정의된 내용을 기반으로 코딩한다. 하지만 이 외에도 '함수를 매개변수로 취하는 방식'을 활용한다면 기존의 컴포넌트나 라이브러리와 함께 사용해야 하는 코드를 개발할 때 상당히 큰 도움이 된다. 왜 함수를 매개변수로 취하는가? 함수를 매개변수로 취하게 되면 우선 개발자가 더 이상 구항 타입(concreate type)을 작성할 필요가 없다. 오히려 추상화된 정의를 통해 종속성을 다루는 것을 의미한다. 그리고 API를 좀 더 단순하게 만들 수 있다. 실제로 델리게이트를 사용하여 컴포넌트의 계약을 기술하면 클라이언트 측에서 코드를 사용하기가 쉬워진다. 또한 의존성을 낮춰 단위 테스트를 수행하기 쉬워지고 다른 환경에서.. 2023. 1. 10.
[Effective C# Item 33] 필요한 시점에 필요한 요소를 생성하라 이터레이터 메서드가 입력 변수로 반드시 시퀀스를 받을 필요는 ㅇ벗다. 이터레이터 메서드를 구현할 때 새로운 시퀀스를 출력하기 위해 yield return을 자주 사용하는데 이 과정에서 입력 시퀀스를 활용하는 대신 새로운 팩토리 메서드를 이용할 수도 있다. 작업을 수행하기 전에 필요한 요소를 모두 생성해서 컬렉션에 저장해두는 대신 필요할 때마다 개발 요소를 생성하는 식이다. 이 방법으로 코드를 작성하면 사용되지 않을 요소를 미리 생성하는 것을 피할 수 있다. 1. 정숫값의 시퀀스 생성 static IList CreateSequence(int numberOfElements, int startAt, int stepBy) { var collection = new List(numberOfElements); for.. 2022. 12. 12.
반응형