반응형

개발공부 120

[Effective C#] 아이템 45 : 메서드가 실패했음을 알리기 위해서 예외를 이용하라

메서드가 요청된 작업을 제대로 수행하지 않는 경우 예외를 발생시켜서 실패가 있음을 알려야 한다. 반환 코드를 이용하여 오류를 보고하는 방식보다 예외를 이용하는 방법이 더 나은 이유 오류 코드를 이용하는 경우 사용자가 쉽게 무시할 수 있다. 오류 코드를 검사하고 활용하는 코드 때문에 정상적인 실행 흐름을 방해한다. 그래도 일반적인 실행 흐름을 제어하는 메커니즘으로 예외를 사용해서는 안된다. 반환 코드 특징 반환 코드를 이용하는 방식은 메서드의 원형에 영향을 미친다. 반환 코드는 계산의 결과를 나타내는 용도로 사용되므로 오류가 발생했다는 사실 이외에 추가적인 정보를 전달하기 어렵다. 메서드 호출자에 의해 처리된다. 예외 특징 예외는 클래스 타입이므로 개발자가 자신만의 예외 타입을 파생시킬 수 있고, 오류에 ..

개발공부/C# 2021.12.20

[클린코드] 클래스

클래스 내 작성 순서 static public 상수 static private 변수 private instance 변수 public 함수 공개 변수가 필요한 경우는 거의 없다. 비공개 함수는 자신을 호출하는 공개 함수 직후에 넣는다. 즉, 추상화 단계가 순차적으로 내려간다. 클래스 크기 줄이는 방법 단일 책임원칙(Single Responsibility Principle) 클래스가 책임지어야 하는건 단 하나뿐이다. 소수의 큰 클래스보다 많은 작은 단위의 클래스로 이뤄진 시스템이 더 바람직하다. 클래스 이름에 해당 클래스의 역할을 명확하게 기술한다. 높은 응집도(Cohesion) 응집도가 높다: 클래스에 속한 메서드와 변수가 서로 의존한다. 논리적인 단위로 묶인다. 낮은 결합도 각 시스템 요소가 다른 요소로..

[Effective C#] 아이템 43: 쿼리 결과의 의미를 명확히 강제하고, Single()과 First()를 사용해라

Single() : 정확히 하나의 요소만 반환한다. 만약 쿼리 결과에 어떤 요소도 포함되지 않거나, 여러 개의 요소가 포함되는 경우에는 Single()은 예외를 유발한다. First() : 하나의 요소만 반환 될 것을 기대하지만, 때로는 여러 개의 값이 반환 되는 경우를 허용하고 싶을 때 사용한다. 시퀀스가 비어있는 경우 예외를 발생시킨다. FirstOrDefault() : 하나의 요소만 반환 될 것을 기대하지만, 때로는 여러 개의 값이 반환 되는 경우를 허용하고 싶을 때 사용한다. 시퀀스가 비어있는 경우 기본값을 반환한다. 특정 위치에 있는 요소를 찾을 때 고려해야 할 것 쿼리를 구성하기 위한 다른 속성이 있는지 결과 시퀀스가 IList를 지원하는지 인덱스 작업을 지원하는지

개발공부/C# 2021.12.18

[Effective C#] 아이템 42 : IEnumerable<T> 데이터 소스와 IQueryable<T> 데이터 소스를 구분하라

IQueryable와 IEnumerable는 거의 동일한 API 정의를 갖기 때문에 상호 교환 가능하다. 하지만 이 두 인터페이스는 동작 방식도 매우 다르고 성능도 차이 난다. 결과값은 동일하지만 동작 방식은 다른 예시 //where 절과 order 절이 모두 결합된 단일의 T-SQL 구문을 만들어서 데이터베이스를 한 번만 호출 var q = from c in dbContext.Customers where c.City == "London" select c; var finalAnser = from c in q orderby c.Name select c; 일반적인 LINQ to SQL 쿼리. LINQ to SQL 라이브러리가 모든 쿼리문을 결합하여 단번에 SQL 결과를 생성한다. IQueryable 기능을 ..

개발공부/C# 2021.12.17

[클린코드] 깨끗한 테스트 규칙 FIRST

깨끗한 테스트 규칙은 다음 다섯 가지 규칙을 따른다. 빠르게(Fast) 테스트는 빨라야 한다. 테스트가 느리면 자주 돌리기 힘들기 때문이다. 테스트를 마음껏 하지 못하면 문제를 찾는데 느려지고 코드 품질이 망가진다. 독립적으로(Independent) 테스트는 서로 의존하면 안된다. 하나의 테스트가 실패하면 나머지도 잇달아 실패하기 때문이다. 이럴 경우 실패의 원인을 파악하기 어려워진다. 반복 가능하게(Repeatable) 테스트는 어떤 환경에서도 반복 가능해야 한다. 실제 환경, QA 환경, 네트워크가 연결되지 않은 노트북 등... 환경을 타지 않아야 한다. 자가 검증하는(Self Validating) 테스트는 bool값으로 결과를 내야 한다. 스스로 성공과 실패를 자동적으로 판단해야 테스트 결과 확인이..

[Effective C#] 아이템 40 : 지연 수행과 즉시 수행을 구분하라

선언적 코드와 명령형 코드 선언적 코드: 해설적이며 무슨 작업을 해야 하는지 정의한다. 명령형 코드: 어떻게 작업을 수행해야 하는지 단계별로 세분화해서 기술한다. 필요한 매개변수를 모두 계산한 다음, 메서드를 호출한다. 명령형 코드에서 작업 진행 순서 var answer = DoStuff(Method1(), Method2(), Method3()); DoStuff()의 첫 번째 매개변수를 생성하기 위해 Method1()을 호출한다. DoStuff()의 두 번째 매개변수를 생성하기 위해 Method2()을 호출한다. DoStuff()의 세 번째 매개변수를 생성하기 위해 Method3()을 호출한다. 앞서 계산된 매개변수를 이용하여 DoStuff()를 호출한다. 3개의 메서드를 모두 호출한다. 선언적 코드 작..

개발공부/C# 2021.12.15

[Effective C#] 아이템 38 : 메서드보다 람다 표현식이 낫다.

람다 표현식과 메서드 비교 var allEmployees = FindAllEmployees(); // 20년 이상 근속자 var earlyFolks = from e in allEmployees where e.Classification == EmployeeType.Salary where e.YearsOfService >= 20 where e.MonthlySalary < 4000 select e; // 20년 미만 근속자 var newest = from e in allEmployees where e.Classification == EmployeeType.Salary where e.YearsOfService < 20 where e.MonthlySalary < 4000 select e; 람다 표현식의 단점 동일..

개발공부/C# 2021.12.13

[Effective C#] 아이템 37 : 쿼리를 사용할 때는 즉시 평가보다 지연 평가가 낫다.

지연 평가와 즉시 평가 쿼리를 정의하면 결과 데이터나 시퀀스를 즉각적으로 얻어오지 않는다. 그저 어떤 과정으로 작업을 수행할지 절차를 정의하는 것이다. 지연 평가: 쿼리의 결과를 이용해서 순회를 순행해야 결과가 생성되는 것 즉시 평가: 일반 변수를 사용하는 것처럼 즉각적으로 값을 얻어오는 것 지연 평가와 즉시 평가의 차이 예시 1 시퀀스 생성 후 두 차례에 걸쳐 순회하는 코드 private static IEnumerable Generate( int number, Func generator) { for (var i = 0; i < number; i++) yield return generator(); } private static void LazyEvaluation() { WriteLine($"Start t..

개발공부/C# 2021.12.12

[Effective C#] 아이템 36 : 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라

Where() 조건을 걸어 만족하는 요소를 추려내는 필터 역할을 한다. var smallNumbers = numbers.Where(n => n n); var squares = numbers.Select(n => new { Number = n, Square = n * n }); OrderBy() 정렬에 사용된다. ThenBy() OrderBy로 정렬 후 재 정렬이 필요할 때 사용된다. var people = employees.Where(e => e.Age > 30). OrderBy(e => e.LastName). ThenBy(e => e.FirstName). The..

개발공부/C# 2021.12.11

[Effective C#] 아이템 35 : 확장 메서드는 절대 오버로드하지 마라

확장 메서드를 사용하는 경우 대부분 기존에 개발된 타입을 개선하기 위해 사용한다. 동작 방식 변경을 위한 게 아니다. 확장 메서드를 잘못 사용한 예 확장 메서드를 이용하여 클래스를 확장하는 경우 namespace ConsoleExtensions { public static class ConsoleReport { public static string Format(this Person target) => $"{target.LastName, 20}, {target.FirstName, 15}"; } } 네임스페이스를 달리하여 확장 메서드를 추가로 정의하는 경우 namespace XmlExtensions { public static class XmlReport { public static string Format..

개발공부/C# 2021.12.10