클래스 설계 : 모든 것과 연결되는 설계 기반

hjoon·2024년 3월 25일
0

3장: 클래스 설계

클래스 설계 : 모든 것과 연결되는 설계 기반

3.1 클래스 단위로 잘 동작하도록 설계하기

바람직한 클래스 설계하기를 드라이기에 빗대어 설명할 수 있다.

  • 드라이어에는 목적에 맞고, 제품이 손상되지 않은 범위 내에서 조작할 수 있는 버튼이 노출되어 있다.
    클래스 설계 또한 버그가 발생하지 않는 내에서 최소한의 목적에 맞는 메소드만 노출해야 한다.

클래스는 인스턴스 변수메소드로 구성된다.

  • 메소드는 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작할 수 있어야 한다.

클래스는 자기 방어를 해야한다.

  • 스스로 초기화를 하고 유효성 검사를 할 수 있어야 한다.

3.2 성숙한 클래스로 성장시키는 설계 기법

class Money {
  final int amount; // 인스턴스 변수를 immutable 하게 final로 제한
  final Currency currency;

  Money(int amount, Currency currency) { // 생성자 정의
    validate(amount, currency); // guard 
    this.amount = amount;
    this.currency = currency;
  }

  Money add1(final int amount) { // 계산 로직은 클래스 내부 메소드로 구현
    return new Money(this.amount + amount, currency); // 값을 변경하려면 새로운 인스턴스를 만들어내라
  }

  Money add2(final Money money) { // 독자적인 자료형을 파라미터로 전달해라
    validateCurrency(money.getCurrency());
    return new Money(this.amount + money.getAmount(), currency);
  }
}

생성자로 정상적인 값을 설정해라

  • default 생성자로 객체를 생성하면, 값이 초기화되지 않는 raw data object를 유발하게 된다.
  • 클래스 내의 변수를 모두 초기화하는 생성자를 정의해라 -> 해당 생성자로 객체를 생성하도록 해라!

생성자 내부에 validation 역할의 guard 코드를 정의해라

  • 잘못된 값이 변수에 할당되기 전에 곧바로 예외를 발생시켜 버그를 미리 잡아라

클래스 변수에 관련된 계산 로직을 클래스 메소드로 구현해라

  • 로직이 외부에 노출되어있는거 자체가 "응집도가 낮은 구조"이다.

인스턴스 변수를 immutable하게 만들어라

  • 예상하지 못한 부수 효과를 막기 위해 인스턴스 변수를 final로 정의해라

메소드의 매개변수와 지역변수를 모두 immutable하게 만들어라

엉뚱한 값을 전달하지 않기 위해 기본 자료형이 아닌 독자적인 자료형을 정의하여 파라미터로 전달해라

  • int, String과 같은 기본 자료형이 아니라 Money처럼 독자적인 자료형을 정의해라
  • 파라미터가 기본 자료형이라면, 부주의할 경우 버그에 쉽게 노출된다.

의미없는 메소드를 추가하지 말아라!!

  • 시스템 사양에 필요하지 않는 메소드를 "선의"로 추가하지 말아라!!!

3.4 프로그램 구조의 문제 해결에 도움을 주는 디자인 패턴

응집도가 높은 구조로 만들거나, 잘못된 상태로부터 프로그램을 방어하는 설계 방법을 디자인 패턴이라고 한다.

이 책에서 소개하는 몇 가지 디자인 패턴

  • 완전 생성자 : 인스턴스를 잘못된 상태로부터 보호
  • 값 객체 : 특정한 값과 관련된 로직의 응집도를 높임
  • strategy : 조건 분기를 줄이고, 로직을 단순화 함
  • policy : 조건 분기를 단순화하고, 더 자유롭게 만듦
  • 일급 컬렉션 : 값 객체의 일종. 컬렉션과 관련된 로직의 응집도를 높임
  • sprout class : 기존 로직을 변경하지 않고 안전하게 새로운 기능을 추가함

완전 생성자 (complete constructor)

잘못된 상태로부터 클래스를 보호하기 위한 디자인 패턴이다

  • default 생성자로 객체를 생성한다면, 쓰레기 객체를 만들 위험성이 매우 높아진다.
  • 그 위험성을 방지하기 위해 인스턴스 변수를 모두 초기화하도록 완전 생성자를 정의한다.

값 객체 (value object)

값을 클래스로 나타내는 디자인 패턴이다.

  • 값과 그에 대한 로직을 하나로 모아 응집도가 높은 구조를 만들 수 있다

완전 생성자 & 값 객체는 객체 지향 설계에서 폭 넓게 사용되는 기법이다.

0개의 댓글