9장. 더 큰 설계 문제.
단위 테스트를 작성하는 것은 진공 속에서 벌어지는 일이 아니다.
설계라고 부르는 좀 더 크고 지속적으로 이동하는 퍼즐의 일부와 같다.
시스템 설계는 테스트를 작성하는 능력에 영향을 미치고 그 역 관계도 성립힌다.
이 장에서는 SRP원칙에 초점을 맞추어 더 작은 클래스들을 만들어 유연성과 테스트 용이성을 높이는 방법에 대해 알아본다.
SRP-단일 책임 원칙.
클래스는 변경할 때 한 가지 이유만 있어야 한다는 원칙이다.
어떤 클래스에 대해서 단일 책임을 강조하면 변경으로 인한 리스크는 줄어든다.
클래스에 더 많은 책임이 존재할수록 클래스에 있는 코드를 변경할 때 기존의 다른 동작들을 깨기 쉽다.
Profile 클래스는 책임 두 개를 정의한다.
1) 프로파일에 관한 정보 추적하기.
2) 조건 집합이 프로파일에 매칭되는지 혹은 그 정도를 판단하기.
첫 번째 변경으로는 calculateScore() 로직을 MatchSet 클래스로 이동하고 getScore() 메서드도 추가해준다.
또한 이동된 doesNotMeetAnyMustMatchCriterion()과 anyMatches() 메서드 모두 criteria 인스턴스의 접근이 필요하다.
MatchSet 클래스의 생성자에서 새로운 필드로 criteria 인자를 저장한다.
public class MatchSet {
private Map<String, Answer> answers;
private int score = 0;
private Criteria criteria;
public MatchSet(Map<String, Answer> answers, Criteria criteria) {
this.answers = answers;
this.criteria = criteria;
calculateScore();
}
private void calculateScore() {
// ...
for (Criterion criterion: criteria)
if (criterion.matches(answerMatching(criterion)))
score += criterion.getWeight().getValue();
}
// ...
private Answer answerMatching(Criterion criterion) {
return answers.get(criterion.getAnswer().getQuestionText());
}
public int getScore() {
return score;
}
public boolean matches() {
if (doesNotMeetAnyMustMatchCriterion())
return false;
return anyMatches();
}
private boolean doesNotMeetAnyMustMatchCriterion() {
// ...
for (Criterion criterion: criteria) {
boolean match = criterion.matches(answerMatching(criterion));
if (!match && criterion.getWeight() == Weight.MustMatch)
return true;
}
return false;
}
private boolean anyMatches() {
// ...
boolean anyMatches = false;
for (Criterion criterion: criteria)
anyMatches |= criterion.matches(answerMatching(criterion));
return anyMatches;
}
}
명령-질의 분리
어떤 메서드는 명령을 실행하거나 질의에 대답 할 수 있으며 두 작업을 모두 하면 안된다.
질의 메서드가 객체 상태르 바꾸면 그 메서드를 두 번 호출하는 것이 불가능 할 수도 있다.
혹은 두 번째 호출 시 원하지 않는 방향으로 객체 상태가 변질될 수도 있다.
예로는 java.util.Iterator 인터페이스를 예를 들 수 있다고 하는데 next() 메서드는 다음 객체를 가리키고 현재 객체 포인터를 증가시킨다.
이 때, 부주의한 호출은 결함으로 이어질 수 있다고 한다.
java.util.Iterator 에 대한 구체적인 내용은 아래 링크 참고하깅!
https://www.w3schools.com/java/java_iterator.asp
Java Iterator
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
'BookReview' 카테고리의 다른 글
자바와 JUnit을 활용한 단위테스트_11 (0) | 2022.08.20 |
---|---|
자바와 JUnit을 활용한 단위테스트_10 (2) | 2022.08.15 |
자바와 JUnit을 활용한 단위테스트_08 (0) | 2022.07.16 |
자바와 JUnit을 활용한 단위테스트_07 (0) | 2022.06.19 |
자바와 JUnit을 활용한 단위테스트_06 (0) | 2022.06.11 |