Kotlin - это плохо. Делегаты
Продолжаем цикл статей про Kotlin
:
В этой статье рассмотрим паттерн делегат и языковую возможность реализации делегата в Koltin.
Паттерн делегат очень простой: один объект передает выполнение своего метода другому объекту. Например, в Java
это выглядит так:
interface Startable {
void start();
}
class Starter implements Startable {
...
}
class GasolineCar implements Startable {
private final Starter starter;
...
@Override
public void start() {
starter.start();
}
}
то есть, чтобы завестись, автомобиль передает команду запуска стартеру. Теперь реализуем то же самое на Kotlin
:
interface Startable {
fun start()
}
interface Car : Startable
class Starter : Startable {
...
}
class GasolineCar(
private val starter: Starter
) : Startable by starter {
}
Нет нет, я не забыл реализовать метод start
у бензинового автомобиля, он там реализован. Разве не видно?
Вот в этой строчке: ) : Startable by starter {
, эта языковая конструкция
с использованием ключевого слова by
говорит, что реализацию методов интерфейса Startable
нужно делегировать полю starter
. При этом декомпилированный в Java
код выглядит так же как и
пример выше на Java
.
Что в этом плохого? Ведь теперь тривиальные реализации интерфейсов можно будет не писать. Вот, какой минус вижу я: Теряется контроль за зоной ответственности объекта, так как непосредственные реализации будут скрыты от взгляда программиста. На ревью сложно оценить количество методов у класса, который использует Class Delegation
На ревью сложно оценить количество методов у класса, который использует Class Delegation
Допустим, вы читаете чужой код, видите там строчку:
gasolineCar.start()
И, вам надо узнать, что происходит в методе start
. Вы знаете, что этот метод вызывается у объекта класса
GasolineCar
, поэтому вы открываете код этого класса и … там нет метода start
. П - паника. Конечно, через пару
часов вы увидите, что там Class Delegation, и метод просто
скрыт, и вы потеряете больше времени на понимание происходящего, чем если бы там был делегат здорового человека.
Используя делегаты в Koltin
вы обрекаете себя на более высокую стоимость разработки.