Сомнения по поводу разработки карточной игры в DDD

Сомнения по поводу разработки карточной игры в DDD
Сомнения по поводу разработки карточной игры в DDD - mattartz @ Unsplash

Я думал, как разработать простую карточную игру, типа покера, в DDD, но я не уверен в некоторых моментах.

В основном я хочу получить следующее, но я постараюсь упростить проблемы, которые у меня есть.

  • У меня есть матч, в который я могу добавлять игроков.
  • Матч играется в 10 раундов.
  • Каждый игрок играет в раунде в свой ход (для упрощения, один ход в раунде). В этот ход он может запросить карту, сбросить карту, сделать ставку и так далее.
  • На матче присутствует арбитр, который тасует карты, говорит, когда игрок начинает свой ход и заканчивает его, отдает карты игроку... и т.д.
  • В каждом раунде я хочу знать время, которое игрок тратит на свой ход. А также я хочу знать общее время раунда в матче.

Я представлю модель, которую я думаю, и позже расскажу о своих сомнениях.

Соответствие класса:

    Class Match
    {
        long Id;
        DateTime Date;
        string Description;
        List<Player> Players;
        List<Round> Rounds;


        public void Start() {}
        public void Finish() {}
        .....
    }

Class Player()
{
    long Id;
    string Name;
    List<Round> Round;


    public void StartTurn() {}
    public void FinishTurn() {}
    public void Bet() {}
    public void RequestCard() {}
    public void ThrowCard() {}
    public void Bet() {}
    .....
}

Class Round
{
    long Id;
    long TimeInSeconds;


    public StartCountingTime() {}
    public StopCountingTime() {}
}


class Arbitrator()
{
    public void shuffle() {}
    public void AsignTurnToPlayer() {}
    public void GiveCardToPlayer() {}
    public void StartGame() {}
    public void FinishGame() {}
    ....
}

Я думаю, что это решение, потому что таким образом, когда игрок получает ход, он может вызвать метод StartCountingTime() в сущности Round и вызвать StopCountingTime(), когда он закончит свой ход. Это просто, но я не уверен, что игрок должен нести ответственность за подсчет времени, игрок должен только играть.

Затем я подумал, что поскольку Арбитр решает, когда игрок начинает и останавливает свой ход, он мог бы управлять временем в раундах. Но в этом случае, где я должен объявить объекты Round для игроков? И еще раз подумав, является ли сущность Арбитр ответственной за контроль времени или только за то, чтобы заставить игроков следовать правилам и координировать матч?

Моя основная проблема заключается в контроле времени, проведенного в раундах. Как это сделать, где объявить объекты раунда и связать их с матчем и игроками.

И второе сомнение связано с сущностью Match, действительно в моем коде я объявляю два метода для начала и остановки игры, но это, возможно, больше ответственность арбитра, чем игры, но если сущность Match не имеет методов, это был бы анемичный объект, но на самом деле мне нужен этот объект, чтобы хранить Id, описание и знать игроков, которые играют в матче.

Итак, резюмируя, мой главный вопрос заключается в том, кто несет ответственность за контроль времени в раундах. И второй вопрос - можно ли рассматривать сущность "Матч" как анемичную сущность или это правильно.

Я думаю, что вы выбрали плохой пример для DDD.

Очевидно, что вы не вдавались во все детали, но похоже, что у вас есть только один Домен, одна заинтересованная сторона, приложение с одним потоком в памяти, хорошо понятные правила и т.д.

Ваше приложение может быть разработано одним человеком на листке бумаги, написано в стиле ООП или императивном стиле, закончено, не содержит ошибок и никогда не нуждается в обновлениях.

DDD пытается решить проблемы, которые возникают, когда у вас есть несколько заинтересованных сторон, несколько приложений, плохо понятые правила, люди говорят об одном и том же, но называют это по-разному, люди говорят о разных вещах, но называют это одним и тем же. и т.д. и т.п.

Если вы хотите рассмотреть аспекты DDD, напишите свое приложение так, как вам нравится, а затем добавьте следующие требования

  • Маркетинг: когда игрок не делал ставок в течение 30 дней, я хочу отправить ему электронное письмо.
  • Счета : не позволяйте игроку делать ставки больше, чем его кредитный лимит
  • Регулирование : игроки из США могут делать ставки только на те игры, сервер которых находится в Лас-Вегасе.

Теперь вам нужно подумать обо всех остальных системах, которые работают с игрой, и о том, как вы собираетесь заставить их объединиться и выполнить эти требования, которые не имеют ничего общего друг с другом или с реальной игрой.

Пока вы этим занимаетесь, представьте, что вы получаете постоянный поток запросов такого стиля от всевозможных отделов.


LetsCodeIt, 7 февраля 2023 г., 14:24