Group Study (2021-2022)/Clean Code

[클린코드 북리뷰 스터디] 5주차 - 클래스와 시스템

ddo0 2022. 6. 26. 11:19

클래스

캡슐화

객체의 실제 구현을 외부로부터 감추는 방식으로, 객체에서 실제 데이터를 조작하거나 구현하는 부분을 기본적으로 private으로 하고, 외부에 노출해야 하는 것만 public으로 하는 것이다.
  • 클래스를 개발할 때는 기본적으로 구현을 감추고, 외부 객체와 상호작용하는 부분만 노출한다.
  • 외부의 잘못된 사용을 방지한다.
public class Stack{

    private int topOfStack \= 0; // private으로 설정

    public int size() {

        return topOfSize; // Stack 클래스의 원소 topOfStack 알고 싶다면 size() 메소드로!

    }

}

👉🏻 캡슐화의 핵심은 모든 구현을 외부 세계에 알리는 것이 아니라, 외부 세계에서 정말 알아야 할 것들만 알려주는 것이 핵심이다.

단일 책임 원칙(SRP)

  1. 클래스는 작아야 한다.
  • 클래스는 함수와 마찬가지로 작아야 하는데, 함수와는 약간 다른 차이가 존재한다. 👉🏻 바로 "크기 측정"에서 차이가 있다.

 

크기 측정 

  • 함수: 라인 수
  • 클래스: 맡은 책임의 수
클래스가 맡은 책임은 하나여야 한다.

클래스가 맡은 책임이 2개라면?

별도의 클래스로 분리한다.
public class SuperDashBoard extends JFrame implements MetatDataUser {

public Component getLastFocusedComponent()

public void setLastFocusedComponent()

public int getMajorVersionNumber()

public int getMinorVersionNumber()

public int getBuildNumber()

}

🔻 이 경우 클래스가 focus, version의 2개 책임을 맡고 있다. 따라서, Version 클래스로 따로 분리한다.

작은 클래스는 각자 맡은 책임이 하나며, 변경할 이유가 하나이고, 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다. 

 

낮은 결합도, 높은 융집도

결합도

다른 모듈 간의 의존도

응집도

모듈 내부의 기능 집중도
결합도가 낮을수록, 응집도는 높을수록(메소드가 인스턴스 변수를 많이 사용할수록 높음) 유지보수성이 좋다.

👉🏻 결합도가 높다면?

✔️ 연관된 클래스가 변경되면 수정이 필요하다.

✔️ 결합도가 높으면 연관된 클래스들을 모두 이해해야 수정할 수 있다. (생산성 저하)

👉🏻 응집도가 낮다면?

✔️ 재사용하고 이해하기 어렵다.

변경하기 쉬워야 한다.


시스템

관심사 분리

생성(construction)과 사용(use)은 아주 다르다. 따라서, 소프트웨어 시스템은 (어플리케이션 객체를 제작하고 의존성을 서로 '연결'하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야 한다.

👉🏻 객체의 생성과 객체를 사용하는 부분을 분리한다.

  1. 시작에 대한 관심사 분리
  • 시작 단계는 모든 어플리케이션이 풀어야 할 관심사임
  • main 함수에서 시스템에 필요한 객체를 생성한 후, 어플리케이션에 넘긴다.
  • 어플리케이션은 그저 만들어진 객체를 사용한다.
  1. 요청에 대한 관심사 분리
  • spring 프레임워크를 통해 요청에 대한 관심사를 분리해 요청 처리에 대한 비즈니스 로직에 집중할 수 있다.

출처) 제로베이스 클린코드 강의

의존성 주입 (Dependency Injection)

객체의 의존성을 DI 컨테이너에 맡긴다.
  • Setter 메소드나 생성자 인수를 통해 의존성을 주입한다.
  • DI 컨테이너는 요청이 들어올 때 필요한 객체의 인스턴스를 만든 후 의존성을 설정한다.

ex) Spring IoC Container

횡단 관심 분리 (Cross Cutting Concerns)

어플리케이션 전반에서 가지는 공통적인 관심사를 분리한다.
  • 비즈니스 로직 외에 Logging, Transaction 관리, Security 등 신경써야 할 관심사들이 많다.
  • 관심사들은 많은 어플리케이션 레이어에 퍼져있는데, 이 관심사들을 분리해 처리하는 것이 효율적이다.

방법

  1. 자바 Proxy API
  2. 순수 자바 AOP Framework
  3. EJB3

📍 참고 자료

책 : Clean Code(클린 코드) 애자일 소프트웨어 장인 정신

강의 : 제로베이스 한달한권 클린코드