Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions src/_content/blog/reasonable-game-of-life_ru.md
Original file line number Diff line number Diff line change
@@ -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'а - о консистентности можно было только мечтать.



\* редьюсеры для оптимизации реакта

\* многопоточный реакт

по следующим правилам:

* в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь;
* если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае, если соседей меньше двух или больше трёх, клетка умирает («от одиночества» или «от перенаселённости»)