"추상화
어떤 양상, 세바 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 복잡성을 다루기 위해 추상하는 두 차원에서 이뤄진다.
- 첫 번째 차원은 구체적인 사물들 간 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.
- 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.
모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점을 기억하라."
객체지향의 사실과 오해 77p
"객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다. 이것이 객체를 객체답게 만드는 가장 핵심적인 원칙이다."
객체지향의 사실과 오해 95p
"차이점은 배제하고 공통점만을 강조함으로써 이들을 공통의 타입인 트럼프 인간으로 분류했다"
"트럼프 인간을 좀 더 단순한 관점에서 바라 보기 위해 불필요한 특성을 배제하고 좀 더 포괄적인 의미를 지닌 트럼프로 일반화했다"
객체지향의 사실과 오해 101p
이 문장들을 읽다가 문득 Service계층이 떠올랐다. 지금까지 Service를 인터페이스를 정의하고 ServiceImpl로 구현하는 방식으로 개발했다. 처음엔 별 생각 없었는데 메서드 추가할 때마다 일일이 Service인터페이스에 추상 메서드 선언하고 ServiceImpl로 가서 다시 구현하는 게 꽤 번거로웠다. 이를테면 PostService인터페이스를 다른 Service와 공유해서 사용하는 것도 아니고 PostServiceImpl에서만 사용하는데 굳이 인터페이스를 선언하고 Impl에서 구현하는 방식으로 개발하는 방식에 대한 의문이 들었다. 인터페이스, 즉 추상화가 여러 객체가 가진 공통점을 뽑아내어 일반화하는 것이라면, PostServieImpl클래스에 대한 추상 계층인 PostService인터페이스를 만드는 것은 과연 효율적인가? 하는 생각이 든다.
차라리 Post, User, Comment Service를 만드는데 모두 CRUD기능을 가지고 있으니 이것을 CrudService라는 인터페이스로 추상화해서 각각 서비스 클래스가 이를 구현하는 방식으로 개발한다면 좀 더 납득이 될 것 같다.