본문 바로가기
독서에서 한걸음

Speculative Generality

by oncerun 2022. 12. 24.
반응형

 

추측성 일반화라는 이름으로 나중에 이러저러한 기능이 생길 것을 예상하여, 기능을 만들었지만 결국 쓰이지 않는 코드가 발생한 경우이다.

 

 

이는 다양하게 적용될 예시가 있다.

 

1. 추상 클래스를 만들엇지만 크게 유효하지 않다면 Collapse Hierarchy으로 계층을 합친다.

 

2. 불필요한 위임은 함수 인라인 혹은 클래스 인라인으로 처리한다.

 

3. 사용하지 않는 매개변수를 가진 함수는 Change Function Declaration을 적용한다.

 

4. 오로지 테스트 코드에서만 사용하고 있는 코드는 Remove Dead code를 적용한다. 

 

나는 4번에 관심이 있다.

 

Remove Dead Code

 

사용하지 않는 코드가 애플리케이션 성능이나 기능에 영향을 끼치지는 않는다.

 

하지만 해당 소프트웨어가 어떻게 동작하는지 이해하려는 사람들에게 고통을 준다.

 

실제 나중에 필요해질 코드라 하더라도 지금 쓰이지 않는 코드라면 삭제해야 한다. 

 

나중에 정말로 다시 필요해지면 git과 같은 버전 관리 시스템을 사용해 복원할 수 있다.

 

public class Reservation {

    private String title;

    private LocalDateTime from;

    private LocalDateTime to;

    private LocalDateTime alarm;

    public Reservation(String title, LocalDateTime from, LocalDateTime to) {
        this.title = title;
        this.from = from;
        this.to = to;
    }

    public void setAlarmBefore(int minutes) {
        this.alarm = this.from.minusMinutes(minutes);
    }

    public LocalDateTime getAlarm() {
        return alarm;
    }
}

 

 

인텔리제이를 사용한다면 inlay의 Code vision을 사용하면 해당 필드나 클래스가 사용되는지 체크할 수 있다.

 

 

만약 엔티티의 값을 검증하는 과정에서 PK 값을 조건으로 사용하는 코드가 있다면 이는 어떻게 테스트해야 할까?

 

나는 다음과 같은 상황을 만난 적이 있다. Update 시 없으면 생성, 있으면 업데이트.

 

단순 find 하여 없으면 생성하는 로직이 아닌 참조되는 엔티티들 중 해당 타입이 없으면 생성해야 했다. 

 

엔티티는 객체 탐색이 쉽기 때문에 여러 조건을 통해 해당 객체를 Optional로 가져와 존재하지 않는 경우 새로운 엔티티를 생성해 주었다.

 

이후 새롭게 생성된 엔티티와 기존 엔티티를 찾아와서 진행하는 로직이 서로 달랐다. 따라서 if문에 들어갈 조건이 필요했는데 이 경우 나는 PK 값의 유무로 해당 조건을 처리하도록 했다. 

 

이는 사실 위험성이 있다.

 

다른 개발자가 pk값을 임의로 넣어준다고 가정하면 새롭게 생성된 엔티티가 업데이트 조건문을 탈 가능성이 있다. 

따라서 엔티티 생성 시 PK값을 커스텀하여 생성하지 못하게 막았다. 

 

이제 이 코드는 테스트 시 문제를 발생시킨다. 

 

단위 테스트를 진행할 때 의존된 객체는 모킹 하여 처리한다.  이 과정에서 엔티티 속성 값의 전/후를 검증해야 하는 상황이였는데,  해당 테스트를 위해 id값을 설정해주지 못해 새롭게 생성된 엔티티에 대한 테스트코드를 작성할 수 가없었다. 

 

그래서 id를 설정할 수 있도록 private 생성자에 빌더패턴을 적용하고 id 파라미터를 추가했다. 

 

하지만 다음 코드는 애플리케이션에서 사용되지 않는다.

private item(...){
 this.id = id;
}

 

 

해당 조건을 지우고 클라이언트로부터 특정 유형의 id값을 받아야 하나? 새로 생성되는 경우 값을 null로 받아 null을 조건으로 사용하는 것이 맞는지 갈팡질팡이다. 

 

공부를 계속하다 보면 힌트를 얻지 않을까? 해당 해결법을 찾는다면 답을 적도록 하겠다.

 

반응형

'독서에서 한걸음' 카테고리의 다른 글

Message Chains  (0) 2022.12.24
Temporary Field  (0) 2022.12.24
Lazy Element  (0) 2022.12.24
Repeated Switches  (0) 2022.12.22
Replace Conditional with Polymorphism  (0) 2022.12.21

댓글