Как стать автором
Обновить
17
0
Миша @Mishkun

Пользователь

Отправить сообщение
Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.
Roslyn скорее фича C#, чем минус Котлина :) Я точно так же могу сказать что дескать в C# нет property delegate или инфиксных функций.
Про генерацию я не очень понял пример, можно поподробнее?
Имхо, Kotlin намного свежее выглядит и пишется, чем C#. А про какие проблемы JVM (кроме проблемы с дженериками, которые частично решаются модификатором reified в Kotlin) идет речь?
Чем плоха реализация метода в интерфейсе? Хорошо помогает обратно совместимо расширить интерфейс. Да и нуллабельные типы — это же заплатка на Billion Dollar Mistake

Советую взглянуть на Universe Sandbox

Автор — "Использование rxJava для вызова асинхронных методов — оверхед"
Тоже автор — "Тут я написал базовый класс для UseCase"

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

Аж передернуло от такого перевода. Пользуйтесь техническим словарём, термины в ФП взяты из математики. map, кроме того что это карта, еще переводится как «отображение», а reduce правильно перевести как «свёртка», но лучше на самом деле оставить эти три слова без перевода, ведь это устоявшиеся названия операций над списками

Каламбур: возмущаются, что Стив Джобс распиаренная рекламная личность, за которым не видно человека создавшего Си, но Си тоже распиаренный ЯП за которым не видно более безопасных и удобных в использовании для прикладного программирования языков

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

Когда забыл, что разработчики по умолчанию web- и попался на кликбейт...

Заценил архитектуру, весьма напоминает Riblets от убера. А что используете для Android?

Ваш пример с буленовскими флажками под каждое свойство и нуллабл полем — признак нарушения 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)
}
Спасибо за качественный пятничный ФП, давненько искал понятный материал по уменьшению бойлерплейта в MVI паттерне (или, как вы тут его назвали MUV)

К чему было вводить behavioursubject? Ведь его можно было заменить еще одним scan

В этом списке как-то пустовато. Не хватает RxJava2, AutoValue, Gson/Jackson ну и опционально Moxy.

И все-таки, не хватает результата работы скрипта в конце

Потому что множественное наследование запрещено. А методы по умолчанию позволяют расширять legacy API не ломая старый код

Автору надо научиться выражать свои мысли...

Звучит как костыль...

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность