210601 Tue

Sunny·2021년 6월 2일
0

Today I Learned

목록 보기
67/88

1. 첫 번째 학습 내용: 배열 고차함수 forEach(_:)

Instance Method
forEach(_:)

Calls the given closure on each element in the sequence in the same order as a for-in loop.

let numberWords = ["one", "two", "three"]
for word in numberWords {
    print(word)
}
// Prints "one"
// Prints "two"
// Prints "three"

numberWords.forEach { word in
    print(word)
}
// Same as above

Using the forEach method is distinct from a for-in loop in two important ways:

  1. You cannot use a break or continue statement to exit the current call of the body closure or skip subsequent calls.
  2. Using the return statement in the body closure will exit only from the current call to body, not from any outer scope, and won’t skip subsequent calls.

2. 두 번째 학습 내용: Let's TDD

의존성 주입이 안돼서 모든 곳에 커플링이 걸려있다.
그래서 네트워크를 분리하기 어렵다.

모든 클래스에 커플링이 걸린다?
= 의존도, 결합도

의존성 주입이란?

소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. "의존성"은 예를 들어 서비스로 사용할 수 있는 객체이다. 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다. "주입"은 의존성(서비스)을 사용하려는 객체(클라이언트)로 전달하는 것을 의미한다. 서비스는 클라이언트 상태의 일부이다. 클라이언트가 서비스를 구축하거나 찾는 것을 허용하는 대신 클라이언트에게 서비스를 전달하는 것이 패턴의 기본 요건이다.

의존성 주입의 의도는 객체의 생성과 사용의 관심을 분리하는 것이다. 이는 가독성과 코드 재사용을 높혀준다.

의존성 주입은 광범위한 역제어 테크닉의 한 형태이다. 어떤 서비스를 호출하려는 클라이언트는 그 서비스가 어떻게 구성되었는지 알지 못해야 한다. 클라이언트는 대신 서비스 제공에 대한 책임을 외부 코드(주입자)로 위임한다. 클라이언트는 주입자 코드를 호출할 수 없다. 그 다음, 주입자는 이미 존재하거나 주입자에 의해 구성되었을 서비스를 클라이언트로 주입(전달)한다. 그리고 나서 클라이언트는 서비스를 사용한다. 이는 클라이언트가 주입자와 서비스 구성 방식 또는 사용중인 실제 서비스에 대해 알 필요가 없음을 의미한다. 클라이언트는 서비스의 사용 방식을 정의하고 있는 서비스의 고유한 인터페이스에 대해서만 알면 된다. 이것은 "구성"의 책임으로부터 "사용"의 책임을 구분한다.

의존성 주입 - 위키백과, 우리 모두의 백과사전

커플링이라는 것은 A 클래스와 B 클래스가 있을 때
이 두개의 클래스가 지나치게 결합도가 높아서
A 클래스를 테스트하기 위해서 무조건 B 클래스가 필요한 상황

그런데 만약 B 클래스에는 네트워크 의존성이 있다고 한다면
A 클래스까지 덩달아 테스트하기 힘들어지는 그런 결합도를 말함

이 상황을 어떻게 개선하느냐?
중간에 프로토콜을 만들어서 이 둘의 결합도를 분리시켜 버림

Q. 뷰랑 애니메이션이 너무 많이 엮어있음
어떻게 테스팅해야 할지 모르겠음

A. 개선 방법
실제 production app에서 사용하는 네트워크 매니저랑
테스트에서 사용하는 매니저를 구분할거임

테스트 환경에서는
세션 매니저의 역할을 흉내만 내는
MockObject를 사용할거임
← 그걸 위해서는 의존성 주입을 시켜줘야 함

Q. Mock과 Spy의 가장 큰 차이?
A. Mock은 Mock 데이터 그 자체가 테스트를 실패시킬 수 있음
(그 안에 assert 문이 있음)

Tip)
Given, When, Then 중에
Then이 중요함
Given이나 When보다 Then을 먼저 작성하는 습관을 가지면
훨씬 더 생각하기 용이함

Let's TDD - 전수열
Test Driven Development in Swift

profile
iOS Developer

0개의 댓글