2장 입출금 내역 분석기

2024. 10. 6. 23:32스터디/실전 자바 소프트웨어개발

final 변수

  • 지역 변수나 필드를 final로 정의하기 때문에 이 변수에 값을 재할당 할 수 없다.
    코드에서 가능한 많은 변수를 final로 표시하면 어떤 객체의 상태가 바뀔 수 있고, 어떤 객체의 상태가 발쓀 수 없는지 명확하게 구분할 수 있다.
  • 자바 언어에서 final 키워드가 쓸모없는 상황도 있다. 추상 메서드(인터페이스 내)의 메서드 파라미터에 final을 사용하는 상황이다.
  • 자바 10에서 var 키워드가 등장하고 final 유용성이 크게 감소되었다.

갓 클래스

  • 한 개의 파일에 모든 코드를 구현해서 거대한 클래스가 탄생되는 클래스.
  • 기존 코드의 로직을 갱신해야 한다면, 어떻게 이 코드를 찾아서 바꿀 수 있을까? 이런 문제를 갓 클래스 안티 패턴이라 부른다.

단일책임원칙(SRP)

  • 쉽게 관리하고 유지보수하는 코드를 구현하는 데 도움을 주는 포괄적인 SW개발 지침.
    • 한 클래스는 한 기능만 책임진다.
    • 클래스가 바뀌어야 하는 이유는 오직 하나여야 한다.
  • 클래스와 메서드에 적용한다.

도메인(domain) 이란?

  • 비즈니스 문제와 동일한 단어와 용어를 사용한다는 의미.

응집도?

  • 서로 어떻게 관련되어 있는지를 가리킨다. 즉, 클래스나 메서드의 책임이 서로 얼마나 강하게 연결되어 있는지를 측정하는 의미.
  • 어떤 것이 여기저기에 모두 속해 있는지를 말한다.
  • 높은 응집도는 밸자의 목표이며, 누구나 쉽게 코드를 찾고, 이해하고 사용할 수 있도록 만들고 싶어 한다.

    클래스 수준 응집도

  1. 기능
  2. 정보
  3. 유틸리티
  4. 논리
  5. 순차
  6. 시간
  • 그룹화하는 메서드의 관련성이 약하면 응집도가 낮아진다.

1.기능

BankStatementCSVParser를 구현할 대 기능이 비슷한 메서드를 그룹화했다.
parseFrom()과 parseLinesFrom()은 CSV 형식의 행을 파싱한다. 내부적으로 parseLinesFrom()메서드는 parseFrom()메서드를 사용한다. 
이렇게 함께 사용하는 메서드를 그룹화하면 찾기도 쉽고 이해하기도 쉬우므로 응집도를 높인다.

2.정보

같은 데이터나 도메인 객체를 처리하는 메서드를 그룹화하는 방법.
BankTransaction 객체를 만들고, 읽고, 갱신하고 삭제하는 CRUD기능
public class BankTransactionDAO {
    public BankTransaction create(final LocalDate date...) {
        //...
        throw new UnsupportedOperationException();
    }

    public BankTransaction read(...) {
        //...
        throw new UnsupportedOperationException();
    }
    ...
}
  • 하지만 정보 응집은 여러 기능을 그룹화 하면서 필요한 일부 기능을 포함하는 클래스 전체를 dependency를 추가한다는 약점이 있다.

    3.유틸리티

  • 때로는 관련성이 없는 메서드를 한 클래스로 포함시켜야 한다. 특히 메서드가 어디에 속해야할 지 결정하기 어려울 때는 유틸리티 클래스에 추가히가도 한다.
  • 유틸리티 클래스 사용은 낮은 응집도로 이어지므로 자제해야한다.

4.논리, 5.순차

  • SRP 원칙을 위배하는게 존재하여 PASS

    6.시간

  • 어떤 처리 작업을 시작하기 전과 뒤에 초기화, 뒷정리 작업( 예를 들어 DB 연결과 종료 )을 담당하는 메서드를 포함하는 클래스가 그 예이다.
  • 개인적으로 이 클래스의 메서드는 유틸리티로 포함되어도 되지 않을까? 생각됨.

메서드 수준 응집도

응집도 원칙은 클래스뿐만 아니라 메서드에서도 적용 가능하다. 메서드가 다양한 기능을 수행할 수록 메서드가 어떤 동작을 하는지 이해하기가 점점 어려워진다. 즉 메서드가 연관이 없는 여러 일을 처리한다면 응집도가 낮아진다.
응집도가 낮은 메서드는 여러 책임을 포함하기 때문에 각 책임을 테스트 하기가 어렵고, 메서드의 책임도 테스트하기가 어렵다. if/else 의 블록이 여러 개 있다면 이는 응집도에 문제가 있을을 의미하게 된다. 그렇기 때문에 응집도가 높은 더 작은 조각으로 메서드를 분리해야한다.