57
Углубленное программирование на Java Лекция 2.2 «Игровая механика» Виталий Чибриков

Java осень 2014 занятие 5

Embed Size (px)

DESCRIPTION

Java осень 2014 занятие 5

Citation preview

Page 1: Java осень 2014 занятие 5

Углубленное программирование на

Java Лекция 2.2

«Игровая механика»

Виталий Чибриков

Page 2: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

2

Page 3: Java осень 2014 занятие 5

Организация кода

3

Frontend AccountService

FrontendImpl AccountServiceImplFrontendInterface

ASInterface

Page 4: Java осень 2014 занятие 5

Интерфейсы

4

Frontend AccountService

FrontendImpl, Frontend AccountServiceImpl, AccountService

(Frontend, FrontendInterface) (AccountService, AccountServiceInterface)

Аналогично для: WebSocketService MessageSystem GameMechanics DBService

Page 5: Java осень 2014 занятие 5

Дескриптор

Сервис

Сервисы и дескрипторы

5

Решение задач

Обращение к внешним ресурсам

Хранение переменных

Доступ к переменным через getX()

Page 6: Java осень 2014 занятие 5

Изменения кода

6

FrontendImpl используем только вместе с оператором new!

Frontend frontend = new FrontendImpl(…);

Во всех классах и методах используем только интерфейс Frontend

Аналогично для всех классов и интерфейсов

Если какая-то функция из Impl должны быть вызвана «снаружи» объявляйте ее в интерфейсе

Page 7: Java осень 2014 занятие 5

1-й шаг1-й шаг

Реакторинг

7

2-й шаг

Переименовываем Frontend в FrontendImpl

Создаем пустой интерфейс Frontend

FrontendImpl implements Frontend

Компилируем, видим что ничего не изменилось

Меняем везде (кроме new) FrontendImpl на Frontend

Компилляция не проходит

Добавляем в Frontend все нужные обявления методов

Page 8: Java осень 2014 занятие 5

Тестирование

8

Тест на Frontend

Frontend требует AccountService и GameMechanics

Создаем в тесте mock для AccountService и GameMechanics

Frontend использует только интерфейсы сервисов

И передаем в Frontend по интерфейсам

AccountService и GameMechanics разделены на интерфейсы и реализации

Среди реализаций есть mock реализации

Page 9: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

9

Page 10: Java осень 2014 занятие 5

Аннотации ― метаданные о коде

Annotations

10

Содержат данные о программе не являясь частью программы

Не влияют непосредственно на работу приложения

Влияют только на ту функциональность, которая их обрабатывает

Могут влиять на работу компилятора, инструментов и библиотек

“Decorating” or “wrapping” классы в runtime

Page 11: Java осень 2014 занятие 5

Примеры аннотаций

11

Аннотация на метод@Test public void unitTestSomething(){…}

Аннотация на класс@Deprecated class oldClass{…}

Аннотация на поле@Nullable private Object object;

Аннотация на переменнуюpublic int getUserId(@NotNull User user){…}

Page 12: Java осень 2014 занятие 5

@NotNull

NotNull

12

Ссылка не может быть null

Для программиста – указание на то, что на null можно не проверять

Для среды разработки – подсветка присваиваний null

В runtime – исключение в момент присваивания null

Page 13: Java осень 2014 занятие 5

@Deprecated

Стандартные аннотации

13

Обозначает устаревшую функциональность

Deprecated методы могут быть удалены в следующих версиях

@Override

Отмечает методы, кторые переопределяют методы базового класса

Компилятор проверяет сигнатуры методов

Указание IDE или компилятору не сообщать об проблемах типа «warning»

@SuppressWarnings

Page 14: Java осень 2014 занятие 5

Синтаксис аннотаций

14

Не может наследовать или быть базовым классом

Не содержит конструкторов и полей

Может содержать методы без переменных, которые работают как поля

@interface CreatedBy { String author(); String date(); }

@CreatedBy (author = “tully”, date = “01.10.2014”) public class MyClass {…}

@CreatedBy (author = “tully”, date = “01.10.2014”) public static void main(String args[])

Page 15: Java осень 2014 занятие 5

Обработка аннотаций

15

Class myClass = MyClass.class; Method method = myClass.getMethod(“main”);

CreatedBy annotationC = myClass.getAnnotation(CreatedBy.class); CreatedBy annotationM = method.getAnnotation(CreatedBy.class);

log.info(“Author of the class: ” + annotationC.author()); log.info(“Date of Writing the class: ” + annotationC.date()); log.info(“Author of the method: ” + annotationM.author()); log.info(“Date of Writing the method: ” + annotationM.date());

Обработка аннотаций в runtime

Page 16: Java осень 2014 занятие 5

Виды аннотаций

16

RetentionPolicy.SOURCE ― аннотации присутствуют только в коде

Информация для компилятора

Информация для инструментов IDE

RetentionPolicy.CLASS ― сохранены в .class, но не доступны в runtime

