Clean Code · Ch.05

형식: 상수의 위치

하드코딩된 상수의 함정

기본값을 하위 함수 안에 박아두면 문맥도, 재사용성도 모두 잃는다.

❌ 나쁜 예
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 값을 다르게 해서 다른 곳에서도 재사용 가능
책임 분리 기본값 결정은 상위 계층의 책임, 로직은 하위 계층의 책임
핵심 원칙 — 상수의 위치가 책임의 위치다. 기본값을 결정하는 권한은 호출하는 상위 계층에 있어야 한다.

Ch.05 핵심 원칙 요약

상수의 위치가 곧 책임의 위치다

HandleRequest
("HomePage")
→ 전달
GetPageNameOrDefault
(defaultPageName)
→ 반환
pageName
📍

상수는 위로 올려라

하드코딩된 상수는 상위 호출자에게 파라미터로 위임하라.

♻️

재사용 가능한 함수

파라미터로 받으면 어디서든 다른 기본값으로 재사용 가능하다.

🎯

책임의 위치

무엇이 기본값인지 아는 건 상위 계층, 어떻게 처리하는지는 하위 계층.

체크 — 함수 내부에 하드코딩된 문자열/숫자가 보이면 "이걸 파라미터로 올릴 수 있을까?" 를 먼저 물어라.