env::args
인수는 소유권 있는 값으로 모아 Config에 넘긴다.
명령줄 인수, 환경 변수, 검색 함수를 한 곳에 섞지 않고 생성 경계와 실행 경계를 나누면 테스트할 단위가 선명해진다.
env::args
인수는 소유권 있는 값으로 모아 Config에 넘긴다.
Config::build
대소문자 무시 같은 정책은 생성 시점에 고정한다.
run(config)
파일 읽기와 오류 전파는 실행 함수에 모은다.
search
순수 함수로 두어 입력 문자열만으로 테스트한다.
#[test]
검색 결과와 오류 메시지를 독립적으로 검증한다.
| 개선 지점 | 나누기 전 문제 | 나눈 뒤 신호 |
|---|---|---|
| args | clone으로 넘기며 소유권 흐름이 숨는다. | Config가 필요한 값만 소유한다. |
| case option | 검색 함수 안에서 환경 변수를 읽는다. | 옵션은 Config에 있고 검색은 문자열만 본다. |
| search | 파일 I/O와 검색 조건이 한 함수에 섞인다. | lines, filter, collect 결과를 바로 검증한다. |
let config = Config::build(env::args())?; run(config)?;
핵심: 실패 가능성이 있는 I/O는 바깥으로 밀고, 검색 로직은 작은 순수 함수로 남길수록 테스트가 쉬워진다.