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