Я разрабатываю игровой сайт, где многие (надеюсь тысячи) игроки будут одновременно играть в определенные карточные игры друг с другом. Колода представляет собой стандартную колоду для карточек. Каждая карта имеет костюм и звание. Карты будут перетасовываться, обрабатываться, выбираться, заказываться, воспроизводиться все время. Мой вопрос: должен ли Card
быть перечислением, структурой или классом?
-
Для перечисления: Пусть каждая карта является байтом 0..51. Таким образом, карта займет очень мало места. Вы можете представить руку как бит-набор из 8 байтов. Вы можете рассчитать костюм и ранг данной карты очень быстро, когда возникнет такая необходимость: т.е. Костюм (n) = n/13. Это будет очень эффективно. Если вам нужно написать методы для Карт, напишите их с помощью методов расширения.
-
Для структуры: Нет, это похоже на машинный код. Карта - простая структура, содержит очень мало данных, неизменна, мала. Он не имеет большого поведения, поэтому делает его структурой и рассматривает его как пассивную структуру данных. Вы можете рассчитать индекс в 0..51 с данной карты очень быстро, когда возникнет такая необходимость.
-
Для класса: Нет, это не объектно-ориентированный образ мышления. Сделайте класс карты. Сделайте его неизменным. Создайте ровно 52 экземпляра. Пусть пул карт удерживает эти экземпляры. Поэтому, когда вам нужна "Пиковая дама", она попросит у нее пул карт. Там будет одна и только одна Пиковая дама, даже когда будут тысячи игр. Сохраните поле индекса 0..51 в Карте, если хотите.
Я склоняюсь к последнему варианту (классу), но я не уверен. Я не очень беспокоюсь о производительности; Я, возможно, сделаю более серьезные ошибки на этом пути. Меня беспокоит то, что моя точка зрения может быть неправильной; может быть, это очень легкое решение, и я стесняюсь, потому что мне не хватает знаний о кусках, которыми обладают все остальные.
Как вы думаете?
Изменить: о поведении карт. Я думаю, что карта будет знать только о других карточках. Например, он может определить частичный порядок "кто бьет кого в Мост". Ему не нужно ничего знать о колоде. И это будет код на стороне сервера; конечно, не нужно знать, чтобы нарисовать себя на экране и т.д.