diff --git a/src/_content/blog/reasonable-game-of-life_ru.md b/src/_content/blog/reasonable-game-of-life_ru.md new file mode 100644 index 00000000..67a3e3a3 --- /dev/null +++ b/src/_content/blog/reasonable-game-of-life_ru.md @@ -0,0 +1,47 @@ +--- +slug: reasonable-game-of-life +lang: ru +title: Reasonable Game of Life +date: 2019-11-16T15:50:37.570Z +thumbnail: + author: Neo + img: /images/uploads/matrix.jpg + src: Cha +tags: + - reasonml + - gameoflife +preface: Не знаю должно ли тут что-то быть... +--- +Эта вторая статья из цикла статей про разработку на reason: + +1. [Первое знакомство с ReasonML](/ru/blog/first-hands-on-experience-with-reasonml/) +2. Текущая статья + +> Настоятельно рекомендую ознакомиться с предыдущей, т.к. в ней можно познакомиться с некоторыми фичами языка, которые будут использоваться тут и в последующий статьях. + +В предыдущей статье мы сделали не так много с точки зрения разработки игры. В этой я постараюсь всё исправить, мы реализуем основной алгоритм игры! + +## Неизменяемая эволюция + +Основная задача игры это эволюция - переход вселенной из поколения в поколение. Согласно [вики](https://ru.wikipedia.org/wiki/%D0%98%D0%B3%D1%80%D0%B0_%C2%AB%D0%96%D0%B8%D0%B7%D0%BD%D1%8C%C2%BB) каждое следующее поколение рассчитывается на основе предыдущего. Для нас это означает, что нам понадобится функция которая будет преобразовывать нашу двумерную матрицу. + +Под преобразованием я подразумеваю создание новой матрицы на основе предыдущей. Появление в мире фронтенд разработки таких инструментов как react и redux, давно сделало неизменяемость (immutability) не пустым звуком. И для многих не будет откровением, что он пришёл к нам из функционального программирования. И если коротко то согласно ему, мы не должны изменять/мутировать/преобразовывать данные, а создавать новые копии содержащие нужные правки. + +Делается это не для того, чтобы программы тратили больше времени на копирование структур данных, их хранение или исполнение сборщика мусора. Этот подход даёт нам ряд преимуществ которые перекрывают его недостатки: + +### Новая парадигма + +Он упрощает модель программирования или позволяет писать код в другой парадигме. Звучит максимально абстрактно, но есть очень хороший пример: приход _angular_ и _react_ на замену _jQuery_ (для меня это был именно такой переход). + +Я помню как 6 лет назад я участвовал в разработке банкинг платформы на jQuery: наш код содержал очень большое количество мутаций: мы добавляли и удаляли css классы и свойства, DOM элементы; инстанциировали и деструктуризировали виджеты. И конечно же этот подход был очень сильно подвержен ошибкам: легко было забыть что-то изменить/удалить, разные "компоненты " могли одновременно менять одни и те же части DOM'а - о консистентности можно было только мечтать. + + + +\* редьюсеры для оптимизации реакта + +\* многопоточный реакт + + по следующим правилам: + +* в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь; +* если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае, если соседей меньше двух или больше трёх, клетка умирает («от одиночества» или «от перенаселённости»)