깡뇽

[Clean Code] 클린 코드 - 6장 객체와 자료구조 본문

Book/Clean Code

[Clean Code] 클린 코드 - 6장 객체와 자료구조

깡뇽 2022. 3. 1. 12:16
반응형

변수를 private과 public으로 설정하는 각각의 이유들이 존재한다.

 

 

자료 추상화

코드에서 인터페이스를 만들거나 변수마다 get 함수와 set 함수를 무작정 추가하는 것이 아니라 추상적인 개념으로 표현하도록 해야 한다.

자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. ˙ ˙ ˙ 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다.

 

 

자료/객체 비대칭

객체와 자료 구조는 근본적으로 반대의 성질을 가지기에 "(자료 구조를 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다."와 "절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다."라는 말이 모두 맞는 말이다.

즉, 객체 지향 코드에서 어려운 변경이 절차적인 코드에서는 쉽고, 반대로 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다.

새로운 함수가 아닌 새로운 자료 타입이 필요할 때에는 클래스와 객체 지향 기법으로, 새로운 함수가 필요할 때에는 절차적인 코드와 자료 구조로 코딩해야 한다. 

 

 

디미터 법칙

모듈은 자신이 조작하는 객체의 내부 사정을 몰라야 한다는 법칙으로, 객체는 자료를 숨기고 함수를 공개한다.

다시 말해, 객체는 조회 함수로 내부 구조를 공개하면 안 된다는 의미다. 낯선 것은 경계하고 친한 것과 어울려라.

* 휴리스틱(heuristic) : 발견법(發見法)이라고도 하며, 불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있게 보다 용이하게 구성된 간편 추론의 방법

 

- 기차 충돌

여러 객체가 한 줄로 이어진 기차처럼 보이는 코드를 기차 충돌(train wreck)이라고 한다.

좋지 않은 방식이므로 피하자.

객체이면 내부 구조를 숨겨야 하므로 확실히 디미터 법칙을 위반하는 것이고, 자료 구조라면 내부 구조를 노출하므로 디미터 법칙이 적용되지 않는다.

 

- 잡종 구조

객체와 자료 구조가 섞인 형태가 나오기도 하는데 이는 중요한 기능을 수행하는 함수와 공개 변수나 공개 조회/설정 함수가 있다. 공개 조회/설정 함수는 비공개 변수를 노출하는데 다른 함수가 절차적인 프로그래밍의 자료 구조 접근 방식처럼 비공개 변수를 사용하고 싶게 될 수도 있다. 그렇기 때문에 새로운 함수나 자료 구조를 추가하기 어렵기 때문에 사용하지 않는 것이 좋다.

 

- 구조체 감추기

객체들은 나열식으로 작성되면 안 되고 내부 구조를 감추는 것을 고려하여 작성되어야 한다.

 

자료 전달 객체

자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스인데 이런 자료 구조체를 자료 전달 객체(Data Trasfer Object, DTO)라고 한다. 데이터베이스와의 통신과 소켓에서 받은 메시지의 구문을 분석할 때에 유용한 구조체다.

"빈(bean) 구조"는 private 변수를 조회/설정 함수로 조작한다.

 

- 활성 레코드

DTO의 특수한 형태이며, 공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료 구조이고 대개 save나 find와 같은 탐색 함수도 제공한다. 

활성 레코드는 자료 구조로 취급하여 내부 자료를 숨기는 객체는 따로 생성하는 방식으로 코딩한다.

 

결론

객체는 동작을 공개하고 자료를 숨기기 때문에 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉽지만, 기존 객체에 새 동작은 추가하기는 어렵다.

자료 구조는 특별한 동작 없이 자료를 노출하기 때문에 기존 자료 구조에 새 동작을 추가하기는 쉽지만 기존 함수에 새 자료를 추가하기는 어렵다.

그러므로 새로운 자료 타입을 추가하는 유연성이 필요하면 객체를, 새로운 동작을 추가하는 유연성이 필요하다면 자료 구조와 절차적인 코드가 더 적절하다.

 


사실 오늘 내용 정말 이해가 잘 되지 않았다. 원래도 클래스, 객체 이런 개념들이 어려워서 피하곤 했는데 여기서도 읽는 내내 이게 무슨 소리지 싶었다. 언젠가 내가 클래스, 인터페이스, 구조체, 객체 등에 대해서 완전히 이해하는 날이 되면 6장을 다시 읽어보도록 해야겠다. 

 

TIL 9회차

반응형