Про домино и программизм

Недавно играл в домино с компьютером. Играл самым простым образом, не думая, выставляя любую фишку, которая подходит (назовем такую стратегию стратегией глупого игрока). Компьютер меня обыграл три раза подряд, поэтому я задумался. Мысли особой глубиной не отличались, поэтому спрячу их под кат.

И стал ходить так, чтобы после моего хода торчал кусок, которого у меня нет. Думалось, что хотя таким образом я и подыгрываю компьютеру (скорее всего у него есть такая фишка), но ведь после его хода, может быть, эта фишка сменится такой, которая у меня есть (назовем такую стратегию стратегией доброго игрока). Компьютер снова меня выиграл. Тогда я стал наоборот делать ходы, чтобы на поле были фишки, которых много у меня или на поле. То есть затруднял ход противнику (назовем эту стратегию стратегией жадного игрока).

Тут я бросил играть в домино, и стал думать, какая из этих стратегий является более предпочтительной и насколько именно. Обычно такие размышления заканчиваются расчетами на листочке либо написанием программки. Расчеты делать было трудно, а программу писать интересно. Поэтому я написал программу, которая играет три разных стратегии в одной игре. В результате получилось, что глупый игрок выигрывает в 29.4% случаев, добрый — в 23.9%, а жадный — в 37.8%.

Из всего этого два вывода: 1) жадным быть выгодно; 2) даже, если играть совсем по-простому, выигрываешь довольно часто (понятно, почему детские домино пользуются популярностью). Но в процессе я сделал еще один вывод, который будет интересен в основном программистам.

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

Потом, уже в ВУЗе аналогично осваивал объектно-ориентированный подход, выделяя классы, организуя их в иерархию, настраивая области видимости. Это уже у меня пошло гораздо сложнее. Жонглировать классами сложнее, чем процедурами.

Ну так вот выяснилось, что при написании этой простой тестовой программы у меня код “сам собой” расползся по семи отдельным классам, самый большой из которых занимал 6 килобайт (но имел только два метода). Как-то и модификаторы области видимости расставились, и код закоментировался, и иерархия классов выстроилась. Буду тешить себя мыслью, что зачатками ООП овладел. Теперь надо двигаться к паттернам проектирования. :)

Comments

  • kukina_kat 2009-02-05T16:50:05Z

    Я это самое ООП сильно уважаю. Мне кажется, это какая-то математическая идея: везде выделить классы, их развить отдельно, написать методов кучу, что с этими классами можно делать, и даже если потом половина методов не используется, то все равно как-то правильно, что они есть :)
    • bukov_ka 2009-02-06T04:35:18Z

      В программизме вообще везде эти самые математические идеи. Так что общение с тобой мне сильно помогает в профессиональном плане. :)
  • [deleted] 2009-02-05T20:31:52Z

    • kukina_kat 2009-02-06T00:43:52Z

      Ольга! Не позорься! Адиабатное чего-то там -- это из физики\термодинамики. Процесс без выделения или поглощения тепла. (Помнишь, там еще есть изотермическое, изохорное и изобарное чего-то там?)

      А ООП и процедуры это все-таки из программизма. А в программизме ты типа специалист, по крайней мере, у тебя так в дипломе написано.

    • bukov_ka 2009-02-06T05:02:30Z

      Раз забыла – значит тебе это и не надо вовсе. :) Надо будет, так почитаешь книжки умные и вспомнишь.