minigrep refine

I/O 개선은 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는 바깥으로 밀고, 검색 로직은 작은 순수 함수로 남길수록 테스트가 쉬워진다.