@)참고
마틴 파울러 - 리팩터링 Code Smell 3.1 에서는 코드 악취 기본형 집착 Primitive Obession 를 소개한다.
이 냄세는 프로그래머가 적절한 캡슐화를 제공하지 않고 기본형 자료형만을 사용할 때 발생한다.
이 냄세는 문자열을 다루는 코드에서 특히 흔하다. 특히, Stringly Type 라는 이름 까지 붙었다.
사용자 클래스에서
전화번호를 단순히 문자 집합으로만 표현 하기엔 아쉬움이 많다.
이메일역시 단순히 문자 집합으로 표현 하기에도 아쉬움이 많다.
The original sin
public class Person { private final String title; private final String givenName; private final String familyName; private final String email; public Person(String title, String givenName, String familyName, String email) { this.title = title; this.givenName = givenName; this.familyName = familyName; this.email = email; } ... }
Person person = new Person("john@doe.me", "John", "Doe", "Sir");
public Person(String givenName, String familyName, String email) { this(null, givenName, familyName, email); } Person another = new Person("Sir", "John", "Doe");
→ 7.3 기본형을 객체로 바꾸기
이때 얻는 부차적인 효과는 왕왕 사람들을 놀라게 한다.
Solving the problem the OOP way
public class Title { private final String value; public Title(String value) { this.value = value; } } public class GivenName { private final String value; public FirstName(String value) { this.value = value; } } public class FamilyName { private final String value; public LastName(String value) { this.value = value; } } public class Email { private final String value; public Email(String value) { this.value = value; } } public class Person { private final Title title; private final GivenName givenName; private final FamilyName familyName; private final Email email; public Person(Title title, GivenName givenName, FamilyName familyName, Email email) { this.title = title; this.givenName = givenName; this.familyName = familyName; this.email = email; } ... } Person person = new Person(new Title(null), new FirstName("John"), new LastName("Doe"), new Email("john@doe.me"));
That way drastically limits the possibility of mistakes. The drawback is a large increase in verbosity - which might lead to other bugs.
…
나는 단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의하는 편이다. 시작은 기본형 데이터를 단순히 감싼 것과 큰 차이가 없을 것이라 효과가 미미하다. 하지만 나중에 특별한 동작이 필요해지만 이 클래스에 추가하면 되니 프로그램이 커질수록 점점 유용한 도구가 된다. 그리 대단해 보이지 않을지 모르지만 코드베이스에 미치는 효과는 놀라울 만큼 크다.
함수에 문자열 리터럴을 건네는 건 악취로 봐야 한다.