Доступны при анализе byte-кода

Не доступны через reflection

RetentionPolicy.RUNTIME ― сохранены в .class и доступны в runtime

Аннотации можно получать из getClass() через reflection

Page 17: Java осень 2014 занятие 5

Аннотации аннотаций

17

@Retention(RetentionPolicy.RUNTIME) @interface CreatedBy { String author(); String date(); }

@Retention ― аннотация для указания типа аннотации

Page 18: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

18

Page 19: Java осень 2014 занятие 5

Технологии

19

Двухсторонняя связь браузер - сервер

Перезапрос страницы

Перезапрос участка страницы Ajax

Long polling

WebSockets

Page 20: Java осень 2014 занятие 5

Задача

20

Общий чат со свободным входом

WebSockets

Javascript

HTML5

Page 21: Java осень 2014 занятие 5

Пример кода

21

https://github.com/vitaly-chibrikov/tp_java_2014_09/tree/master/L2.2

Page 22: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

22

Page 23: Java осень 2014 занятие 5

Задача

23

Игра «Кто больше накликает»

WebSockets

Javascript

Servlets

Авторизация по имени

Page 24: Java осень 2014 занятие 5

Пример кода

24

https://github.com/vitaly-chibrikov/tp_java_2014_09/tree/master/L2.2-mech

Page 25: Java осень 2014 занятие 5

Ваши успехи в играх

25

Анонимный тест

Page 26: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

26

Page 27: Java осень 2014 занятие 5

Singleton

Singleton

27

Позволяет создать только один объект данного типа на процесс

Аналог статического поля, с «отложенной» инициализацией

Содержит приватное статическое поле типа своего же класса (instance)

Приватный конструктор

Статический метод instance() который возвращает instance класса

Page 28: Java осень 2014 занятие 5

Singleton

28

public class Singleton { private static Singleton singleton;

public static Singleton instance(){ if(singleton == null){ singleton = new Singleton(); } return singleton; }

private Singleton(){} }

Page 29: Java осень 2014 занятие 5

Context

29

Map<класс, объект этого класа>

Хранит сылки на объекты по ключу – классу объекта

Обертка над картой

1. Проверяет, что служба в единственном экземпляре,даже если служба не singleton

2. Содержит ссылки на множество служб, которые могут понадобиться методам объектов процесса

3. Позволяет создать только те объекты, которые нужны процессу

4. Список нужных служб можно хранить в конфиге

Page 30: Java осень 2014 занятие 5

Context

30

