책에서 새로 알게된 정보들을 나열합니다.
P24~25
var result = Displacement(.523, 65, 4);
이처럼 하드 코딩된 값을 매직 넘버(magic number) 라 부른다. 의미나 목적에 관한 어떠한 설명도 존재하지 않기 때문이다. 이 매직 넘버들은 더 나은, 이름 있는 변수로 바꿔서 그 목적을 분명하게 할 수 있지만 이 메서드의 호출자는 여전히 인수들을 잘못된 순서로 제공할 수 있다.
호출자 코드의 순서 오류를 방지하는 일반적인 방법은 각 인수에 매개변수 이름을 지정하는 것이다.
…
var result = Displacement(elapsedTime: 4, speed: 65, angle: .523);
…
이 기법에서는 명확함을 확보할 책임을 메서드의 호출자(caller)에게 전가한다.
요약: C# 4.0의 명명된/선택적 인수 기능을 적극적으로 사용하자. 문법적으로 semantic을 좀 더 강조할 수 있다.
P26
이는 강박적 기본 타입 사용(Primitive Obsession) 이 라는 나쁜 코드의 일종으로, int, double, string과 같이 해당 언어에 내장된 기본 타입에 과도하게 의존하는 코드를 말한다.
…
강박적 기본 타입 사용의 잘 알려진 해결책은 구분된 목적에 맞는 고유한 타입을 제공해 이들 사이에서 암묵적 변환이 일어나지 않도록 보장하는 것이다.
…
public struct Angle
{
public double Size { get; set; }
}
public struct Speed
{
public double Amount { get; set; }
}
요약: 너무 기본 타입에만 의존하지말고 간단한 타입도 새로 정의해서 쓰자.
P27
…
Speed와 Angle 타입은 그들의 값을 캡슐화 하지 않는다. 이들의 값은 공개적으로 변형 할 수 있는(mutable) Size와 Amount 속성을 노출하기 때문이다.
…
var result = Displacement(angle: new Angle { Size = .523 },
speed: new Speed { Amount = 65 },
elapsedTime: seconds);
공개적인 속성을 사용해서 값을 설정하는 방법은 불필요하게 장황하다.
…
public struct Speed
{
public Speed(double amount) => Amount = amount;
public double Amount { get; set; }
}
public struct Angle
{
public Angle(double size) => Size = size;
public double Size { get; set; }
}
var result = Displacement(new Angle(.523), new Speed(65), seconds);
Displacement 메서드를 호출할 때 Angle과 Speed 인스턴스를 생성하는데, 이때 이들의 순서는 더이상 모호하지 않으며, 인수에 이름을 붙이는 것이 더이상 중요하지 않다.
이 생성자들은 표현식 바디 문법(expression body syntax) 를 사용한다. 이 문법은 메서드의 경우 C# v6.0, 생성자의 경우 C# v7.0 이후에 사용할 수 있다.
…
요약: 공개 속성이라도 생성자를 통해 ‘의미있게’ 값을 초기화하자. 의미있게에 포인트를 둔다면 이것이 깨달음이 있는 방법일 것이고 모로가나 서울로만 가면 된다고 하면 중요하지 않을 것이다.
링크:
- C# 6.0: C#의 역사 | Microsoft Learn
- 표현식 본문 정의: 람다 연산자 - ‘=>’ 연산자는 람다 식을 정의하는 데 사용됩니다. - C# reference | Microsoft Learn
- C# 7.0: C#의 역사 | Microsoft Learn
- 확장된 식 본문 멤버: 식 본문 멤버 - C# | Microsoft Learn