Многоплатформенная игра «Быки и Коровы» с единой бизнес-логикой, которая может быть использована в различных интерфейсах: CLI, Flutter (iOS/Android/Web), Telegram MiniApp.
Основные принципы:
- Чистая архитектура (Clean Architecture / Hexagonal / Ports & Adapters)
- Логика игры полностью отделена от интерфейсов и инфраструктуры
- Поддержка многоплатформенных интерфейсов через отдельные пакеты
- Подключаемая, легко тестируемая бизнес-логика
Структура монорепозитория:
-
/bulls_and_cows_workspace
-
/packages
-
/core_domain # Entities, правила игры, контракты
-
/game_engine # Сервисы, UseCases, состояние игры
-
/app_services # Адаптеры (генератор чисел, хранение, логирование)
-
/ui_cli # CLI интерфейс
-
/ui_flutter_app # Flutter мобильный и web интерфейс
-
/ui_web # (если отдельная веб-реализация)
-
/ui_telegram_miniapp # Telegram MiniApp
- Чистая доменная модель (Pure Dart)
- Entities: Game, Guess, Result
- Value Objects
- Правила игры (Bulls/Cows Calculator)
- Контракты для генераторов чисел, репозиториев
- Не содержит зависимостей на UI, Flutter, IO
- Pure Dart пакет
- Сервисы и UseCases:
startGame(),makeGuess(),getHistory(),isFinished() - Управление состоянием игры (
GameState,GameStatus,GuessHistory) - Реализует API для UI через dependency inversion (работает через интерфейсы из core_domain)
- Реализации контрактов для генерации чисел, хранения состояния, логирования
- Платформозависимые адаптеры
- Может использоваться всеми UI пакетами
- Отдельные пакеты для каждого интерфейса
- Зависят только от
game_engineиapp_services - Содержат:
- UI и навигацию
- State Management (Bloc, Riverpod или аналог)
- Взаимодействие с пользователем (CLI, Flutter, Telegram API)
- Не содержат бизнес-логики
- Через dependency inversion:
abstract class NumberGenerator {
String generate();
}
// Engine API (пример):
class BullsCowsEngine {
GameSession start(GameConfig config);
GuessResult guess(String value);
GameState state;
}- Технологии
- Dart / Flutter
- Monorepo package management: melos
- State management: Bloc / Riverpod
- Тестирование: unit-тесты на core_domain и game_engine
- CI/CD: сборка всех UI пакетов и проверка логики
- Ограничения и рекомендации
- Не включать Flutter в domain и engine
- Логика игры не должна зависеть от UI
- Хранение состояния и генерация чисел через адаптеры
- Engine должен быть полностью тестируемым и reusable