Можно удалить дубликаты при использовании лямбда-функции в функции более высокого порядка - PullRequest
0 голосов
/ 20 июня 2019

Вот мое приложение для Android

 suspend fun getTraidersList(isCustomtHandle: Boolean = false): Any {
            if (isCustomtHandle) {
                return runOperationWithoutHandle {
                    traderMonitorRestClient.getTraidersList()
                }
            } else {
                return runOperationWithDefaultHandle {
                    traderMonitorRestClient.getTraidersList()
                }    
            }
        }

 suspend fun executeTraderOperation(traderOperation: Trader.Operation, base: String, quote: String, isCustomtHandle: Boolean = false): Any {
            val sender = BuildConfig.APPLICATION_ID + "_" + BuildConfig.VERSION_NAME
            val key = DateUtil.getDateAsString(Date(), "mmHHddMMyyyy")
            if (isCustomtHandle) {
                return runOperationWithoutHandle {
                    traderMonitorRestClient.executeTraderOperation(traderOperation.toString().toLowerCase(), base.trim(), quote.trim(), sender, key)
                }
            } else {
                return runOperationWithDefaultHandle {
                    traderMonitorRestClient.executeTraderOperation(traderOperation.toString().toLowerCase(), base.trim(), quote.trim(), sender, key)
                }
            }
        }

        suspend private fun runOperationWithoutHandle(func: suspend () -> Response<*>): Response<*> = withContext(Dispatchers.IO) {
            val response: Response<*> = func() // in runtime replace by method body (e.g. traderMonitorRestClient.getTraidersList())
            response
        }

        suspend private fun runOperationWithDefaultHandle(func: suspend () -> Response<*>): TransportResponse = withContext(Dispatchers.IO) {
            try {
                val response: Response<*> = func() // in runtime replace by method body (e.g. traderMonitorRestClient.getTraidersList())
                if (response.isSuccessful) { // status (200-299)
                    onSuccess(response)
                } else {// error - status (300-599)
                    val errorResponse: ErrorResponse = ErrorUtils.parseError(response)
                    onError(errorResponse)
                }
            } catch (e: Throwable) {
                val errorResponse = ErrorResponse()
                errorResponse.setCode(SERVICE_UNAVAILABLE_CODE)
                errorResponse.message = MyApplication.getAppContext().getString(R.string.service_unavailable)
                onError(errorResponse)
            }
}

Если isCustomtHandle равно true , тогда вызвать лямбду "runOperationWithoutHandle". Эта лямбда ТОЛЬКО выполняет http-запрос и не обрабатывает.

Если isCustomtHandle равно false , тогда вызвать лямбду "runOperationWithDefaultHandle". Эта лямбда-функция выполняет http-запрос и обрабатывает ответ.

OK. Это отлично работает.

Но, как вы можете видеть, дубликат в строке

traderMonitorRestClient.executeTraderOperation(traderOperation.toString().toLowerCase(), base.trim(), quote.trim(), sender, key)

и

строка

traderMonitorRestClient.getTraidersList()

Как я могу удалить этот дубликат? Я хочу звонить на линии

traderMonitorRestClient.executeTraderOperation(traderOperation.toString().toLowerCase(), base.trim(), quote.trim(), sender, key)

и

traderMonitorRestClient.getTraidersList()

только один раз.

Как я могу это сделать?

1 Ответ

1 голос
/ 20 июня 2019

Не могли бы вы добавить анонимную функцию приостановки локально внутри функции executeTraderOperation и вызвать ее из двух ветвей оператора if?например,

suspend fun executeTraderOperation(...): Any {
    ...
    suspend fun execOperation() = traderMonitorRestClient.executeTraderOperation(
        traderOperation.toString().toLowerCase(), base.trim(), quote.trim(), sender, key)

    if (isCustomtHandle) {
        return runOperationWithoutHandle(::execOperation)
    } else {
        return runOperationWithDefaultHandle(::execOperation)
    }
...