본문으로 건너뛰기

9. 코드를 재사용하고 일반화할 수 있도록 하라

1. 가정을 주의하라

코드 작성 시 가정을 하면 코드가 더 단순해지거나, 더 효율적이다. 그러나 이러한 가정으로 인해 코드가 더 취약해지고 활용도가 낮아져 재사용하기에 안전하지 않을 수 있다.

코드의 어느 부분에서 어떤 가정이 이루어졌는지 추적하는 것은 어렵기 때문에 이런 가정은 다른 개발자들의 주의하지 않으면 빠질 수 있는 기분 나쁜 함정이 될 수 있다.

이러한 점을 고려할 때, 코드 작성 시 가정을 하기 전에 그 가정으로 초래될 비용과 이점을 생각해봐야 한다. 코드 단순화 또는 효율성의 명백한 이득이 미미하다면 하지 않는 것이 낫다.

가정이 필요하다면 강제적으로 하라

우리가 상정한 가정으로 인해 다른 개발자들이 무의식중에 곤란을 겪지 않도록 하기 위해 가정을 강제적으로 시행해야 한다. 다음 두 가지 방법을 사용할 수 있다.

  • 가정이 깨지지 않게 만들라. 가정이 깨지면 컴파일되지 않는 방식으로 코드를 작성한다면 가정이 항상 유지될 수 있다.
  • 오류 전달 기술을 사용하라. 가정이 깨지게 되면 오류를 감지하고 신속하게 실패하도록 코드를 작성하라

2. 전역 상태를 주의하라

전역변수는 프로그램 내의 모든 콘텍스트에 영향을 미치기 때문에 전역변수를 사용할 때는 누구도 해당 코드를 다른 목적으로 재사용하지 않을 것이라는 암묵적인 가정을 전제한다. 가정에는 비용이 수반된다. 전역 상태는 코드를 매우 취약하게 만들고 재사용하기에 안전하지 않기 때문에 일반적으로 이점보다 비용이 더 크다.

공유 상태에 의존성을 주입하라

의존성 주입은 전역 상태를 사용하는 것보다 더 통제된 방법으로 서로 다른 클래스 간에 상태를 공유하는 좋은 방법이다.

3. 기본 반환값을 적절하게 사용하라

기본값을 제공하려면 종종 다음과 같은 두 가지 가정이 필요하다.

  • 어떤 기본값이 합리적인지
  • 더 상위 계층의 코드는 기본값을 받든지 명시적으로 설정된 값을 받든지 상관하지 않는다.

이런 가정은 상위 수준의 코드에서 하는것이 낮은 층위에서 하는 것보다 비용이 적게 드는 경향이 있다. 상위 수준의 코드는 특정 사용 사례에 더 밀접하게 결합하므로 코드의 모든 용도에 맞는 기본값을 선택하기가 쉽다.

반면에 낮은 수준의 코드는 보다 근본적인 하위 문제를 해결하여 여러 사용 사례에 더 광범위하게 재사용되는 경향이 있다. 따라서 낮은 층위에서 모든 용도에 적합한 기본값을 선택하기가 훨씬 더 어렵다.

상위 수준의 코드에서 기본값을 제공하자

4. 함수의 매개변수를 주목하라

함수가 데이터 객체나 클래스 내에 포함된 모든 정보가 있어야 하는 경우에는 해당 함수나 객체나 클래스의 인스턴스를 매개변수로 받는 것이 타당하다. 이렇게 하면 함수 매개변수의 수가 줄어들고 캡슐화된 데이터의 자세한 세부 사항을 처리해야 하는 코드가 필요없다.

그러나 함수가 한두 가지 정보만 필요로 할 때 객체나 클래스의 인스턴스를 매개변수로 사용하는 것은 코드의 재사용성을 해칠 수 있다.

필요 이상으로 매개변수를 받는 함수는 재사용이 어려울 수 있다.

TextBox.setTextColor 함수는 텍스트 색상만 설정한다. 이 함수의 매개변수로 TextOptions 인스턴스 전체를 사용할 필요는 없다. 그렇게 하는 것은 불필요함을 넘어, 누군가가 그 기능을 조금 다른 상황에 재사용하고자 할 때 해로운 영향을 끼친다. 함수는 필요한 것만 매개변수로 받는 것이 더 바람직하다.

5. 제네릭의 사용을 고려하라

제네릭을 통해 참조한느 모든 유형을 구체적으로 명시할 필요 없이 클래스를 작성할 수 있다.

특정 유형에 의존하면 일반화를 제한한다. 제네릭을 사용하여 코드를 일반화 하자.