Игра в игровой автомат The Money Game (Баксы) онлайн для тех, кого манит мир финансового благополучия. Игра Money Game: Обзор и правила. Все названия: Деньги, Денежная игра. Игровые автоматы карусели бесплатно (Roller Coaster) предлагают лично в этом. Выберите ли вы бесплатный демонстрационный режим или деньги, . Эти вторые имена в некоторых игровых клубах настолько приелись что заменили основные названия игровых автоматов. Рассмотрим рейтинг .
Названия игровых автоматов каждый производитель выбирает согласно своим критериям. Названия игровых автоматов могут сразу подсказать игроку, насколько интересен для него данный слот, однако игра в современных онлайн казино дает возможность попробовать. Некоторые игровые автоматы стали настолько популярными что у них появились альтернативные народные названия. Эти вторые имена в некоторых игровых клубах настолько приелись что заменили основные названия игровых автоматов. Убить всех человеков с помощью кота, или конечные автоматы на Akka. FSM / Хабрахабр Как я уже писал в своей первой статье, не так давно я перешел c С++ на Scala. И вместе с этим я начал изучать модель акторов в исполнении Akka. Наиболее яркое впечатление на меня произвела лекгость реализации и тестирования конечных автоматов (finite- state machines, FSM), которую предоставляет эта библиотека. Уж не знаю, почему именно так получилось, учитывая изобилие остальных прекрасных и полезных вещей в Akka. Но теперь в моем первом проекте на Scala я использую конечные автоматы при каждой выпадающей возможности, подкрепленной целесообразностью (как я искренне надеюсь). И вот я решил, что готов поделиться с сообществом теми знаниями об Akka. FSM, а также некоторыми хитростями и личными наработками, которые я успел накопить. Подобной темы на хабре я не нашел (да и вообще со статьями про Scala и Akka здесь как- то не густо), и решил, не затягивая, исправить положение и выговориться, пока кто- то не сказал всего раньше меня. А чтобы было не скучно — предлагаю вместе реализовать поведение самого настоящего электронного кота. Хотелось бы верить, что какая- то одинокая романтическая душа, вдохновившись моей статьей, доработает предлагаемый в ней функционал до полноценного «Тамакотчи», в качестве домашнего задания. Главное, чтобы такая душа не забыла после поделиться своими результатами с сообществом в комментариях. В идеальном варианте можно было бы создать проект на гитхабе с общим доступом, чтобы каждый желающий смог привнести свой личный вклад в развитие идей трансгуманизма. А теперь — в сторону шутки и фантазии, закатываем рукава. Начинать мы будем с самого нуля, а я для пущего 7. D и эффекта присутствия я буду проделывать каждый шаг вместе с вами. TDD прилагается: с неоттестированным робокотом уж точно будет не до шуток. Информация в статье предназначена для тех, кто уже хотя бы немного заком со Scala, и имеет хотя бы поверхностное представление о модели акторов. Для тех же, кто хотел бы познакомиться, но не знает, с чего начать, в качестве бонуса я написал небольшую стартовую инструкцию и скрыл ее под спойлер, чтоб остальным не мешала. В ней говорится о том, как без лишних усилий создать чистый проект на Scala со всеми нужными библиотеками. Итак, как вы уже поняли, для начала нам понадобится чистый проект со свежими версиями библиотек akka- actor, akka- testkit и scalatest (на момент написания статьи это akka 2. Ээээ.. А че это за фигня ваще?'', или для тех, кто не в теме. Предупреждение . Но для самых упертых (одобряю, сам такой) я объясню, как именно можно без лишних трудностей создать новый проект на Scala с использованием модной и блестящей такой плюшки Typesafe Activator. Предупреждение . Действия, необходимые для Windows, подобны описанным, но отличаются от них (как минимум, отсутствием тильды перед названием каталога Projects, обратным наклоном слеша, словом «папка» вместо слов «каталог» или «директория», и присутствием в архиве специального файла activator. Windows). Создаем проект. Итак, поехали. Самый простой лично для меня способ создать новый проект — скачать упомянутый typesafe activator с официального сайта. Заявленные на сайте версии библиотек на момент написания статьи: Activator 1. Akka 2. 3. 4, Scala 2. Скачивается все в виде ZIP- архива. Пока оно скачивается — нам необходимо предварительно разогреть духовку до 2. Цельсия. А пока вы думаете: «Зачем нам духовка? Распаковываем все это добро куда- нибудь на диск. Я проделаю все манипуляции в каталоге ~/Projects. Итак: $ mkdir ~/Projects. Projects. $ unzip ~/Downloads/typesafe- activator- 1. После того, как архив распаковался, не забудьте смазать сковороду маслом. Все, обещаю, дальше все будет предельно серьезно. Теперь у нас есть два способа создания проекта: через графический интерфейс и через командную строку. Как тру- джедаи мы, конечно же, выбираем путь силы (тем более, терминал уже открыт — не закрывать же его из- за какого- то там UI): $ activator- 1. Этой незамысловатой строкой мы говорим активатору создать (new) проект kote в текущей папке (а мы, как помним, остались в ~/Projects), из темплейта под названием hello- akka. Этот темплейт уже включает настроенный под нужные библиотеки файл build. Возможности темной стороны, как всегда, более легки и заманчивы, так что если у кото- то не получается в командной строке — можно набрать ./activator ui (или просто ui, если вы уже в консоли активатора), и проделать все в открывшемся браузере. Там все очень красиво, загляните хотя бы просто ради интереса — обещаю, вам понравится. После того, как проект создан — переходим в его каталог: $ cd kote. Дальше каждый джедай сам для себя решает, в чем его сила: использовать ed, vi, vim, emacs, Sublime, Text. Mate, Atom, что- то- там- еще, или полноценную IDE. Лично я, с переходом на Scala, начал пользоваться Intelli. J IDEA, поэтому я сразу сгенерирую файлы проекта для этой среды. Чтобы все получилось — нужно добавить строку add. Sbt. Plugin(? На этот случай можно остаться в командной строке активатора, а файлы редактировать любым удобным способом. И тогда всего две команды активатора решат всю дальнейшую судьбу нашего кота: compile — компиляция проекта. Вызовет compile при необходимости, так что я соврал, обойтись можно одной только этой командой. Поэтому мы начнем с подготовки чистого и аккуратного жилища для нашего будущего питомца. То есть, поудаляем все лишние файлы, которые идут в комплекте с вновь созданным проектом в рамках темплейта hello- akka. Лишними лично я считаю ненужные нам каталоги src/main/java, src/test/java со всем содержимым, а также все . Hello. Akka. Scala. Hello. Akka. Spec. Ну вот, теперь мы готовы приступать. Первый шаг. В начале был тест. Именно это утверждение, как известно, является основополагающим постулатом TDD, коего приверженцем я являюсь в данный момент. Поэтому свое описание я начну не с самого автомата, а с создания первого теста для него, чтобы продемонтсрировать возможности тестирования, предоставляемые библиотекой Akka Test. Kit. В комплекте с активатором, которым я пользуюсь, уже имеется фреймворк для тестирования — scalatest. Меня он вполне устраивает, и я не вижу причин не воспользоваться им в нашем проекте. А вообще, Akka Test. Kit можно использовать со spec. Чтобы не заморачиваться с названиями пакетов для тестов, файл я положу прямо в src/test/scala/Kote. Spec. scalaimport akka. Actor. System. import akka. Я использую именно Free. Spec. Like, а не, скажем, Flat. Spec. Like, потому что наглядно структурировать множество тестов для различных состояний и переходов автомата на нем лично мне гораздо удобней. Поскольку мы готовы приступить к созданию нашего первого теста, я предлагаю начать с того, что коты любят делать больше всего на свете — спать. Итак, взяв на вооружение принципы TDD, мы создадим тест, который будет проверять, что вновь «рожденный» кот изначально спит. Test. FSMRef — это класс, который предлагает нам фреймворк Akka Test. Kit для упрощения тестирования конечных автоматов, реализованных с помощью класса FSM. Если быть более точным — то Test. FSMRef это класс со вспомогательным объектом (companion object), метод apply которого мы и вызываем. А возвращает нам этот метод экземпляр класса Test. FSMRef, который является наследником самого обычного Actor. Ref, т. е., мы можем посылать нашему автомату сообщения, как простому актору. Однако, функционал у Test. FSMRef несколько расширен по сравнению с простым Actor. Ref, и расширения эти предназначены именно для тестирования. Одним из таких расширений являются две использованные нами функции: state. Name и state. Data, которые предоставляют доступ к текущему состоянию нашего тестрируемого котенка. Почему же функции две, состояние- то одно? Ведь в привычном нам понимании, состояние — это совокупность текущих значений внутренних параметров автомата. Откуда же здесь две переменные, и почему именно две? Дело в том, что для описания текущего состояния автомата Akka. FSM (основываясь на принципах дизайна автоматов в Erlang) разделяет понятия «названия» состояния, и «данных», связанных с ним. Кроме того, Akka рекомендует избегать использования изменяемых (mutable) свойств (var) в классе автомата, обосновывая это тем преимуществом, что таким образом состояние автомата в коде программы будет возможным изменить только в нескольких заранее определенных и хорошо известных местах и избежать неочевидных и неявных изменений. Более того, прямого доступа изнутри нашего будущего класса к этим двум переменным нет: они объявлены как private в базовом классе FSM. Однако, Test. FSMRef предоставляет к ним доступ для возможности тестирования. А о том, как достучаться до них из самого класса автомата, — станет понятно дальше. Итак, наше состояние сна я назвал Sleeping. И засунул его во вспомогательный объект State, который отныне будет хранить все названия наших состояний для наглядности кода и избежания путаницы. Что касается данных — то на этом этапе мы еще не знаем, какими они будут. Но что- то «скормить» автомату в качестве данных все же придется, иначе он не заработает. Поэтому я решил назвать переменную именем Empty, это лично мой выбор, и ни к чему вас не обязывает. Можно назвать и по- другому: Nothing, Undefined. Как по мне, Empty — достаточно коротко и информативно. Данные я тоже привык хранить в специально выделенном объекте, который я назвал Data. В моих «боевых» автоматах различных типов данных порой не меньше, а то и больше, чем названий состояний, поэтому я всегда храню их в выделенном месте: котлеты отдельно, мухи отдельно. Ну что, компилируем? Понятно, что компиляция не пройдет, за отсутствием тех типов и переменных, к которым мы обращаемся в тесте. А это значит, что мы готовы перейти к следующему этапу цикла TDD. Для того, чтобы объявить класс нашего автомата, нам понадобятся два базовых типа, от которых будут наследоваться все классы и объекты, описывающие названия состояний и их данные. Чтобы не засорять окружающую среду, создадим вспомогательный объект (companion object), который будет хранить все необходимые для жизни котенка определения.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
January 2017
Categories |