http://www.yes24.com/Product/Goods/3290339
소트웍스 앤솔러지라는 도서에는 나오는 객체지향적인 코드를 위한
현실적인 실현방법이 소개된다.
1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.
for, if, while 등등 한번 들어가면 한단계의 들여쓰기이다.
for문 안에 if문이 들어가면 2단계의 들여쓰기가 된다.
2. else 키워드를 쓰지 마라.
else를 이용한 분기처리는 가독성에 좋지 않다.
else에서 어떤일을 하는지 코드에서 한눈에 보기 힘들기 때문이다.
또한 else문이 중첩되면, 아주 좋지않은 코드가 나온다.
대안:
1. early return으로 뒤의 코드를 보지 않고 결과를 바로 리턴하는 방법
2. 전략패턴(다형성)(아직 잘 모름)
3. 모든 원시값과 문자열을 포장하라.
원시값을 포장해주게 되면, 그 값의 행위가 행해질 근거지가 마련된다.
예를들면 어떤 객체의 인스턴스 변수를 String name;으로 선언하는 것이 아니라,
Name이란 클래스를 만들어서, Name name; 으로 선언해주는 방법이 있다.
이렇게 하면 이름에 대한 validation 검증을 할 근거지가 마련 된 것이다.
또한 원시값을 클래스로 포장하게 되면, 클래스 명으로서 그 객체가 무엇을 하는지를 전달할 수 있다.
4. 한 줄에 점을 하나만 찍는다.
한 줄에 여러 점이 있다면, 그 기능에 맞지않는 다른 동작이 일어나고 있다는 것이다.
디미터 법칙 (객체 O의 메소드 m)
다음과 같은 메소드들의 호출만 허용하라.
1. O 객체 자신의 메소드들.
2. m의 파라미터로 넘어온 객체들의 메소드들.
3. m 안에서 생성 되거나 초기화된 객체의 메소드들.
4. O객체의 직접 소유하는 객체의 메소드들.
5.O객체의 m에서 접근이 가능한 전역변수의 메소드들.
- 객체를 과도한 점으로 호출한다면, 캡슐화가 잘못되어 있음을 의심할 수 있다.
5. 줄여쓰지 않는다.
길어져도 상관없다.
이름으로 의도가 충분히 드러나게 변수, 메서드, 클래스의 이름을 짓는다.
6. 모든 entity를 작게 유지한다.
50줄 이상 되는 클래스 또는
10개 파일 이상의 패키지는 없어야 한다.
7. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
대부분의 클래스에서는 인스턴스 변수 하나의 상태를 관리하는 것이 마땅하다.
새로운 인스턴스 변수가 생긴다면 클래스의 응집도가 떨어진다.
여기서 새로운 인스턴스 변수라는 것은 3번의 포장한 인스턴스 변수는 포함하지 않는다는 말 인 것 같다.
8. 일급 컬렉션을 쓴다.
컬렉션을 포함한 클래스는 반드시 다른 멤버변수가 없어야 한다.
일급 컬렉션이란 Wrapper 클래스와 비슷하다. 다른점은 컬렉션을 클래스로 감싼다는 점이다.
생성자 이외에 setter를 쓰지 않아 불변성을 띈다.
다음 글에서 정리할 예정.
9. getter/setter/property를 쓰지 않는다.
A라는 객체에서 B객체의 상태나 값이 필요할 때, 또는 B객체의 값을 설정할 때,
객체에 메세지를 던져서 일을 처리할 수 있다.
B의 값을 A에서 가져와서 쓰거나, A에서 설정하게 되면, 객체간의 강한 결합도가 생긴다.
A에서 B의 값을 사용한다면, B로 메세지를 보내서 일을 처리하게 해달라고 요청한다.
Don't ask! Just Tell
아직 getter을 쓰지 말라는 부분을 적용하기 어렵더라.
깨달음이 올 날이 있을것이라 믿는다.
'객체지향' 카테고리의 다른 글
의미있는 객체 이름 붙이기 (0) | 2020.12.09 |
---|---|
데이터 유효성 체크 (0) | 2020.12.09 |
좋은 객체란 무엇일까 (0) | 2020.12.06 |
객체 지향 도메인모델링 (0) | 2020.12.06 |
안티 패턴 (내 생각 포함) (0) | 2020.12.02 |