본문 바로가기

객체지향

좋은 객체란 무엇일까

 

클래스와 메소드를 최소한의 역할로 구분해야 한다
-> 적절한 책임과 역할의 분배가 필요하다
-> 객체지향적인 설계란 뭘까?
-> 좋은 객체를 구성하려면 어떻게 해야할까?

라는 생각에 도달했다. 그래서 좋은 객체가 뭔지 찾아보았다.
이 또한 정답이 있지않은 논쟁이 될 만한 부분들이 많지만,
확실한 건 고민없이 그냥 쓰는 사람보단 이 글을 읽은 내가 낫다는 것이다.

출처 : https://codingnuri.com/seven-virtues-of-good-object/
출처의 출처 : https://www.yegor256.com/2014/11/20/seven-virtues-of-good-object.html

 

 

1. 객체는 생명체이다.

객체는 생명체이다.

객체는 속성(상태, 특징)과 행위(행동, 동작, 기능)을 가진다.

 

컨트롤러, 파서, 필터, 검증기와 같은 유틸 클래스들은 객체와 함께 사용하기 위해 만든 것이다.

 

이를 보고 이런 결론에 도달했다.

-> 이들은 객체가 아니다.

-> 객체로 생성해서 쓸 수 없다.

-> 유틸클래스들은 static으로 선언하여 쓴다.

 

 

 

2. 객체는 계약에 따라 동작한다.

인터페이스를 구현하는 객체라면, 좋은 객체의 모든 공용 메서드는 인터페이스에 선언된 메서드를 구현해야 한다.

공용 메서드는 모두 인터페이스에 선언 되어 있어야 한다는 말.

 

 

 

3. 객체는 고유하다.

고유한 객체가 되기 위해서는 무언가를 캡슐화한 객체여야 한다.

객체를 두번 생성했을때, 두 객체가 같다면 이는 고유한 객체가 아니다.

 

 

 

4. 객체는 불변적이다.

좋은 객체는 캡슐화한 상태를 변하게 하지 않는다.

-> set~같은 설정자 메서드를 만들지 않는다.

 

 

 

5. 객체의 클래스에 정적 멤버가 없다.

정적 메서드(static)은 객체의 행위가 아닌 클래스의 행위를 나타낸다.

객체는 살아있는 생명이니 객체의 행위를 나타내야 한다.

 

클래스의 행위를 나타내는 것은 (static 메서드가 있는 것은) 유틸리티 클래스.

 

 

 

6. 객체의 이름이 직명을 나타내지 않는다.

객체의 변수명에서 무엇을 하는가를 나타내지 않는다.

몸 감싸개 대신 티셔츠, 책 펴는곳 대신 책상이라는 이름을 붙이는 것과 같다.

실제의 유의미한 이름을 부여한다.

 

-er을 붙인 작명은 좋지않다.

 

 

 

7. 모든 클래스는 final 아니면 abstract 클래스여야 한다.

 

final : 상속하여 확장이 불가능하다.

final이 없다면 누군가 우리의 클래스를 확장하여 나쁜짓을 저지를 수 있다.

 

abstract : 인스턴스를 만들 수 없다.

abstract는 이 자체로는 불완전하다는 것을 뜻하며, 추가 로직 구현이 필요하다는 것을 뜻한다.

또한 우리가 지정한 곳만 구현할 수 있다.