Теперь делаем в функциональной парадигме, и с акцентом на software design.
Весь исходный код C# приложен.
Цель и там и там одна: сколь бы ни был велик объём проекта (десятки тысяч сущностей -- классов, типов), мы сохраняем сложность его роста линейной, когда добавление новой фичи потребует O(С) (С - константа) усилий, независимо от количества "штук" (классов, функций, файлов) в проекте.
Демонстрирую полный процесс разработки с нуля, комментируя на каждом шаге, какой функциональный или архитектурный паттерн (или антипаттерн) применяю, и почему.
Примерный силлабус:
Базовая онтология
Синглетоны
Элемент на игровой доске
Игровое поле
GameEngine.cs :)
Минимально оживляем проект.
Очевидный(?) момент при функциональной декомпозиции
Чистая игровая логика
Когда функциональный стиль особенно хорош
Логика следует из правильных структур данных
Нашему алгоритму внутренняя семантика данных без разницы
Правильный стиль функционального кодинга
Эталонный пример
Отладка
Конвейер как функция
Стоит ли добавлять новый паттерн (например, Free Monad), или же можно обойтись локальным решением?
Ключевая задача проектирования: какой паттерн выбрать и, главное, как?
Легко и просто используем AI для чистых функций
Переписываем основной алгоритм в конвейерном стиле
Куда более сильная абстракция
Рекурсивный тип: не функциональный хак, а фундаментальный принцип структурного проектирования
+ 8 заданий с разбором.
