[Kotlin] 인터페이스 위임 자바.time.Clock 활용

7897 단어 Kotlin
(2021/12/24 보충)
이 보도에 기재된 방법 중 효과적으로 이용하는 장소는 유한한 것 같다.
상세한 상황은 문말에 보충할 것입니다. 그러나 자바를 우직해 주십시오.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 필드는 클래스 외부에 노출됩니다.
  • 인터페이스의 필드는 퍼블릭으로만 선언할 수 있기 때문이다.Clock의 인스턴스는 최소한의 imutable의 Api만 있기 때문에 실장류 이외의 참조도 치명상이 되지 않습니다.이렇게 채택할 수 있을지 없을지는 응용 프로그램의 개발 방침에 달려 있다.
  • ClockProvider는 특정 DI 프레임워크에 따라 다릅니다.
  • ...하지만 DI 프레임워크로 변화가 생겼기 때문에 ClockReference의 이용류는 변경된 영향이 거의 없을 것이다.클래스를 이용하는 것은 Clock Reference의 Clock 필드만 이용하는 것이기 때문에 필드를 어떻게 제공하는지 알 수 없습니다.그럼에도 DI에 의존하는 학급이 DI와 분리된 학급에 나타나면 무섭다.이 채용 여부도 개발 방침에 따른 것이다.
  • 매듭을 짓다

  • 시험 시간이 멈춘 것으로 조사되었는데, 읽은 《java.time.Clock에서 현재 시간의 UT 처리》을 촉발하여 썼다.
    (minimal) cake pattern, cake로 공개할 수 있다는 것을 이해하지 못해 Kotlin Bootcamp에서 사용된 인터페이스 의뢰라는 단어로 도망갔다.
  • Clock 많은 곳에서 은밀하게 이용되기 때문에 테스트할 때 Clock의 Mocking은 항상 어려움이 있다(예를 들어api의 호출 횟수를 파악하기 어렵다).
    클록의 필드를 인터페이스에 배치하는 대신 인터페이스에 피드백 now() 등을 배치해 결과를 내는 에이피도 좋은 방법이다.
  • (쓰기도 좀 그렇다고) 단점도 뚜렷해 보통은 필드를 붙이면 음~으로 변하는 심정 사이에서 흔들린다.크론티마
  • 현재 운용(2021/12/24 보충기)
    Clock은 일반적으로 필드 (구조자 파라미터) 에 덧붙여서 가장 사용하기 쉽다.
    이 글의 방법으로 ClockProvider의 초기화는 DI만 사용할 수 있습니다.
    테스트할 때도 같은 DI를 사용할 수 있지만, 다른 방법으로 모크를 삽입하려고 할 때는 도선이 없기 때문에 막힌다.
    얻을 수 있는 이점에 대해 나는 잃어버린 확장성이 너무 크다고 생각한다.
    글을 쓸 때 DI 개미 테스트를 계속 썼는데 얼핏 보면 바보였지만 눈치채지 못했다.선문의 사람이 만일 있으면 떳떳하지 못하다.
    Clock의 지능적인 사용법에 이런 게 있어요. 있다면 꼭 알려주세요...🙏
    만약 이 방법에 활로가 있다면, 그 정보도 반드시 필요하다.
    예: stackoverflow
    만약 Object에서 실현된다면, 예를 들어 자동 테스트를 연속으로 실행할 때 고장이 발생할 수 있습니다.object에서 생성된 단식 실례는 여러 테스트에서 공유됩니다.매번 테스트 교체 모듈 등 기본적인 수요를 만족시킬 수 없다. 

    좋은 웹페이지 즐겨찾기