TS스터디 이펙티브 item36~37

온호성·2023년 4월 16일
0

👻item 36 해당 분야의 용어로 타입 이름 짓기

ts에서 타입 이름을 지을 때는 해당 분야에서 사용되는 용어와 규약을 따르는 것이 좋다. 이를 통해 코드의 가독성과 이해도를 높일 수 있다. 엄선된 타입, 속성, 변수 이름은 의도를 명확히하고 코드와 타입의 추상화 수준을 높여줘야한다. 잘못 선택한 타입 이름은 코드의 이름을 왜곡하고 잘못된 개념을 심어준다.

타입 속성, 변수에 이름을 붙일 때 명심해야 할 세 가지 규칙

  • 동일한 의미를 나타낼 때는 같은 용어를 사용해야 한다.

-> 의미적으로 구분되어야 하는 경우에만 다른 용어를 사용하자.

  • 모호하고 의미없는 이름은 피하자.

-> data, info, thing, item, object, entity 같은 모호한 이름은 피해야한다. 만약 그 용어가 해당 분야에서 특별한 의미를 가지면 괜찮지만, 귀찮다고 의미없는 이름을 붙이면 안된다.

  • 포함된 내용이나 계산 방식이 아니라 데이터 자체가 무엇인지 고려해야 한다.

-> 예를 들어, INodeList 보다는 Directory가 더 의미있는 이름이다. Directory는 구현 측면이 아니라 개념적인 측면에서 디렉터리를 생각하게 한다. 좋은 이믈은 추상화 수준을 높이고 의도치 않은 충돌의 위험성을 줄인다.

-요약-

  • 가독성을 높이고 추상화 수준을 올리기 위해 해당 분야의 용어를 사용해야 한다.

  • 같은 의미에 다른 이름을 붙이면 안된다.

🙈item 37 공식 명칭에는 상표 붙이기

구조적 타이핑에 의해서 가끔은 원치 않은 결과가 나오거나 코드가 실행될 수 있다.
따라서 공식 명칭에는 상표를 붙여야한다.
->덕 타이핑 을 사용하기에 값을 세밀하게 구분하지 못하는데 이부분을 해결하기 위해
(구조적 타이핑이란 타입의 일부분만 일치하면 통과하는 것을 의미한다. )

interface Vector2D {
  x: number;
  y: number;
}
function calculateNorm(p: Vector2D) {
  return math.sqrt(p.x * p.x + p.y * p.y);
}
calculateNorm({ x: 3, y: 4 }); // 정상, 5
const vec3D = { x: 3, y: 4, z: 1 };
calculateNorm(vec3D); // 정상, 5

위 코드는 구조적 타이핑 관점에서는 문제가 없지만 수학적으로 따지면 2차원 벡터를 사용해야 이치에 맞는다. 3차원 벡터를 허용하지 않게 하려면 공식 명칭을 사용하면 된다.
이러한 경우 ‘상표(_brand)’를 이용한다. 이 기법은 타입 시스템에서만 동작하여 런타임 오버헤드를 줄이는 효과가 있다.

nterface Vector2D {
  _brand: "2d";
  x: number;
  y: number;
}
function vec2D(x: number, y: number): Vector2D {
  return { x, y, _brand: "2d" };
}
function calculateNorm(p: Vector2D) {
  return math.sqrt(p.x * p.x + p.y * p.y);
}
calculateNorm(vec2D(3, 4)); // 정상, 5
const vec3D = { x: 3, y: 4, z: 1 };
calculateNorm(vec3D); // x '_brand'속성이 ... 형식에 없음

-요약-

  • 구조적 타이핑(덕 타이핑) 때문에 값을 세밀하게 구분하지 못하는 경우가 있다.

  • 상표 기법은 타입 시스템에서 동작하지만 런타임에 상표를 검사하는 것과 동일한 효과를 얻을 수 있다.

0개의 댓글

관련 채용 정보