Разработка покерного парсера на 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 и был более тестируемым?
Решение
Государственная машина, кто-нибудь?
В любой момент разыгрывания покерной комбинации существует четко определенный набор возможных следующих действий.Я бы подумал, что вы могли бы инкапсулировать их в государственная машина.Есть несколько вариантов, среди которых (боюсь, никаких рекомендаций - недостаточно опыта работы с любым из них) являются
- Альтер Эго (обновлено в июле этого года)
- ruby-конечный автомат (кажется, тоже живой)
- государственная машина (выглядит немного несвежим)
Другие советы
Использование Верхушка дерева
Похоже, вы находитесь на границе между тем, для чего подходят ad hoc string matching и RE, и для чего требуется реальный синтаксический анализатор.
В рукописных анализаторах нет ничего плохого, и до тех пор, пока вы сохраняете свои методы короткими, без большой сложности в каком-либо конкретном из них, нормально иметь как можно больше if
операторы в полном объеме, как того требует анализатор.
Я не уверен, что 10 строк с непонятными регулярными выражениями хоть сколько-нибудь лучше, чем 30 строк симпатичного кода.
Теперь у Ruby действительно есть продвинутый генератор синтаксического анализа PEG.Я думаю, что в этом случае я бы не стал беспокоиться о том, было ли это излишеством, я бы просто идите вперед и используйте Treetop.
Вы можете оформить это анализатор раздач в покерной игре с открытым исходным кодом
Похоже, что они создали хэш регулярных выражений, а затем, вероятно, перебирают структуры данных регулярных выражений.Это более простая машина, чем синтаксический анализатор, и, вероятно, более легкий подход.
Я написал анализатор истории раздач для лог-файлов PokerStars https://github.com/malikbakt/pokerstars
Возможно, вы захотите взглянуть на: Строковый сканер.
У меня есть для вас два разных указателя, которые укажут вам на решение, о том, как писать код способом ruby.
- Купи рубиновую книгу.В книге ruby будет много примеров того, как писать код на ruby way.Исходя из моего личного опыта, я могу порекомендовать вам книгу pixake (правильно ли это пишется?): http://www.ruby-doc.org/docs/ProgrammingRuby/html/index.html
- Прочитайте существующий код ruby.Вы, кажется, достаточно знаете ruby, чтобы писать код?Тогда вы, безусловно, сможете прочитать существующий код.Я предполагаю, что вы уже установили ruby в своей системе.Если это так, вы найдете много исходного кода на вашем жестком диске.Если нет, просто воспользуйтесь интернетом.
Я бы порекомендовал эту книгу Рефакторинг автор: Мартин Фаулер (доступно как в формате dead tree, так и в электронном формате, IIRC).Он описывает объектно-ориентированные средства решения именно тех проблем проектирования, о которых вы спрашиваете, и все это в контексте, основанном на тестировании.Это одна из тех книг, которые должен прочитать каждый человек этой профессии.