본문 바로가기
책 내용 정리/[책] 내 코드가 그렇게 이상한가요?

7장 컬렉션: 중첩을 제거하는 구조화 테크닉

by 문자메일 2023. 7. 27.

https://link.coupang.com/a/37DdD

 

내 코드가 그렇게 이상한가요? : 좋은 코드/나쁜 코드로 배우는 설계 입문

COUPANG

www.coupang.com

↑ 정말 재밌게 봤고 좋은 책

 

 

7.1 이미 존재하는 기능을 다시 구현하지 말기

자바 표준 컬렉션 라이브러리에는 여러 가지 검증된 메서드들을 다양하게 제공하고 있다.

그러니 for문 반복문을 사용해서 컬렉션을 직접 조작하고 있다면, 표준 라이브러리에 같은 기능을 제공하는 메서드가 있는지 확인 먼저 해보고 있다면 사용하는 것이 좋다.

※ 바퀴의 재발명을 하지 말라!

 

 

7.2 반복 처리 내부의 조건 분기 중첩

7.2.1 조기 컨티뉴로 조건 분기 중첩 제거하기

7.2.2 조기 브레이크로 중첩 제거하기

 

 

7.3 응집도가 낮은 컬렉션 처리

컬렉션 처리도 응집도가 낮아지기 쉽다.

이 책의 예시에서는 List<Member> 의 리스트 컬렉션 구성요소를 조작하는 로직이 다양한 클래스에 분산되어 구현되어 있는 상황을 지적하고 있다. ( 응집도가 낮아지고, 중복이 생길 여지가 높음)

  • 리스트에 추가
  • 리스트에 어떤 값이 있는지 확인
  • ..

 

7.3.1 컬렉션 처리를 캡슐화하기

컬렉션과 관련된 응집도가 낮아지는 문제일급 컬렉션 패턴을 사용해 해결할 수 있다.

일급 컬렉션이란, 컬렉션과 관련된 로직을 캡슐화하는 디자인 패턴이다.

 

클래스에는 다음 두 가지가 있어야 한다.

  • 인스턴스 변수
  • 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드

일급 컬렉션은 아래와 같은 요소로 구성된다고 할 수 있다.

  • 컬렉션 자료형의 인스턴스 변수
  • 컬렉션 자료형의 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드

 

멤버 컬렉션 List<Member>를 인스턴스 변수로 가지는 클래스로 설계해 보자

 

컬렉션과 컬렉션을 조작하는 로직을 한 클래스에 응집한 구조로 아래처럼 만들었다.

 

class Party{

    static final int MAX_MEMBER_COUNT = 4;

    private final List<Member> members;

 

    Party(){

        members = new ArrayList<Member>();

    }

 

    private Party(List<Member> members){

        this.members = members;

    }

 

    Party add(final Member newMember){

        if(exists(newMember)){

            throw new RuntimeException("이미 파티에 참가되어 있습니다.");

        }

        if(isFull()){

            throw new RuntimeException("이 이상 멤버를 추가할 수 없습니다.");

        }

 

        final List<Member> adding = new ArrayList<>(members);

        adding.add(newMember);

        return new Party(adding);

    }

 

    boolean isAlive(){

        return members.stream().anyMatch(each -> each.isAlive());

    }

 

    boolean exists(final Member member){

        return members.stream().anyMatch(each -> each.id == member.id);

    }

 

    boolean isFull(){

        return members.size() == MAX_MEMBER_COUNT;

    }

 

    // 불변으로 만들어서 멤버 리스트 리턴하기

    // unmodifiableList로 리턴되는 컬렉션은 요소를 추가하거나 제거할 수 없다.

    List<Member> members(){

        return members.unmodifiableList();

    }

 

}

 

7.3.2 외부로 전달할 때 컬렉션의 변경 막기

    // 불변으로 만들어서 멤버 리스트 리턴하기

    // unmodifiableList로 리턴되는 컬렉션은 요소를 추가하거나 제거할 수 없다.

    List<Member> members(){

        return members.unmodifiableList();

    }

댓글