[Kotlin] 인터페이스 위임 자바.time.Clock 활용
7897 단어 Kotlin
이 보도에 기재된 방법 중 효과적으로 이용하는 장소는 유한한 것 같다.
상세한 상황은 문말에 보충할 것입니다. 그러나 자바를 우직해 주십시오.time.구성원 변수에 Clock을 추가하는 방법이 가장 효과적인 것 같습니다.
프로그래머는 the World를 사용하고 싶어 합니다.
현재 날짜와 시간을 가져오는 프로그램에서
Kottlin에서 날짜와 시간을 처리하면 자바입니다.타임 라이브러리를 자주 사용하지만java.시간 라이브러리에서'시험 시 고정 날짜'를 실현하면 좀 번거롭다.
실현 방법에 관해서는
java.time.Clock
가 현재 일본에서 취득할 때 건네주면 된다1고 몇몇 사이트에서 소개했다.// import java.time.Clock
class Something(
val clock: Clock // DIとかでもってくる
) {
fun doSomething() {
val today = LocalDate.now(clock) // clockのインスタンスを渡す
//...後略
}
}
방법은 옳은 것 같지만, 이 실례를 참조하는 필드를 모든 사용 장소에 추가하는 것은 지능적이지 않은 것 같다.참고로 Kotolin은 인터페이스 의뢰(interface delegation)기교가 있다입니다.
이것을 이용해서 다른 방법을 생각해 보세요.
중임을 맡기다
1. 인터페이스 및 의뢰 대상 만들기
// import java.time.Clock
interface ClockReference {
val clock: Clock
}
class ClockProvider : ClockReference, KoinComponent {
override val clock: Clock by inject()
}
java.time.Clock
형식 필드가 있는interface를 정의하고 이 인터페이스를 실현하는class2를 만듭니다.object는
Clock
형식의 필드를 오버라이드합니다.초기화는 DI에서 수행합니다.샘플에서 DI 프레임워크Koin로 사용합니다.
KoinComponent
의 실현은 주입에 의존하는 대상임을 나타낸다.by inject () 는 DI를 통해 의존을 주입합니다.2. Clock의 활용 클래스에서 인터페이스 구현을 선언하고 구현 의뢰
interface ISomething {
fun doSomethingWithDate()
}
class Something : ISomething, ClockReference by ClockProvider() {
override fun doSomethingWithDate() {
val today = LocalDate.now(clock) // ClockReferenceのフィールドを参照
println("Today is $today. Everything is fine.")
}
}
Clock의 활용 클래스에서 발표ClockReference
의 실시와 실시에 대한 위탁ClockReference by ClockProvider()
.이렇게 하면 필드를 추가하지 않고 Clock 유형의 인스턴스를 자유롭게 처리할 수 있습니다.
Clock Provider를 통해 DI에서 Clock 유형의 인스턴스를 제공합니다.
테스트 인스턴스를 DI 컨테이너에 등록하면 고정 시간의 Clock, Mockk 등 프로그램 라이브러리의 Mock을 삽입할 수 있습니다.
동작 확인 코드
fun main() {
prepareDi() // diコンテナにinstance登録。詳細は割愛
val something: ISomething = Something()
something.doSomethingWithDate()
// 実行結果:Today is {実行日}. Everything is fine.
}
전체 코드 요점
ClockReference
의 설치 클래스(상기 예에서 Something이라고 부른다)에서 Clock에 대한 의존성을 알 수 없다.원래 LocalDate입니다.now() 및 System.current Time Millis() 등의 활용에 제한이 없다면 원래 시스템 내 시계에 대한 의존성은 존재하지 않기 때문에 이런 상황에서 문제가 없을 것 같다.다른 한편, 은밀한 의존을 기본적으로 배제하면 이 방법은 적합하지 않다.
ClockReference
의 실현 클래스에서 clock 필드는 클래스 외부에 노출됩니다.ClockProvider
는 특정 DI 프레임워크에 따라 다릅니다.ClockReference
의 이용류는 변경된 영향이 거의 없을 것이다.클래스를 이용하는 것은 Clock Reference의 Clock 필드만 이용하는 것이기 때문에 필드를 어떻게 제공하는지 알 수 없습니다.그럼에도 DI에 의존하는 학급이 DI와 분리된 학급에 나타나면 무섭다.이 채용 여부도 개발 방침에 따른 것이다.시험 시간이 멈춘 것으로 조사되었는데, 읽은 《java.time.Clock에서 현재 시간의 UT 처리》을 촉발하여 썼다.
(minimal) cake pattern, cake로 공개할 수 있다는 것을 이해하지 못해 Kotlin Bootcamp에서 사용된 인터페이스 의뢰라는 단어로 도망갔다.
Clock
많은 곳에서 은밀하게 이용되기 때문에 테스트할 때 Clock의 Mocking은 항상 어려움이 있다(예를 들어api의 호출 횟수를 파악하기 어렵다).클록의 필드를 인터페이스에 배치하는 대신 인터페이스에 피드백 now() 등을 배치해 결과를 내는 에이피도 좋은 방법이다.
Clock은 일반적으로 필드 (구조자 파라미터) 에 덧붙여서 가장 사용하기 쉽다.
이 글의 방법으로 ClockProvider의 초기화는 DI만 사용할 수 있습니다.
테스트할 때도 같은 DI를 사용할 수 있지만, 다른 방법으로 모크를 삽입하려고 할 때는 도선이 없기 때문에 막힌다.
얻을 수 있는 이점에 대해 나는 잃어버린 확장성이 너무 크다고 생각한다.
글을 쓸 때 DI 개미 테스트를 계속 썼는데 얼핏 보면 바보였지만 눈치채지 못했다.선문의 사람이 만일 있으면 떳떳하지 못하다.
Clock의 지능적인 사용법에 이런 게 있어요. 있다면 꼭 알려주세요...🙏
만약 이 방법에 활로가 있다면, 그 정보도 반드시 필요하다.
예: stackoverflow↩
만약 Object에서 실현된다면, 예를 들어 자동 테스트를 연속으로 실행할 때 고장이 발생할 수 있습니다.object에서 생성된 단식 실례는 여러 테스트에서 공유됩니다.매번 테스트 교체 모듈 등 기본적인 수요를 만족시킬 수 없다. ↩
Reference
이 문제에 관하여([Kotlin] 인터페이스 위임 자바.time.Clock 활용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sato_tats/items/8b8612897c63c19964c2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)