Java / Kotlin: вернуть объект из функции, не возвращая его - PullRequest
0 голосов
/ 05 марта 2020

Зная, что в Kotlin / Java объекты функций передаются как копия его ссылки. Мне было интересно, если Option 2 лучше, чем Option 1. Я думаю, что в некоторых случаях Option 1 более читабельно, но я не уверен, есть ли у него недостатки.

Опция 1

fun modifyListFunction(someList: List): List {
    // modifify items in someList
    return someList
}

someList = modifyListFunction(someList)
someList = modifyListFunction2(someList)
someList = modifyListFunction3(someList)

Опция 2

fun modifyListFunction(someList: List) {
    // modifify items in someList
}

modifyListFunction(someList)
modifyListFunction2(someList)
modifyListFunction3(someList)

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Когда функция возвращает объект, программист чтения поймет, что эта функция необходима для получения какого-либо объекта. Если вы что-то делаете с объектом внутри функции, которая возвращает void, то, если вы не прочитаете функцию, будет невозможно понять, повлияет ли эта функция на объект, который ей передан. Кроме того, второй подход увеличивает вероятность ошибок.
В общем, вы должны придерживаться правила: «Если вы хотите изменить входные данные и сделать с ними что-то еще, функция должна вернуть результат. Если входные данные используются только для чтения любой информации из них, тогда вы не можете вернуть void "

0 голосов
/ 05 марта 2020

Как правило, программисты, читающие подпись варианта 1, ожидают, что будет возвращен новый список. Так что, если вы изменяете список, ничего не возвращайте (вариант 2). Если вы создаете новый список, возвращайте новый список.

Вам следует использовать вариант 1, только если ваша семантика действительно делает очевидным, что вы возвращаете тот же объект (например, вы создаете API, который явно предназначен для цепочки, как строитель). Но если бы это было так, я бы, вероятно, go для функции расширения и сделал бы someList получателем вместо аргумента.

Обратите внимание, что типы коллекций редко используются таким образом, так что вы, вероятно, должны не go для варианта 1 в вашем случае.

0 голосов
/ 05 марта 2020

Я бы предложил использовать функции расширения Kotlin. Результат будет выглядеть как Опция 1 , но будет более читабельным и проще для цепного вызова.

fun main() {
    val list = listOf(Type())
    list.func().func2().func3()
}

class Type

fun List<Type>.func(): List<Type> {
    // modify list
    return this // returns list
}
fun List<Type>.func2() = this
fun List<Type>.func3() = this
...