Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.
Roslyn скорее фича C#, чем минус Котлина :) Я точно так же могу сказать что дескать в C# нет property delegate или инфиксных функций.
Про генерацию я не очень понял пример, можно поподробнее?
Имхо, Kotlin намного свежее выглядит и пишется, чем C#. А про какие проблемы JVM (кроме проблемы с дженериками, которые частично решаются модификатором reified в Kotlin) идет речь?
Чем плоха реализация метода в интерфейсе? Хорошо помогает обратно совместимо расширить интерфейс. Да и нуллабельные типы — это же заплатка на Billion Dollar Mistake
Большинство языков сегодня имеют самые базовые возможности для реализации этой возможности: через карту, фильтр, сокращение для списков и т.п.
Аж передернуло от такого перевода. Пользуйтесь техническим словарём, термины в ФП взяты из математики. map, кроме того что это карта, еще переводится как «отображение», а reduce правильно перевести как «свёртка», но лучше на самом деле оставить эти три слова без перевода, ведь это устоявшиеся названия операций над списками
Каламбур: возмущаются, что Стив Джобс распиаренная рекламная личность, за которым не видно человека создавшего Си, но Си тоже распиаренный ЯП за которым не видно более безопасных и удобных в использовании для прикладного программирования языков
В ДГТУ студенческий кружок робототехники достаточно сильный, ребята выступали (и, наверное, выступают) на международных соревнованиях по робототехнике, а для этого еще надо отбор внутри страны пройти.
Ваш пример с буленовскими флажками под каждое свойство и нуллабл полем — признак нарушения single resposibility. Я бы использовал другую крутую возможность котлина — sealed class и сделал бы несколько вариантов картинок, которые используются конкретно в проекте. Бонусом будет использование конструкции when для обработки всех возможных вариантов изображений в проекте, проверяемое на этапе компиляции
Как раз-таки в играх намного лучше подходит Entity Framework подход, нежели создание иерархии. Выделяя отдельные способы поведения в отдельные компоненты и собирая из них новых юнитов, как из лего, мы можем отказаться от метода «всех под одну гребенку» и избавляемся от огромного God Blob предка, в котором половина методов используются только в половине наследников а в остальных — заглушки.
Посидел немного, помучался с особенностями reified generics в Kotlin, понял, что также чисто как на Scala не получится это провернуть (все таки Kotlin не сильно больше FP-friendly, чем Java). Однако есть работающий примерчик, компилятор проверяет все веточки, ругается, где положено, как и заявлено в ТЗ поста. Для этого понадобилось разбить все на отдельные методы под каждый тип состояний (мне кажется, в крупном приложении все равно бы все пришло к этому)
// Иерархия сообщений
sealed class Msg
sealed class MsgLogined : Msg()
object Logout : MsgLogined()
object Greet : MsgLogined()
sealed class MsgLogouted : Msg()
data class Login(val username: String) : MsgLogouted()
// Иерархия модели
sealed class Model<T:Msg>(val messageType: Class<T>)
data class LoggedIn(val username: String) :
Model<MsgLogined>(MsgLogined::class.java)
object Logouted : Model<MsgLogouted>(MsgLogouted::class.java)
// Функции обновления для каждого состояния
fun updateLoggedIn(model:LoggedIn, message: MsgLogined) =
when (message){
is Logout -> Logouted
is Greet -> LoggedIn(model.username)
}
fun updateLogouted(model: Logouted, message: MsgLogouted) =
when (message){
is Login -> LoggedIn(message.username)
}
// Агрегирующая функция обновления
fun <T:Msg> update(model: Model<*>, message: T): Model<*> =
when (model){
is LoggedIn -> updateLoggedIn(model, model.messageType.cast(message))
is Logouted -> updateLogouted(model, model.messageType.cast(message))
}
// Вьюхи
fun printLogin() : MsgLogouted {
println("Login:")
return Login(readLine()!!)
}
fun printGreeting(name: String) : MsgLogined {
println("Hello, $name")
return when (readLine()){
"" -> Logout
else -> Greet
}
}
fun view(model: Model<*>) =
when (model){
is LoggedIn -> printGreeting(model.username)
is Logouted -> printLogin()
}
// Наша аппа
tailrec fun app(model: Model<*>) : Model<*> =
app(update(model, view(model)))
fun main(args: Array<String>) {
app(Logouted)
}
Roslyn скорее фича C#, чем минус Котлина :) Я точно так же могу сказать что дескать в C# нет property delegate или инфиксных функций.
Про генерацию я не очень понял пример, можно поподробнее?
Советую взглянуть на Universe Sandbox
Автор — "Использование rxJava для вызова асинхронных методов — оверхед"
Тоже автор — "Тут я написал базовый класс для UseCase"
Аж передернуло от такого перевода. Пользуйтесь техническим словарём, термины в ФП взяты из математики.
map
, кроме того что это карта, еще переводится как «отображение», аreduce
правильно перевести как «свёртка», но лучше на самом деле оставить эти три слова без перевода, ведь это устоявшиеся названия операций над спискамиКаламбур: возмущаются, что Стив Джобс распиаренная рекламная личность, за которым не видно человека создавшего Си, но Си тоже распиаренный ЯП за которым не видно более безопасных и удобных в использовании для прикладного программирования языков
Когда забыл, что разработчики по умолчанию web- и попался на кликбейт...
Заценил архитектуру, весьма напоминает Riblets от убера. А что используете для Android?
Ваш пример с буленовскими флажками под каждое свойство и нуллабл полем — признак нарушения single resposibility. Я бы использовал другую крутую возможность котлина — sealed class и сделал бы несколько вариантов картинок, которые используются конкретно в проекте. Бонусом будет использование конструкции when для обработки всех возможных вариантов изображений в проекте, проверяемое на этапе компиляции
Посидел немного, помучался с особенностями reified generics в Kotlin, понял, что также чисто как на Scala не получится это провернуть (все таки Kotlin не сильно больше FP-friendly, чем Java). Однако есть работающий примерчик, компилятор проверяет все веточки, ругается, где положено, как и заявлено в ТЗ поста. Для этого понадобилось разбить все на отдельные методы под каждый тип состояний (мне кажется, в крупном приложении все равно бы все пришло к этому)
К чему было вводить behavioursubject? Ведь его можно было заменить еще одним scan
В этом списке как-то пустовато. Не хватает RxJava2, AutoValue, Gson/Jackson ну и опционально Moxy.
И все-таки, не хватает результата работы скрипта в конце
Потому что множественное наследование запрещено. А методы по умолчанию позволяют расширять legacy API не ломая старый код
Автору надо научиться выражать свои мысли...
Звучит как костыль...