Это очень плохая практика использования!в котлин? - PullRequest
0 голосов
/ 20 декабря 2018

Недавно было некоторое обсуждение того, является ли !!следует использовать в коде kotlin.Одно мнение заключается в том, что его вообще не следует использовать, потому что это плохая практика с kotlin и увеличивает риск сбоя.

Другое мнение чувствует использование !!это не совсем плохая вещь, если вы знаете, что обнуляемые данные не должны быть нулевыми в любом месте при любом известном условии !!там просто охранник (если он неожиданно станет нулевым в том месте, где его не должно быть! он поймает его и вызовет беспокойство, тогда его обязательно нужно исследовать).Это не должно рассмотреть использование !!является одной из причин сбоя.

Есть ли у кого-то мнение против или против использования !!(не используйте его вслепую)?

двумя примерами ниже, не видите, что dataCount_2 будет лучше, или?

var data: List<Data>? = null  // it will be set before calling the two dataCount()

fun dataCount_1() : Int {
    return if (data!=null && data!!.isNotEmpty())  data!![0].count else 0
}

fun dataCount_2() : Int {

    data?.let { dataList ->
        if (dataList.isNotEmpty()) {
            return dataList[0].count ?: 0
        }
    }
    return 0
}

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

На самом деле в этом случае самым простым и безопасным способом было бы сделать это так:

var data: List<Data>? = null  // it will be set before calling the two dataCount()

fun dataCount() : Int {
    val data = data
    return when {
        data == null || data.isEmpty() -> 0
        else -> data[0].count
    }
}

, хотя я бы лично использовал run, чтобы превратить его в однострочную функцию.

fun dataCount() : Int = run {
    val data = data
    when {
        data == null || data.isEmpty() -> 0
        else -> data[0].count
    }
}

Но это может быть только я.

В любом случае, если вы присваиваете непостоянную переменную для val (или держите ее в закрытии, как вы делаете с ?.let {во втором примере), вы можете использовать умное приведение, и вам не нужно будет использовать !!.

0 голосов
/ 20 декабря 2018

В этом случае есть несколько идиоматических способов выразить идею без использования !!, поэтому определенно предпочтительнее не использовать ее.Вот что я хотел бы сделать (используя функцию orEmpty , добавленную в Kotlin 1.3):

fun dataCount() = data.orEmpty().firstOrNull()?.count ?: 0

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

0 голосов
/ 20 декабря 2018

Я не думаю, что в dataCount_1() нужны !!, так как после явной проверки нуля компилятор знает, что data не может быть нулем, и умно приводит к необнуляемому типу.

Итак, хотя очень мало случаев, когда !! может быть уместным, я не думаю, что это один из них!

(Кроме того, в этом случае вы можете внести еще два измененияcase: используйте lateinit var, который снова не потребует !!, и замените все условие более кратким .isNotNullOrEmpty().)

В целом мой опыт показывает, что Для большинства времени, когда вы достигаете !!, есть лучший подход.Но я бы не запретил это полностью: если вы тщательно рассмотрели все альтернативы и по-прежнему думаете, что !! - это самый ясный и безопасный способ, тогда продолжайте.

...