📖 book

엘레강트 오브젝트 1.1 -er로 끝나는 이름을 사용하지 마세요

인피니 2022. 3. 3. 02:10

클래스는 객체의 팩토리이다.

 

이 챕터에서 이해할 부분은 클래스는 객체의 팩토리라는 것이다.

클래스는 객체를 생성하는데 이것을 클래스가 객체를 인스턴스화 한다고 표현

책에서 간단하게 클래스에서 생성자가 표현된 코드를 보여준다.

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

Cash five=new Cash(5);

위의 예제는 Factory 패턴이라고 부르는 디자인 패턴과 다른 패턴

왜 위의 예제는 Factory라고 부르는 디자인 패턴과 다른 것인가?

→ new 연산은 오로지 객체라고 불리는 클래스의 인스턴스를 생성하는 것뿐이라...

 

Java에서 Factory 패턴이란?

  • new 연산자를 확장한 것처럼 동작
  • Factory패턴은 부가적인 로직을 더할 수 있기 때문에, new 연산자를 보다 유연하고 강력하게 만들 수 있음
  • ex)
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");
	}
}

→ Factory패턴과 new 연산자가 크게 다르지 않은 점을 알 수 있다.

객체를 생성할 때는 new를 사용하지만 객체 생성전.. 로직을 추가할 수 있다는 장점이 존재 즉 위에서 말한 것처럼 코드가 유연해진다.

 

클래스는 객체의 팩토리이다

  • 저자는 팩토리 패턴이 기술적으론 타당한 개념이지만, 개인적으로 팩토리 패턴을 선호하진 않다고 주장
  • 클래스를 객체의 능동적인 관리자로 생각해야 한다는 것
  • 즉 객체를 살아있는 생명체로 생각한다면 클래스는 객체의 어머니이다

클래스의 이름을 짓는 적절한 방법

  • 클래스의 이름은 객체가 노출하고 있는 기능에 기반해서는 안된다.
  • 즉 클래스의 이름은 무엇을 하는지(What he does)가 아니라 무엇인지(What he is)에 기반해야 한다.
  • ex) 클래스 이름을 잘못 작성한 예 ( 클래스의 이름이 기능에 기반해 만들어진 예)
class CashFormatter{
	private int dollars;
	CashFormatter(int dlr){
		this.dollars=dlr;
	}
	public String format(){
		return String.format("$ %d",this.dollars);
	}
}
  • 해당 클래스의 이름을 어떻게 바꿔야 할까? 해당 클래스가 무엇인지 생각해보자..
  • Cash를 생각할 수 있다.
  • 왜 클래스는 객체가 노출하고 있는 기능에 기반하면 안 되는 걸까?
    • 나만의 생각... CashFormatter처럼 클래스에 기능의 이름이 들어가면 해당 객체가 하는 일이 보여 좋을 수 있지만 formatter 역할을 제외하고 더 이상 기능을 확장하기 힘들다.
  • ex) 클래스의 이름을 잘 작성한 예
class Cash{
	private int dollars;
	CashFormatter(int dlr){
		this.dollars=dlr;
	}
	public String usd(){
		return String.format("$ %d",this.dollars);
	}
}

책에서는 메서드 이름 또한 format에서 usd로 변경했는데 왜 바꾸는 건지... 모르겠다.

  • 클래스의 이름이 ‘-er’로 끝난다면 이 클래스의 인스턴스는 실제로 객체가 아니라 어떤 데이터를 다루는 절차들의 집합일 뿐이 됨
  • 따라서 해당 객체가 무엇인지에 집중해 이름을 작성하도록 하자