Как стать автором
Обновить
2
Карма
0
Рейтинг

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

Composable Architecture — свежий взгляд на архитектуру приложения

Это же The Elm Architecture (Model View Update), к чему придумывать новые имена старым подходам?

Меняю свой стек с понедельника

Не вижу ни одного комментария про F#. Годный лаконичный язык, хорошие фреймворки как раз для небольших проектов, статическая типизация с выводом типов. И при этом стек и знания остаются при тебе, а не сливаются в трубу

MotionLayout: анимации лучше, кода — меньше

Лучше бы этот материал на Kotlin перевели чем xml насиловать

«Яндекс.Телефон» не пользуется спросом

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

Стартапы на CES 2019: часть первая

Их час еще определенно не пришел: гики разочарованы, а таксисты вздыхают с облегчением.
Это странное ощущение, когда есть эпичные презентации и красочные стенды, а продукта нет.

Ну почему же, Яндекс вон катал блоггеров по Вегасу на своих автопилотируемых авто

Я растерял веру в разработку, выгорел, но меня спас культ инструмента

Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.
Roslyn скорее фича C#, чем минус Котлина :) Я точно так же могу сказать что дескать в C# нет property delegate или инфиксных функций.
Про генерацию я не очень понял пример, можно поподробнее?

Я растерял веру в разработку, выгорел, но меня спас культ инструмента

Имхо, Kotlin намного свежее выглядит и пишется, чем C#. А про какие проблемы JVM (кроме проблемы с дженериками, которые частично решаются модификатором reified в Kotlin) идет речь?

IntelliCode теперь и в TypeScript/JavaScript

Чем плоха реализация метода в интерфейсе? Хорошо помогает обратно совместимо расширить интерфейс. Да и нуллабельные типы — это же заплатка на Billion Dollar Mistake

Как я делал анимации Солнечной системы для сына-второклассника

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

Как я заменил RxJava на корутины в своем проекте и почему вам вероятно также стоит это сделать

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

Выбор языка программирования: 3 совета от программиста из Apple

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

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

Незамеченное IT

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

Почта России начнет использовать роботов-сортировщиков. Как это будет работать

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

Новинки для дизайнеров и разработчиков: свежие утилиты, плагины и инструменты. Выпуск 6-й

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

Что лучше – 1 команда мобильной разработки или 15?

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

Защищенность переменных в Kotlin на примере Java

Ваш пример с буленовскими флажками под каждое свойство и нуллабл полем — признак нарушения single resposibility. Я бы использовал другую крутую возможность котлина — sealed class и сделал бы несколько вариантов картинок, которые используются конкретно в проекте. Бонусом будет использование конструкции when для обработки всех возможных вариантов изображений в проекте, проверяемое на этапе компиляции

Почему мне кажется, что студентов учат ООП неправильно

Как раз-таки в играх намного лучше подходит Entity Framework подход, нежели создание иерархии. Выделяя отдельные способы поведения в отдельные компоненты и собирая из них новых юнитов, как из лего, мы можем отказаться от метода «всех под одну гребенку» и избавляемся от огромного God Blob предка, в котором половина методов используются только в половине наследников а в остальных — заглушки.

Паттерн Model-Update-View и зависимые типы

Посидел немного, помучался с особенностями 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)
}

Паттерн Model-Update-View и зависимые типы

Спасибо за качественный пятничный ФП, давненько искал понятный материал по уменьшению бойлерплейта в MVI паттерне (или, как вы тут его назвали MUV)

Укрощение Змейки с помощью реактивных потоков

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

1

Информация

В рейтинге
5,891-й
Зарегистрирован
Активность