Skip to content

Commit

Permalink
Docs: Add Objects/Chapter08.md
Browse files Browse the repository at this point in the history
  • Loading branch information
fkdl0048 committed Mar 20, 2024
1 parent 8fffd6a commit 6ff4051
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions Objects/Chapter08.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
## 8장 의존성 관리하기

잘 설계된 애플리케이션은 작고 응집도 높은 객체들로 구성된다. 작고 응집도가 높은 객체란 책임의 초점이 명확하고 한 가지 일만 잘하는 객체를 의미한다. 이런 작은 객체들은 단독으로 수행할 수 있는 작업이 거의 없기 때문에 다른 객체의 도움이 필요하다. 이런 과정에서 협력을 낳는다.

객체지향 세계에서 협력은 필수적이지만, 설계를 곤경에 빠뜨릴 수 있다. 협력은 객체가 다른 객체에 대해 알아야 함을 강조한다. 즉, **다른 객체와 협력하기 위해서는 그런 객체가 존재한다는 사실을 알아야 하며 이런 지식들이 객체 사이의 의존성을 만든다.**

협력을 위해서는 의존성이 필요하지만 과도한 의존성은 애플리케이션을 수정하기 어렵게 만든다. (버그 가능성도 높아짐) 객체지향 설계의 핵심은 협력을 위해 필요한 의존성은 유지하면서도 변경을 방해하는 의존성은 제거하는데 있다.

*쉽게 스파게티 코드가 가장 협력을 많이 하는 코드가 아닐까? 실제 개개인이 자율성을 가지고 하는 작업이 효율성이 제일 잘 나오는 것처럼 코드도 관리자 주도형과 같이 하나의 컨트롤러, 매니저가 모든 일을 담당하여 처리하면 효율성과 작업의 퀄리티가 떨어질 수 있다. 이런 부분에서는 객체지향이 일상세계와 많이 닮아있다는 생각이 든다.*

### 의존성 이해하기

#### 변경과 의존성

어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이에 의존성이 생기게 된다. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다.

- 실행 시점: 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다.
- 구현 시점: 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경된다.

```csharp
public class PeriodCondition : DiscountCondition
{
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;

public bool IsSatisfiedBy(Screening screening)
{
return screening.GetStartTime().GetDayOfWeek().Equals(dayOfWeek) &&
startTime.CompareTo(screening.GetStartTime().ToLoaclTime()) <= 0 &&
endTime.CompareTo(screening.GetStartTime().ToLoaclTime()) >= 0;
}
}
```

`PeriodCondition`클래스의 `IsSatisfiedBy`메서드는 `Screening`인스턴스에게 `GetStartTime`메시지를 전송한다.

정리하면 실행 시점에 `PeriodCondition`의 인스턴스가 정상적으로 동작하기 위해서는 `Screening`의 인스턴스가 존재해야 한다.

0 comments on commit 6ff4051

Please sign in to comment.