본문 바로가기
Java/Elegant Objects

[엘레강트 오브젝트] 1. 출생 - (1) '-er'로 끝나는 이름을 사용하지 마세요

by 잭피 2021. 9. 1.

객체는 자신의 가시성 범위안에서 살아갑니다

if (price < 100) { 	
	Cash extra = new Cash(5); 
	price.add(extra); 
}

스스로가 extra라면 price는 나를 둘러싸고 있는 주변 세계입니다

1.1 -er로 끝나는 이름을 사용하지 마세요

클래스는 객체의 팩토리입니다

클래스는 객체를 생성합니다 → 클래스가 객체를 인스턴스화한다라고 표현합니다

class Cash { 
	public Cash(int dollars) { ... } 
} 

Cash five = new Cash(5)

new는 객체의 팩토리를 제어할 수 있는 원시적인 수단입니다

널리 알려진 팩토리 패턴은 new 연산자를 대신해서 사용할 수 있는 더 강력한 옵션이기는 하지만, 개념적으로 팩토리 패턴과 new 연산자는 동일합니다

Java 언어에서 팩토리 패턴은 new 연산자를 확장한 것처럼 동작합니다

new 연산자가 실행되기 전에 부가적인 로직을 더할 수 있기 때문에, new 연산자를 보다 유연하고 강력하게 만들 수 있습니다

class Shapes {
	public Shape make(String name) {
		if (name.equals("circle")) {
			return new Circle();
		}

		if (name.equals("rectangle") {
			return new Rectangle();
		}
		
		throw new IllegalArgumentException("not found");
	}
}

전형적인 팩토리로 타입명을 이용해 객체를 인스턴스화합니다

팩토리에서도 객체를 생성하는 최종 단계에서는 여전히 new 연산자를 사용합니다 즉, 팩토리 패턴과 new 연산자가 크게 다르지 않습니다

클래스를 객체의 능동적인 관리자로 생각해야 합니다

클래스는 객체를 꺼내거나 반환할 수 있는 위치이기 때문에, 클래스를 저장소라고 말하고 싶습니다

잘못된 클래스 이름

class CashFormatter {
	private int dollars;
  CashFormatter(int dlr) {
		this.dollars = dlr;
	}
  public String format() {
		return String.format("$ %d", this.dollars);
	}
}

클래스의 객체가 하는 일은 dollar에 저장된 금액을 문자열로 포맷팅하는 것입니다

그래서 포맷터(formatter)로 이름을 짓기로 결정했습니다

클래스의 이름은 객체가 노출하고 있는 기능에 기반해서는 안됩니다 클래스의 이름은 무엇을 하는지가 아니라 무엇인지에 기반해야 합니다

예를들어, Cash, USDCash, CashInUSD와 같은 이름으로 바꿔야 하고, 메서드 format()은 usd()로 수정해야 합니다

제대로 지어진 클래스 이름

class Cash {
	private int dollars;
	Cash(int dlr) {
		this.dollars = dlr;
	}
	public String usd() {
		return String.format("$ %d", this.dollars);
	}
}

다시 말해서, 객체는 그의 역량으로 특징지어져야 합니다 키, 몸무게, 피부색과 같은 속성이 아니라, 제가 할수 있는 일을 설명해야 합니다

여기에 숨어있는 악마는 바로 접미사 '-er' 입니다

객체는 객체의 외부 세계와 내부 세계를 이어주는 연결장치가 아닙니다

객체는 캡슐화된 데이터의 대표자입니다

 

클래스 이름이 -er로 끝난다면, 이 클래스의 인스턴스는 실제로는 객체가 아니라 어떤 데이터를 다루는 절차들의 집합일 뿐입니다

이것은 과거 C, COBAL, Basic 등의 언어를 사용하다 전향한 많은 객체지향 개발자로부터 물려받은 절차적인 사고 방식입니다

클래스 이름을 올바르게 지으려면, 클래스의 객체들이 무엇을 캡슐화할 것인지를 관찰하고 이 요소들에 붙일 적합한 이름을 찾아야 합니다

Example) 임의의 숫자 리스트가 존재할 때, 이 리스트의 요소 중에서 소수를 찾는 알고리즘을 만든다고 가정해봅시다

오직 소수만으로 구성된 리스트를 얻는 것이 목적이라면 클래스 이름은 Primer, PrimeFinder, PrimeChooser 등이 아니라 PrimeNumbers라고 지어야 합니다

새로운 클래스 이름을 붙일 때는 무엇을 하는지가 아니라 무엇인지를 생각하자

 

이 글은 학습을 위해 “엘레강트 오브젝트" 책 내용을 정리한 글입니다.

저작권 관련 문제가 있다면 바로 삭제하도록 하겠습니다

댓글