728x90

1. 클래스 체계

클래스를 정의하는 표준 자바 관례에 따르면,

 

가장 먼저 변수 목록이 나온다

static 상수 -> public 상수 ->

private 변수 -> private 인스턴스 변수 -> public 변수

 

변수 목록 다음에는 public 함수가 나온다

private 함수는 자신을 호출하는 공개 함수 직후에 넣는다

 

즉, 추상화 단계가 순차적으로 내려간다

신문기사 처럼 읽혀야 한다

 

변수와 유틸리티 함수는 가능한 공개하지 않는 편이 좋다

비공개 상태를 유지할 방법을 강구하고, 

캡슐화를 풀어주는 결정은 언제나 최후의 수단이다


2. 클래스는 작아야 한다!

단일 책임 원칙

클래스는 최대한 작게 만들어야 한다

'하나의 클래스는 하나의 책임만 가져야 한다

즉, 클래스나 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙'

단일 책임 원칙을 준수하자

 

책임, 즉 변경할 이유를 파악하려 애쓰다 보면 코드를 추상화하기 쉬워지며, 더 좋은 추상화가 더 쉽게 떠오른다

 

응집도

클래스는 인스턴스 변수 수가 작아야 한다

각 클래스 메서드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다

일반적으로 메서드가 변수를 더 많이 사용할수록 메서드와 클래스는 응집도가 더 높다

모든 인스턴스 변수를 메서드마다 사용하는 클래스는 응집도가 가장 높다

응집도가 높다는 말은 클래스에 속한 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 것을 의미

public class Stack {
    private int topOfStack = 0;
    List<Integer> elements = new LinkedList<Integer>();
    
    public int size() {
    	return topOfStack;
    }
    
    public void push(int element) {
    	topOfStack++;
        elements.add(element);
    }
    
    public int pop() throws PoppedWhenEmpty {
    	if (topOfStack == 0)
        	throw new PoppedWhenEmpty();
        int elemet = elements.get(--topOfStack);
        elements.remove(topOfStack);
        return elemet;
    }
}

위 클래스를 보면 응집도가 아주 높다

size()를 제외한 다른 두 메서드는 두 인스턴스 변수를 모두 사용한다

 

때때로 몇몇 메서드만이 사용하는 인스턴스 변수가 아주 많아진다면, 새로운 클래스로 쪼개야 한다는 신호다

응집도가 높아질수록 변수와 메서드를 적절히 분리해 새로운 클래스 두세 개로 쪼개준다

응집도를 유지하면 작은 클래스 여럿이 나온다


3. 변경하기 쉬운 클래스

요구사항은 변하기 마련이며, 그에 따라 코드도 변하기 마련이다

 

객체 지향 프로그래밍에는 구체적인 클래스와 추상 클래스가 있다

구체적인 클래스는 상세한 구현(코드)을 포함하며, 추상 클래스는 개념만 포함한다

상세한 구현에 의존하는 클라이언트 클래스는 구현이 바뀌면 위험에 빠진다

그래서 우리는 인터페이스와 추상 클래스를 사용해 구현이 미치는 영향을 격리한다

 

상세한 구현에 의존하는 코드는 테스트가 어렵다

예를 들어 5분 주기로 계속 변경되는 값을 사용해야하는 외부 API가 있다고 가정할 때, 테스트 코드를 짜기란 쉽지 않다

 

이런 경우 해당 API를 직접 호출하는 대신

인터페이스를 생성하고 해당 클래스를 흉내내는 테스트용 클래스를 만들어서

고정된 값을 반환하도록 하면 테스트 코드를 쉽게 작성할 수 있다

 

테스트가 가능할 정도로 시스템의 결합도를 낮추면 유연성과 재사용성도 더욱 높아진다

결합도를 최소로 줄이면 자연스럽게 또 다른 클래스 설계 원칙인 DIP(역전 의존 원칙)를 따르는 클래스가 나온다

본질적으로 DIP는 클래스가 상세한 구현이 아니라 추상화에 의존해야 한다는 원칙이다


마무리 느낀 점

응집도에 따라 클래스를 구분한다는 설계 방법은 특히 좋은 길잡이가 될 것 같다

객체 지향 원칙들은 기본인 것 같으면서도 실제로 지키면서 작성하기는 쉽지 않다

이러한 내용들을 항상 기억하고 조금씩 반복하면서 좋은 습관을 만들어야겠다 :)

728x90

'개발 서적 > 클린코드' 카테고리의 다른 글

클린코드 - 12.창발성  (0) 2022.08.12
클린코드 - 11.시스템  (0) 2022.08.11
클린코드 - 9.단위 테스트  (0) 2022.08.06
[Study] 2022/07/18  (0) 2022.07.30
클린코드 - 8.경계  (0) 2022.07.06
복사했습니다!