기본값을 하위 함수 안에 박아두면 문맥도, 재사용성도 모두 잃는다.
private string GetPageNameOrDefault(HttpRequest request) { var pageName = request.Query["page"]; if (string.IsNullOrWhiteSpace(pageName)) pageName = "HomePage"; // ← 하드코딩된 상수! return pageName; }
문맥 없음: "HomePage"가 왜 기본값인지, 어디서 온 값인지 이 함수만 봐서는 알 수 없다.
재사용 불가: 다른 기본값이 필요한 곳에서 이 함수를 쓸 수 없다. 무조건 "HomePage"다.
책임 역전: 기본값을 결정하는 것은 호출하는 쪽의 책임인데, 하위 함수가 그 책임을 빼앗고 있다.
하위 함수는 로직만, 기본값 결정은 호출하는 쪽에 맡겨라.
public IActionResult HandleRequest(HttpRequest request) { string pageName = GetPageNameOrDefault(request, "HomePage"); var html = RenderPage(pageName); return Content(html, "text/html"); } private string GetPageNameOrDefault(HttpRequest request, string defaultPageName) { var pageName = request.Query["page"]; return string.IsNullOrWhiteSpace(pageName) ? defaultPageName : pageName; }
| 장점 | 설명 |
|---|---|
| 문맥 노출 | "HomePage"가 기본값이라는 의도가 상위 함수에서 명확하게 보임 |
| 함수 재사용성 | default 값을 다르게 해서 다른 곳에서도 재사용 가능 |
| 책임 분리 | 기본값 결정은 상위 계층의 책임, 로직은 하위 계층의 책임 |
상수의 위치가 곧 책임의 위치다
하드코딩된 상수는 상위 호출자에게 파라미터로 위임하라.
파라미터로 받으면 어디서든 다른 기본값으로 재사용 가능하다.
무엇이 기본값인지 아는 건 상위 계층, 어떻게 처리하는지는 하위 계층.