Проектирование покерного парсера на Ruby

Я пишу небольшую программу на Ruby для разбора журнала истории раздач с покерного сайта. Журнал разбит на несколько строк и выглядит примерно так:

Table 123456 NL Hold'em $1/$2
5 Players
Seat 3 is the button
Seat 1: randomGuy112 $152.56
Seat 2: randomGirl99 $200
Seat 3: PokerPro $357.12
Seat 4: FishCake556 $57.19
Seat 6: MooMoo $188.98
Dealt to MooMoo [Ah, Ks]
randomGuy112 folds
randomGirl99 raises to $7

etc.. etc..

Я хочу обобщить эту информацию в объекте, который затем может, например, отображать ее по-другому или сохранять в базе данных. Когда я изначально думал об этой проблеме, я думал, что у меня будет только один реально прямой класс с несколькими регулярными выражениями и несколькими операторами if/else. Затем я понял, что это может превратиться в довольно большой метод и потенциально стать кошмаром для отладки/поддержки. Имейте в виду, что он должен зацикливаться на каждом этапе игры (префлоп, флоп и т. д.), чтобы собирать информацию о действиях игрока.

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

Я новичок в Ruby и еще не нажимал «Ruby way», чтобы что-то делать. Я ловлю себя на том, что пишу код C# на другом языке.

Можете ли вы дать мне несколько советов о том, как спроектировать синтаксический анализатор, чтобы он не был одним огромным беспорядком операторов if/else и более проверяемым?


person Kirschstein    schedule 08.10.2009    source источник


Ответы (7)


Государственная машина, кто-нибудь?

В любой момент розыгрыша покерной руки существует четко определенный набор возможных следующих действий. Я думаю, вы могли бы инкапсулировать их в конечный автомат. Есть несколько вокруг, среди которых (без рекомендаций, я боюсь - недостаточно опыта)

person Mike Woodhouse    schedule 08.10.2009
comment
Выполняя задание несколько месяцев назад, я обнаружил, что конечный автомат для покера очень прост. Здесь, кажется, есть только техасский холдем, что делает его еще более легким. - person NomeN; 09.10.2009

Используйте Treetop

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

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

Я не уверен, что 10 строк с непонятными регулярными выражениями лучше, чем 30 строк красивого кода.

Теперь в Ruby есть усовершенствованный генератор синтаксического анализа PEG. Я думаю, что в этом случае я бы не беспокоился о том, будет ли это излишним, я бы просто использовал Treetop.

person DigitalRoss    schedule 08.10.2009

Вы можете проверить это парсер покерных игр с открытым исходным кодом

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

person jrhicks    schedule 08.10.2009

Я написал парсер истории раздач для лог-файлов PokerStars https://github.com/malikbakt/pokerstars.

person malik    schedule 18.03.2012

Вы можете посмотреть: StringScanner.

person rkj    schedule 08.10.2009

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

  • Получите рубиновую книгу. В книге Ruby будет много примеров того, как писать код на Ruby. Исходя из своего личного опыта, я могу порекомендовать вам книгу pixake (это правильно написано?): http://www.ruby-doc.org/docs/ProgrammingRuby/html/index.html
  • Прочитайте существующий код ruby. Кажется, ты достаточно знаешь руби, чтобы писать код? Тогда вы наверняка сможете читать существующий код. Я предполагаю, что вы уже установили ruby ​​в своей системе. Если это так, вы найдете много исходного кода на своем жестком диске. Если не просто пользоваться интернетом.
person johannes    schedule 08.10.2009

Я бы порекомендовал книгу Мартина Фаулера Refactoring (доступна как в мертвом дереве, так и в электронном формате, IIRC). Он описывает объектно-ориентированные средства для решения именно тех проблем проектирования, о которых вы спрашиваете, и все это в контексте тестирования. Это одна из тех книг, которые должен прочитать каждый профессионал.

person bradheintz    schedule 28.10.2009