프로그래밍/Clean Code

Clean Code - 객체와 자료구조

한디벨 2018. 11. 5. 16:49

자료 추상화

구체적인 클래스는 구현을 외부로 노출하고 추상적인 클래스는 구현을 감춘다.

그저 조회 함수와 설정 함수로 변수를 다룬다고 그것이 클래스는 아니다.

추상 인터페이스를 제공해 구현을 모른 채 자료의 핵심을 조작할 수 있는 것이 클래스이다.

또한 클래스 메소드명도 추상적이게 표현하여 구현을 감추는 것이 더 추상화 된 표현이다.

인터페이스와 조회/설정 함수만으로는 추상화가 이루어지지 않는다.

객체가 포함하는 자료를 표현할 방법을 고민하여 추상화 시켜야지, 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁜 표현 방법이다.

 

자료/객체의 비대칭

객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만을 공개한다.

반면, 자료구조는 자료를 그대로 공개하며 별다른 함수를 제공하지는 않는다.

자료구조는 절차적인 코드이며 객체는 객체 지향적인 코드이다.

자료구조를 나타낸 절차적인 코드에서 새로운 함수를 추가하고 싶다면 함수가 추가되는 클래스에 새로운 함수만 작성하면 된다. 하지만 새로운 도형 클래스를 추가하고 싶다면 모든 함수를 수정해야 한다.

반면, 객체 지향적인 코드에서 새로운 도형 클래스를 추가해도 함수를 고치지 않아도 된다. 하지만 새로운 함수를 만들고 싶다면 모든 도형 클래스를 고쳐야한다.

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

새로운 함수가 아니라 새로운 자료 타입이 필요한 경우에는 클래스와 객체 지향 기법이 적합하고, 새로운 자료 타입이 아니라 새로운 함수가 자주 필요한 경우에는 자료 구조와 절차적인 코드가 적합하다.

 

디미터 법칙

디미터 법칙이란 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.

그렇게 하기 위해 자료를(변수) 숨기고 함수를 공개한다.

그리고 디미터 법칙에서는  클래스 C의 메소드 f는 다음과 같은 객체의 메소드만 호출해야 된다는 규칙이 있다.

-      클래스 C

-      f가 생성한 객체

-      f인수로 넘어온 객체

-      C 인스턴스 변수에 저장된 객체

그리고 위의 메소드가 반환하는 객체의 메소드는 호출하면 안된다는 규칙이 있다.

, 다음과 같이 되어있는 소스는 메소드가 반환하는 객체의 메소드를 호출 하고 있는 꼴이다.

String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

위와 같은 코드를 기차충돌이라 부른다. 가급적 위와 같은 코드는 피하는 것이 좋다.

다음과 같이 나누는편이 좋다.

Options opts = ctxt.getOptions();

File scratchDir = opts.getScratchDir();

String outputDir = scratchDir.getAbsolutePath();

 

'프로그래밍 > Clean Code' 카테고리의 다른 글

Clean Code - 주석  (0) 2018.10.02
Clean Code - 깨끗한 함수  (0) 2018.10.02