티스토리 뷰

 

Clean Code 클린 코드
로버트 C. 마틴 저/박재호,이해영 공역

 

차례

1장. 깨끗한 코드
2장. 의미 있는 이름
3장. 함수
4장. 주석
5장. 형식 맞추기
6장. 객체와 자료 구조
7장. 오류 처리

8장. 경계
9장. 단위 테스트
10장. 클래스
11장. 시스템
12장. 창발성
13장. 동시성
14장. 점진적인 개선
15장. JUnit 들여다보기
16장. SerialDate 리팩터링
17장. 냄새와 휴리스틱

 

6장. 객체와 자료 구조

자료 추상화

인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.

자료/객체 비대칭

객체와 자료 구조는 근본적으로 양분된다.

(자료 구조를 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.

반대도 참이다.

절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.

다시 말해, 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다!

...

분별 있는 프로그래머는 모든 것이 객체라는 생각이 미신임을 잘 안다. 때로는 단순한 자료 구조와 절차적인 코드가 가장 적합한 상황도 있다.

 

결론

객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다. 자료 구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.
(어떤) 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다.

 

 

7장. 오류 처리

오류 처리는 중요하다. 하지만 오류 처리 코드로 인해 프로그램 논리를 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다.

오류 처리 기법

1. 오류 코드보다 예외를 사용하라.
2. Try-Catch-Finally문부터 작성하라.
3. 미확인(Unchecked) 예외를 사용하라.
4. 예외에 의미를 제공하라.
5. 호출자를 고려해 예외 클래스를 정의하라.
6. 정상 흐름을 정의하라.
7. null을 반환하지 마라.
8. null을 전달하지 마라.

 

결론

깨끗한 코드는 읽기도 좋아야 하지만 안정성도 높아야 한다. 이 둘은 상충하는 목표가 아니다. 오류 처리를 프로그램 논리와 분리해 독자적인 사안으로 고려하면 튼튼하고 깨끗한 코드를 작성할 수 있다. 오류 처리를 프로그램 논리와 분리하면 독립적인 추론이 가능해지며 코드 유지보수성도 크게 높아진다.

 

 

참고

Rebecca Wifts-Brock, <오브젝트 디자인: 소프트웨어 개발의 성공 열쇠>, 인포북, 2004
마틴 파울러, <리팩토링: 코드 품질을 개선하는 객체지향 사고법>, 한빛미디어, 1999

 

 

- James Song

댓글