Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/main/kotlin/ezhoon/chapter06/Event.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ezhoon.chapter06

import java.time.Duration
import java.time.LocalDateTime

data class Event(
private val subject: String,
val from: LocalDateTime,
val duration: Duration,
) {

fun isSatisfied(schedule: RecurringSchedule): Boolean = !(from.dayOfWeek != schedule.dayOfWeek || from.toLocalTime() != schedule.from || duration != schedule.duration)

fun reschedule(schedule: RecurringSchedule): Event = copy(
from = LocalDateTime.of(
from.toLocalDate().plusDays(daysDistance(schedule)),
schedule.from
),
duration = schedule.duration
)

private fun daysDistance(schedule: RecurringSchedule): Long = (schedule.dayOfWeek.value - from.dayOfWeek.value).toLong()
}
49 changes: 49 additions & 0 deletions src/main/kotlin/ezhoon/chapter06/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# 메시지와 인터페이스

## 디미트의 법칙

> 캡슐화를 다른 관점에서 표현한 것이다.
> 묻지 말고 시켜라.

- 절차지향과 다르게, 객체지향은 객체에게 행동을 지시한다.
- 내부의 상태를 이용해 어떤 메시지를 보내는 행동이 외부에서 실행이 된다면 캡슐화를 제대로 못한 것이다.

## 원칙의 함정

> 절대적인 법칙은 없다.
> 소프트웨어 설계에 법칙이란 존재하지 않고, 원칙만 존재한다.

- 설계는 트레이드오프의 산물이다.
- 초보자는 원칙을 맹목적으로 추종하게되고, 서로 충돌하는 경우에도 원칙에 정당성을 부여하려고 한다.
- 원칙이 현재 상황에 부적합하다고 판단이 되면 무시하자.
- 부적합하다고 판단을 했다는 것 자체가 해당 원칙의 장단점을 충분히 이해했다고 봐도 무방하다.
- 그렇기에 부적합하다고 판단이 된다면 무시하자.

### 디미터 법칙에 대해서 오해하지 말자.

> 디미터 법칙을 `하나의 도트만 사용하라` 라고도 요약되기도 한다.

```kotlin
IntStream.of(1, 15, 20, 3, 9).filter { x: Int -> x > 10 }.distinct().count()
```

그럼 위 코드는 위반한 것인가?

- 아니다. `IntStream` 이라는 동일한 클래스의 인스턴스를 반환한다.
- 그렇기에 `IntStream` 하나로 결합이 돼있고, 내부 구현에서만 모든 것을 처리하기 때문이다.
- 묻는 것도 없었고, 모든 것을 수행하라고 시킬 뿐이다. 그렇기에 디미터 법칙이 위반된 것이 아니다.

**그렇기에 하나 이상의 도트를 사용하는 모든 케이스가 디미터 법칙을 위반한 것은 아니다.**

### 디미터 법칙은 완벽한가?

> No이다.

- 객체에게 시키는 것이 항상 가능하지는 않다.
- 어떤때에는 물어야하는 경우도생긴다.
- 어떤 원칙이 적절한지 부적절한지 판단한 수 있는 안목을 길러야 한다.
- 설계는 트레이드오프의 산물이다.



**소프트웨어 설계에 법칙이란 존재하지 않는다. `원칙`이 존재할 뿐이다.**
12 changes: 12 additions & 0 deletions src/main/kotlin/ezhoon/chapter06/RecurringSchedule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ezhoon.chapter06

import java.time.DayOfWeek
import java.time.Duration
import java.time.LocalTime

class RecurringSchedule(
private val subject: String,
val dayOfWeek: DayOfWeek,
val from: LocalTime,
val duration: Duration
)
32 changes: 32 additions & 0 deletions src/test/kotlin/ezhoon/chapter06/EventTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ezhoon.chapter06

import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import java.time.*

class EventTest {

@Test
@DisplayName("반복일정 테스트 코드")
fun recurringScheduleTest() {
// given
val schedule = RecurringSchedule(
"회의",
DayOfWeek.WEDNESDAY,
LocalTime.of(10, 30),
Duration.ofMinutes(30)
)
val meeting = Event(
"회의",
LocalDateTime.of(2019,5,8,10,30),
Duration.ofMinutes(30)
)
// when -> 이 테코에는 여기 뭐 들어가야하지?


// then
assertTrue(meeting.isSatisfied(schedule))
assertTrue(meeting.reschedule(schedule).duration == schedule.duration)
}
}