목록C# (122)
방프리
Item 13 : 타입의 가시성을 제한하라 함수나 클래스를 생성할 때 쓸데없는 public 사용 남발을 주의해야 한다. 클린 코드란 책에서도 언급하지만 무분별한 public의 사용은 보안상에도 그다지 좋지 않고 다른 개발자들에게 라이브러리로 제공되었을 때 혼선을 주기가 쉽다. 때에 따라 private/protect/public을 골라쓰되 internal도 굉장히 좋으니 사용하길 권한다.
Item 12 : API에는 변환 연산자를 작성하지 말라 함수를 만들다보면 같은 동작을 하는 함수임에도 매개변수가 무한히 늘어나게 되는 함수를 볼 수 있다. 이를 위해 C에서는 ..., C#에서는 params를 통해서 해결하지만 이 챕터에서는 다른 방향을 제시한다. /////////////////////////////////////////////////변경하기 전 매개변수가 쓸데없이 늘어나는 코드 var wasted = Type.Missing; var wordApp = new Microsoft.Office.Interop.Word.Application(); wordApp.Visible = true; Documents docs = wordApp.Documents; Document doc = docs.Add(..
Item 11 : API에는 변환 연산자를 작성하지 말라 처음 객체지향을 배울 때 상속이라는 개념을 배운다. 이를 토대로 C#에서는 모든 데이터 타입은 System.Object 타입을 상속받고 있다. 보통 상속이라는 개념을 설명할 때에는 도형을 자주 빗대어 설명한다. public class Circle : Shape { private Point center; private double radius; public Circle() : this(new Point(), 0) { } public Circle(Point c, double r) { center = c; radius = r; } public override void Draw() { //... } static public implicit operator..
Item 10 : GetHashCode()의 위험성을 이해하라 GetHashCode()는 해시 기반 컬렉션에서 키의 해시값을 정의할 때에만 사용된다. HashCode는 변경 불가능한 값(Database의 Primary Key라 생각하면 쉬울 것 같다.)을 사용해야 하나, 제일 좋은 방법은 GetHashCode() 자체를 사용하지 않는 것이다. 하지만 부득이하게 사용해야할 경우 다음 세 가지 규칙을 따라 사용하는 것이 좋다. 1. 두 객체가 같다면(Equals() 인스턴스 메서드로 비교 시) 동일한 해시값을 생성해야 한다. 그렇지 않으면 컬렉션에서 객체를 찾는 데 해시 코드를 사용할 수 없다. 2. 모든 객체 a에 대해 a.GetHashCode()는 인스턴스 불변이어야 한다. a의 어떤 메서등를 호출하였든..
Item 9 : 다양한 동일성 개념들 사이의 상관관계를 이해하라 public static bool ReferenceEquals(object left, object right); public static bool Equals(object left, object right); public virtual bool Equals(object right); public static bool operator ==(MyClass left, MyClass right); 객체가 동일한지 비교할 때 위의 함수들을 사용할 수 있고, 각 함수들은 재정의될 수 있다. 또한 IEquatable와 IStructuralEquality를 통해 동일성을 재정의할 수 있다. 하지만 무작정 모든 함수를 재정의해서는 안된다. 위의 정적 함수인..
Item 8 : 익명 타입은 함수를 벗어나지 않게 사용하라 튜플은 굳이 각 필드 별로 네이밍을 할 필요가 없다. 하지만 기본적으로 설정되는 네이밍은 Item1, Item2와 같이 설정되므로 가독성을 올리기 위해서는 해주는 것이 좋다. static (T sought, int index) FindFirstOccurrence( IEnumerable enumerable, T value) { int index = 0; foreach (T element in enumerable) { if (element.Equals(value)) { return (value, index); } index++; } return (default(T), -1); } 물론 다른 방식으로도 네이밍 설정이 가능하다. // 결과를 튜플 변수에..
Item 7 : 튜플을 사용해서 타입의 사용 범위를 제한하라 간단한 기능을 구현할 때 또는 한 번 사용되고 추후 사용되지 않을 타입을 위해서 구조체나 클래스를 생성하는 건 너무나 비효율적이다. 이를 대체하기 위해 익명 타입과 튜플을 고려해보는 것도 좋다. 하나의 메서드의 반환 타입을 위해 또는 한 번 사용될만한 구조체를 쓸데없이 정의하는 것보다 더 가독성이 올라갈 것이다. //아래의 변수는 var aPoint = new { X = 5, Y = 67 }; //컴파일러가 다음과 같이 선언한다. internal sealed class AnonymousMumbleMuble { private readonly int x; public int X { get => x; } private readonly int y; p..
Item 6 : 속성을 데이터처럼 동작하게 만들라 C#에서는 속성이라는 기능을 통해 외부에서는 데이터 요소처럼 보이지만, 내부에서는 메서드로 구현되는 기능이 있다. public class MyClass { public int MyData { get; set; } } 속성을 사용할 때에는 get에서는 절대 데이터가 수정되지 않은 있는 그대로의 값을 반환해야 하며, set에서는 최대한의 연산만을 넣어야 한다. 그렇지 않으면 최적화에 영향을 미칠 뿐 아니라 멀티 쓰레드 환경에서 문제가 발생될 수도 있기 때문이다. 가장 기본을 잘 지킨 예를 한 번 살펴보자. public string LastName { get { return _lastName; } set { if (string.IsNullOrEmpty(valu..