-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
80 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
# 9. 코드를 재사용하고 일반화할 수 있도록 하라 | ||
|
||
<!-- TOC --> | ||
|
||
* [9. 코드를 재사용하고 일반화할 수 있도록 하라](#9-코드를-재사용하고-일반화할-수-있도록-하라) | ||
* [9.1 가정을 주의하라](#91-가정을-주의하라) | ||
* [불필요한 가정을 피하라](#불필요한-가정을-피하라) | ||
* [가정이 필요하면 강제적으로 하라](#가정이-필요하면-강제적으로-하라) | ||
* [9.2 전역 상태를 주의하라](#92-전역-상태를-주의하라) | ||
* [전역 상태를 갖는 코드는 재사용하기에 안전하지 않을 수 있다](#전역-상태를-갖는-코드는-재사용하기에-안전하지-않을-수-있다) | ||
* [공유 상태에 의존성 주입하라](#공유-상태에-의존성-주입하라) | ||
* [9.3 기본 반환값을 적절하게 사용하라](#93-기본-반환값을-적절하게-사용하라) | ||
* [낮은 층위의 코드의 기본 반환값은 재사용성을 해칠 수 있다](#낮은-층위의-코드의-기본-반환값은-재사용성을-해칠-수-있다) | ||
* [9.4 함수의 매개변수를 주목하라](#94-함수의-매개변수를-주목하라) | ||
* [9.5 제네릭 사용을 고려하라](#95-제네릭-사용을-고려하라) | ||
|
||
<!-- TOC --> | ||
|
||
## 9.1 가정을 주의하라 | ||
|
||
- 코드 작성 시 가정을 하면 코드가 더 단순해지거나 더 효율적으로 되거나, 둘 다일 수도 있다. | ||
- 하지만, 가정으로 인해 코드가 더 취약해지고 활용도가 낮아져 재사용하기에 안전하지 않을 수 있다. | ||
- 가정은 코드 재사용 시 버그를 초래할 수 있다. | ||
|
||
### 불필요한 가정을 피하라 | ||
|
||
- 최적화는 보통 프로그램 내에서 수천 번 혹은 수백만 번 실행되는 코드 부분에 대해 이루어질 때 상당한 이점이 있다. | ||
- 따라서, 대부분의 경우에는 큰 효과 없는 코드 최적화를 하느라고 애쓰기보다는 코드를 읽을 수 있고, 유지보수 가능하며, 견고하게 만드는 데 집중하는 것이 좋다. | ||
- 가정으로 인해 얻는 이득이 미미하다면, 오히려 비용이 이점보다 훨씬 클 수 있음을 기억하자. | ||
|
||
### 가정이 필요하면 강제적으로 하라 | ||
|
||
**상정한 가정으로 인해 다른 개발자들이 무의식 중에 곤란을 겪지 않도록 하기 위해 가정을 강제적으로 시행해야 한다. 이를 위해 다음 두 가지 방법을 사용할 수 있다.** | ||
|
||
- `가정이 깨지지 않게 만들라` : 가정이 깨지면 컴파일조차 안되도록 코드를 작성할 수 있다면 가정을 항상 유지될 수 있다. | ||
- `오류 전달 기술을 사용하라` : 가정을 깨는 것이 불가능하게 만들 수 없는 경우에는 오류를 감지하고 오류 신호 전달 기술을 사용하여 신속하게 실패하도록 코드를 작성할 수 있다. | ||
|
||
**(결론) 강제되지 않은 가정은 문제의 소지가 있다. 가정이 필요하다면, 강제적으로 하도록 한다.** | ||
|
||
## 9.2 전역 상태를 주의하라 | ||
|
||
- 전역 상태 또는 전역변수는 실행되는 프로그램 내의 모든 콘텍스트 사이에 공유된다. | ||
- 전역변수는 프로그램 내의 모든 콘텍스트에 영향을 미치기 때문에 전역변수를 사용할 때는 누구도 해당 코드를 다른 목적으로 재사용하지 않을 것이라는 암묵적인 가정을 전제한다. (가정에 대한 비용이 수반됨) | ||
- 전역 상태는 코드를 매우 취약하게 만들고 재사용하기도 안전하지 않기 때문에 일반적으로 이점보다 비용이 더 크다. | ||
|
||
### 전역 상태를 갖는 코드는 재사용하기에 안전하지 않을 수 있다 | ||
|
||
- 여러 코드가 동일한 전역 상태를 읽고 수정하면 서로에게 의도하지 않은 결과를 초래할 수 있다. | ||
|
||
### 공유 상태에 의존성 주입하라 | ||
|
||
- 의존성 주입은 전역 상태를 사용하는 것보다 더 통제된 방법으로 서로 다른 클래스 간에 상태를 공유하는 좋은 방법이기도 하다. | ||
- 프로그램의 서로 다른 부분 간에 상태를 공유해야 할 경우, 의존성 주입을 사용해 보다 통제된 방식으로 수행하는 것이 더 안전하다. | ||
|
||
## 9.3 기본 반환값을 적절하게 사용하라 | ||
|
||
- 합리적인 기본값은 사용자 친화적인 소프트웨어를 만들기 위한 좋은 방법이다. | ||
- 기본값을 제공하려면 종종 다음과 같은 두 가지 가정이 필요하다. | ||
- 어떤 기본값이 합리적인가? | ||
- 더 상위 계층의 코드는 기본값을 받든 지 명시적으로 설정된 값을 받든 지 상관하지 않는다. | ||
- 위와 같은 가정은 상위 수준의 코드에서 하는 것이 비용이 적게 드는 경향이 있다.(특정 용례에 더 밀접하게 결합하기 때문) | ||
|
||
### 낮은 층위의 코드의 기본 반환값은 재사용성을 해칠 수 있다 | ||
|
||
- 가정은 상위 계층에 영향을 미친다. | ||
- 낮은 층위의 코드에서 기본값을 반환하면 높은 층위의 코드에 영향을 미치는 가정을 하는 것이 된다. | ||
|
||
**(결론) 기본값을 반환하면 그 위의 모든 상위 계층에서 해당 값을 사용할 것이라고 가정하기 때문에 코드 재사용과 적응성을 제한할 수 있다.** | ||
|
||
## 9.4 함수의 매개변수를 주목하라 | ||
|
||
- 함수가 데이터 객체나 클래스 내에 포함된 모든 정보가 있어야 하는 경우에는 해당 함수가 객체나 클래스의 인스턴스를 매개변수로 받는 것이 타당하다. | ||
- 하지만, 함수가 한두 가지 정보만 필요로 할 때는 객체나 클래스의 인스턴스를 매개변수로 사용하는 것은 코드의 재사용성을 해칠 수 있다. | ||
- 필요 이상으로 매개변수를 받는 함수는 재사용하기 어려울 수 있다. 대신, 함수가 필요한 것만 매개변수로 받도록 하자. | ||
- 10가지 항목을 캡슐화하는 클래스가 있고 그중 8개를 필요로 하는 함수가 있다면, 캡슐화 객체 전체를 함수에 전달하는 것이 합리적일 것이다. 즉, 상황을 보고 스스로 판단해야 한다. | ||
|
||
## 9.5 제네릭 사용을 고려하라 | ||
|
||
- 다른 클래스를 참조하는 코드를 작성하지만 그 클래스가 어떤 클래스인지 신경 쓰지 않는다면 제네릭의 사용을 고려해야 한다. | ||
- 특정 유형에 의존하면 일반화를 제한한다. 대신 제네릭을 사용해보자. |