public class Context { private Map<Class<?>, Object> context = new HashMap<>();

public void add(Class<?> clazz, Object object){ if(context.containsKey(clazz)){ //ERROR } context.put(clazz, object); }

public Object get(Class<?> clazz){ return context.get(clazz); } }

Page 31: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

31

Page 32: Java осень 2014 занятие 5

Задачи исключений

32

«второй» способ выхода из функции

возможность вернуть код ошибки

«проброс» данных через call stack

уведомление вызывающей стороны о некорректных данных

уведомление о состоянии которое код не может исправить

Page 33: Java осень 2014 занятие 5

Пример

33

Варианты результата вызова функции:

значение

null

еxception – отказ от выполнения задачи

Рассмотрим функцию чтения id по имени из базы

public Integer getId(String name){…}

Page 34: Java осень 2014 занятие 5

Throwable

34

public class Throwable

private StackTraceElement[] stackTrace = UNASSIGNED_STACK;

private String detailMessage;

private Throwable cause = this;

public String getMessage()

public void printStackTrace()

public Throwable getCause()

Page 35: Java осень 2014 занятие 5

Наследование

35

Page 36: Java осень 2014 занятие 5

Exception

36

public class Exception extends Throwable

public Exception()

public Exception(String message)

public Exception(String message, Throwable cause)

public Exception(Throwable cause)

public class DBException extends Exception

public DBException(){…}

public DBException(String message, Throwable cause){ super(message, cause) … }

Page 37: Java осень 2014 занятие 5

Пример использвания

37

public void setIdFromName(String name){ try{ userId = getId(name); } catch(DBException e){ log.error(e.getMessage()); } }

private int getId(String name) throws DBException{ DatabaseManager manager = context.get(DatabaseManager.class); if(manager == null){ throw new DBException(“Can’t find DBManager”); } return manager.readId(name); }

Page 38: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

38

Page 39: Java осень 2014 занятие 5

Events

39

Задача

Служба в которой происходят некоторые события – EventSource

Объекты, которые должны реагировать на эти события – EventListeners

Нужен механизм оповещения о событии

Реализация

EventSource

EventListenerInterface

EventListenerImpl

Page 40: Java осень 2014 занятие 5

Pattern Observer

40

Page 41: Java осень 2014 занятие 5

Event listener

41

public interface EventListener { public void handle(EventObject event); }

public class EventListenerImpl implements EventListener {

//code

public void handle(...){ //process event } }

Page 42: Java осень 2014 занятие 5

Event source

42

public class EventSource { private List<EventListener> listeners = new LinkedList<EventListener>(); public void addListener(EventListener listener){ listeners.add(listener); } public void removeListener(EventListener listener){ listeners.remove(listener); }

public void fireEvent(){ for(MyEventListener listner : listeners){ listner.handle(...); } } }

Page 43: Java осень 2014 занятие 5

Примеры подписок

43

Старт сервера

События игрового мира

Вход/выход пользователя на карту

Наступление определенного момента времени

Page 44: Java осень 2014 занятие 5

Задача

Реализация

Callback

44

Вы используете внешнюю библиотеку

Событие во внешней библиотеке должно повлиять на ваш код

Ваш метод который будет вызван по событию – callback

Вы должны передать в библиотеку свой метод

С++: ссылка на функцию

С#: делегаты

Java: вы передаете объект реализующий библиотечный интерфейс

Page 45: Java осень 2014 занятие 5

Callback

45

Пример:

class HelloWorld extends HttpServlet { //из примера jetty

public void doGet(HttpServletRequest request, HttpServletResponse response) { //это callback

}

Page 46: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

46

Page 47: Java осень 2014 занятие 5

Pseudorandom number generator — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению

Нет понятия случайного числа Есть последовательности чисел с заданным распределением

Random

47

Page 48: Java осень 2014 занятие 5

Алгоритм случайности

48

Linear Congruential Pseudorandom Number Generator (See Donald Knuth, The Art of Computer Programming, Volume 3, Section 3.2.1.)

java.util.Random

modulus

increment

multiplier

seed

Page 49: Java осень 2014 занятие 5

Параметры случайности

49

Source m (multiplier) a    (increment) c

Borland C/C++ 232 22695477 1

glibc (used by GCC)[5] 231 1103515245 12345

Borland Delphi, Virtual Pascal 232 134775813 1

Microsoft Visual/Quick C/C++ 232 214013 (343FD16) 2531011 (269EC316)

Microsoft Visual Basic (6 and earlier)[7] 224 1140671485 (43FD43FD16)

12820163 (C39EC316)

Apple CarbonLib, C++11 231 − 1 16807 0

C++11's minstd_rand[9] 231 − 1 48271 0

MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407

Java's java.util.Random, 248 25214903917 11

Page 50: Java осень 2014 занятие 5

Math.random(); – вернет случайное число типа double от 0 до 1 При каждом запуске последовательность будет новой

Random rnd = new Random(1L); rnd.nextInt(100); – вернет случайное число от 0 до 99 При каждом запуске последовательность будет прежней

Random rnd = new Random(); rnd.nextInt(100); – вернет случайное число от 0 до 99 При каждом запуске последовательность будет новой

Random in java

50

Page 51: Java осень 2014 занятие 5

…Sid Meier found that if a player lost too many 2-to-1 battles in a row, they would get frustrated. Instead of risking a player shutting the game down, Sid changed the math :o)

Субъективная случайность

51

Видео (Sid Meier GDC 2010):

http://www.youtube.com/watch?v=bY7aRJE-oOY

Page 52: Java осень 2014 занятие 5

План лекции

1. Интерфейсы и реализации 2. Аннотации 3. WebSockets

4. Игровая механика 5. Singleton и Context

6. Exception и Throwable

7. Events и Callbacks

8. Random

9. Time и Date

52

Page 53: Java осень 2014 занятие 5

Time & Date

53

Работа со временем

Работу со временем лучше перенести в TimeHelper

От миллисекунд до даты

UNIX или POSIX time – время с 1 января 1970 в секундах

Форматирование даты и времени для пользователей

Как хранить время в приложении и в базе

Подписка на таймер

Page 54: Java осень 2014 занятие 5

TimeHelper

54

public class TimeHelper {

public static long getTimeInMs(){ Date date = new Date(); return date.getTime(); }

public static int getPOSIX(){ Date date = new Date(); int millisInSecond = 1000; return (int)(date.getTime() / millisInSecond); }

public static String getUserDateFull(Locale locale){ Date date = new Date(); DateFormat dateFormatter = DateFormat. getDateInstance(DateFormat.FULL, locale); return dateFormatter.format(date); } }

Page 55: Java осень 2014 занятие 5

Timer

55

java.unil.Timer

java.unil.TimerTask

Порядок работы:

Создаем timer

Создаем класс унаследованный от TimerTask

Пишем в методе run() код, который будет выполнен по таймеру

Передаем в timer таск и время, через которое надо выполнить таск

Ждем положенное время

PROFIT!!!

Выключаем timer через timer.cancel();

Page 56: Java осень 2014 занятие 5

Timer

56

int timeMs = 10000; TimeService.instance().start(); TimeService.instance().sheduleTask(new TimerTask(){

public void run() { System.out.append("Timer run!\n"); TimeService.instance().stop(); }

}, timeMs);

Page 57: Java осень 2014 занятие 5

Спасибо за внимание

Виталий Чибриков [email protected]