kotlin-style-guide icon indicating copy to clipboard operation
kotlin-style-guide copied to clipboard

Разрешить вызывать лямбды без явного вызова `invoke`

Open osipxd opened this issue 3 years ago • 4 comments

С приходом Compose лямбды теперь передаём в параметрах чаще и необходимость явно прописывать invoke, как мне кажется, только усложняет чтение кода. Пример:

@Composable
fun ProfileScreenContent(
    header: @Composable LazyItemScope.() -> Unit,
    body: LazyListScope.() -> Unit,
    footer: @Composable LazyItemScope.() -> Unit,
) {
    LazyColumn {
        item(content = header)
        // Что тут происходит? Передаём параметр в лямбду?
        // А, нет. Передаём контекст, на котором нужно вызвать лямбду
        body.invoke(this@LazyColumn)
        // При этом не вижу проблем с вызовом без invoke, исчезает куча лишней информации
        body()
        item(content = footer)
    }
}

Я в очередной раз забыл какие были аргументы за то чтобы явно вызывать invoke, хорошо если кто-нибудь напишет их в комментариях.

osipxd avatar Feb 09 '22 11:02 osipxd

В общем тоже за разрешение.

Обычно только по контексту понятно где стоит c invoke, а где нет. У меня бывали примеры когда лучше что-то с invoke, но это не про лямбды было. Были UseCase, в которых один метод-оператор invoke. Типа удобно вызывать казалось. Но стоит ли вызывать doSomethingUsefulUseCase() или doSomethingUsefulUseCase.invoke() - спорно, мне с invoke понятнее что происходит.

Но, как видно, зависит от того чем является сущность которую мы вызываем так. Относительно лямбды - она по факту функция и почему бы не вызывать как функцию.

Jeevuz avatar Feb 09 '22 11:02 Jeevuz

@Jeevuz случай когда решили в UseCase делать operator invoke, кажется, должен разруливаться на уровне договорённостей внутри проекта. И либо использовать короткий вызов через скобки, либо не добавлять к invoke ключевое слово operator и использовать как вызов функции. Т.к. смысл в добавлении operator есть только тогда, когда эта функция используется как оператор.

Если в случае UseCase использование оператора спорно, то для функциональных интерфейсов, самое то.

osipxd avatar Feb 22 '22 10:02 osipxd

Дада, я и привел пример случая когда может казаться спорным. А с лямбдой наоборот кажется то что надо.

Jeevuz avatar Feb 22 '22 18:02 Jeevuz

Кажется лайки есть, и против никто не высказался. Имхо, можно бы сделать PR @osipxd

Jeevuz avatar Apr 26 '22 10:04 Jeevuz