Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

Похоже, вы находитесь на границе между тем, для чего подходят 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).Он описывает объектно-ориентированные средства решения именно тех проблем проектирования, о которых вы спрашиваете, и все это в контексте, основанном на тестировании.Это одна из тех книг, которые должен прочитать каждый человек этой профессии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top