Разработка покерного парсера в Ruby - PullRequest
2 голосов
/ 08 октября 2009

Я пишу небольшую программу на 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 и более тестируемых?

Ответы [ 7 ]

2 голосов
/ 08 октября 2009

Использование Верх дерева

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

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

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

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

1 голос
/ 19 марта 2012

Я написал анализатор истории рук для файлов журнала PokerStars https://github.com/malikbakt/pokerstars

1 голос
/ 08 октября 2009

State Machine, кто-нибудь?

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

1 голос
/ 08 октября 2009

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

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

0 голосов
/ 28 октября 2009

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

0 голосов
/ 09 октября 2009

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

  • Получить рубиновую книгу. В книге ruby ​​будет много примеров того, как писать код в стиле ruby. Исходя из моего личного опыта, я могу порекомендовать вам книгу pixake (правильно написано?)
  • Прочитать существующий код рубина. Вы, кажется, знаете достаточно ruby, чтобы написать код? Тогда вы наверняка сможете прочитать существующий код. Я предполагаю, что вы уже установили ruby ​​в вашей системе. Если это так, вы найдете много исходного кода на жестком диске. Если не просто использовать Интернет.
0 голосов
/ 08 октября 2009

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

...