Идиоматический способ определения вариантов использования из чистой архитектуры в kotlin - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь переключить свои классы вариантов использования с Java на Kotlin и с Rxjava на сопрограммы.

Вот мой класс GetTopSongs.

class GetTopSongs {

    suspend fun execute(limit:Int):Either<List<Song>>{
        //... do stuff
    }
}

Я хочу знать, есть лилучше, чем getTopSongs.execute(10) в Котлине?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Если вы собираетесь использовать Kotlin 1.3, вы можете использовать «вызываемые ссылки на функцию приостановки».Вы предоставляете тип функции для конструктора ViewModel:

class MyViewModel(val usecase: suspend (Int) -> List<Int>) {
    suspend fun doIt() {
        println(usecase(5))
    }
}

Ваши варианты использования могут быть сгруппированы в один или несколько классов:

class MyUsecasses(val myRepo: MyRepo) {
    suspend fun usecase1(para: Int): List<Int> = myRepo...
    suspend fun usecase2(para: String): List<String> = myRepo...
}

При создании ViewModel укажите ссылку на функцию:

val usecases = MyUsecasses(repo)
val viewmodel = MyViewModel(usecases::usecase1)

Если вам не нравится тип функции в конструкторе ViewModel, вы можете использовать typealias:

typealias Usecase1 = suspend (Int) -> List<Int>
class MyViewModel(val usecase: Usecase1) 
0 голосов
/ 16 октября 2018

Первое, что нужно отметить, это то, что Either - это костыль, который вам нужен в API только для FP, например, RxJava.До некоторой степени объединение этих операторов, таких как map и skipUntil, приводит к хорошему коду, но вы должны изучить большой словарь операторов, и все еще есть случаи, когда вам нужно что-то еще.

Большое преимуществосопрограмм Kotlin заключается в том, что вы можете продолжать использовать простой старый императивный стиль программирования с полной мощью операторов потока управления, включая try-catch.Поэтому я рекомендую следующую подпись:

class GetTopSongs {
    suspend operator fun invoke(limit:Int): List<Song> {
       val result = ...
       if (someProblem) throw MyException("problem description")
       else return result
    }
}

Одно из менее очевидных преимуществ возврата к императивному стилю состоит в том, что вы не сталкиваетесь с этими ошибками вывода типа длинной страницы.

0 голосов
/ 16 октября 2018

Использование перегрузки оператора

class GetTopSongs {

    suspend operator fun invoke(limit:Int):Either<List<Song>>{
        //... do stuff
    }
}

Так что вы можете игнорировать дополнительные .execute вызовы:

val getTopSongs = GetTopSongs()
val result = getTopSongs(10)
...