Skip to content

Commit

Permalink
아톰 9장 정리
Browse files Browse the repository at this point in the history
  • Loading branch information
le2sky committed Mar 7, 2024
1 parent 429e7c1 commit 85fc633
Showing 1 changed file with 80 additions and 0 deletions.
80 changes: 80 additions & 0 deletions Chapter9/atom.md
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 제네릭 사용을 고려하라

- 다른 클래스를 참조하는 코드를 작성하지만 그 클래스가 어떤 클래스인지 신경 쓰지 않는다면 제네릭의 사용을 고려해야 한다.
- 특정 유형에 의존하면 일반화를 제한한다. 대신 제네릭을 사용해보자.

0 comments on commit 85fc633

Please sign in to comment.