java осень 2014 занятие 5
DESCRIPTION
Java осень 2014 занятие 5TRANSCRIPT
![Page 1: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/1.jpg)
Углубленное программирование на
Java Лекция 2.2
«Игровая механика»
Виталий Чибриков
![Page 2: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/2.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/3.jpg)
Организация кода
3
Frontend AccountService
FrontendImpl AccountServiceImplFrontendInterface
ASInterface
![Page 4: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/4.jpg)
Интерфейсы
4
Frontend AccountService
FrontendImpl, Frontend AccountServiceImpl, AccountService
(Frontend, FrontendInterface) (AccountService, AccountServiceInterface)
Аналогично для: WebSocketService MessageSystem GameMechanics DBService
![Page 5: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/5.jpg)
Дескриптор
Сервис
Сервисы и дескрипторы
5
Решение задач
Обращение к внешним ресурсам
Хранение переменных
Доступ к переменным через getX()
![Page 6: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/6.jpg)
Изменения кода
6
FrontendImpl используем только вместе с оператором new!
Frontend frontend = new FrontendImpl(…);
Во всех классах и методах используем только интерфейс Frontend
Аналогично для всех классов и интерфейсов
Если какая-то функция из Impl должны быть вызвана «снаружи» объявляйте ее в интерфейсе
![Page 7: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/7.jpg)
1-й шаг1-й шаг
Реакторинг
7
2-й шаг
Переименовываем Frontend в FrontendImpl
Создаем пустой интерфейс Frontend
FrontendImpl implements Frontend
Компилируем, видим что ничего не изменилось
Меняем везде (кроме new) FrontendImpl на Frontend
Компилляция не проходит
Добавляем в Frontend все нужные обявления методов
![Page 8: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/8.jpg)
Тестирование
8
Тест на Frontend
Frontend требует AccountService и GameMechanics
Создаем в тесте mock для AccountService и GameMechanics
Frontend использует только интерфейсы сервисов
И передаем в Frontend по интерфейсам
AccountService и GameMechanics разделены на интерфейсы и реализации
Среди реализаций есть mock реализации
![Page 9: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/9.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/10.jpg)
Аннотации ― метаданные о коде
Annotations
10
Содержат данные о программе не являясь частью программы
Не влияют непосредственно на работу приложения
Влияют только на ту функциональность, которая их обрабатывает
Могут влиять на работу компилятора, инструментов и библиотек
“Decorating” or “wrapping” классы в runtime
![Page 11: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/11.jpg)
Примеры аннотаций
11
Аннотация на метод@Test public void unitTestSomething(){…}
Аннотация на класс@Deprecated class oldClass{…}
Аннотация на поле@Nullable private Object object;
Аннотация на переменнуюpublic int getUserId(@NotNull User user){…}
![Page 12: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/12.jpg)
@NotNull
NotNull
12
Ссылка не может быть null
Для программиста – указание на то, что на null можно не проверять
Для среды разработки – подсветка присваиваний null
В runtime – исключение в момент присваивания null
![Page 13: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/13.jpg)
@Deprecated
Стандартные аннотации
13
Обозначает устаревшую функциональность
Deprecated методы могут быть удалены в следующих версиях
@Override
Отмечает методы, кторые переопределяют методы базового класса
Компилятор проверяет сигнатуры методов
Указание IDE или компилятору не сообщать об проблемах типа «warning»
@SuppressWarnings
![Page 14: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/14.jpg)
Синтаксис аннотаций
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/15.jpg)
Обработка аннотаций
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/16.jpg)
Виды аннотаций
16
RetentionPolicy.SOURCE ― аннотации присутствуют только в коде
Информация для компилятора
Информация для инструментов IDE
RetentionPolicy.CLASS ― сохранены в .class, но не доступны в runtime
Доступны при анализе byte-кода
Не доступны через reflection
RetentionPolicy.RUNTIME ― сохранены в .class и доступны в runtime
Аннотации можно получать из getClass() через reflection
![Page 17: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/17.jpg)
Аннотации аннотаций
17
@Retention(RetentionPolicy.RUNTIME) @interface CreatedBy { String author(); String date(); }
@Retention ― аннотация для указания типа аннотации
![Page 18: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/18.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/19.jpg)
Технологии
19
Двухсторонняя связь браузер - сервер
Перезапрос страницы
Перезапрос участка страницы Ajax
Long polling
WebSockets
![Page 20: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/20.jpg)
Задача
20
Общий чат со свободным входом
WebSockets
Javascript
HTML5
![Page 21: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/21.jpg)
Пример кода
21
https://github.com/vitaly-chibrikov/tp_java_2014_09/tree/master/L2.2
![Page 22: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/22.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/23.jpg)
Задача
23
Игра «Кто больше накликает»
WebSockets
Javascript
Servlets
Авторизация по имени
![Page 24: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/24.jpg)
Пример кода
24
https://github.com/vitaly-chibrikov/tp_java_2014_09/tree/master/L2.2-mech
![Page 25: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/25.jpg)
Ваши успехи в играх
25
Анонимный тест
![Page 26: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/26.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/27.jpg)
Singleton
Singleton
27
Позволяет создать только один объект данного типа на процесс
Аналог статического поля, с «отложенной» инициализацией
Содержит приватное статическое поле типа своего же класса (instance)
Приватный конструктор
Статический метод instance() который возвращает instance класса
![Page 28: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/29.jpg)
Context
29
Map<класс, объект этого класа>
Хранит сылки на объекты по ключу – классу объекта
Обертка над картой
1. Проверяет, что служба в единственном экземпляре,даже если служба не singleton
2. Содержит ссылки на множество служб, которые могут понадобиться методам объектов процесса
3. Позволяет создать только те объекты, которые нужны процессу
4. Список нужных служб можно хранить в конфиге
![Page 30: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/31.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/32.jpg)
Задачи исключений
32
«второй» способ выхода из функции
возможность вернуть код ошибки
«проброс» данных через call stack
уведомление вызывающей стороны о некорректных данных
уведомление о состоянии которое код не может исправить
![Page 33: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/33.jpg)
Пример
33
Варианты результата вызова функции:
значение
null
еxception – отказ от выполнения задачи
Рассмотрим функцию чтения id по имени из базы
public Integer getId(String name){…}
![Page 34: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/35.jpg)
Наследование
35
![Page 36: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/37.jpg)
Пример использвания
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/38.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/39.jpg)
Events
39
Задача
Служба в которой происходят некоторые события – EventSource
Объекты, которые должны реагировать на эти события – EventListeners
Нужен механизм оповещения о событии
Реализация
EventSource
EventListenerInterface
EventListenerImpl
![Page 40: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/40.jpg)
Pattern Observer
40
![Page 41: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/42.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/43.jpg)
Примеры подписок
43
Старт сервера
События игрового мира
Вход/выход пользователя на карту
Наступление определенного момента времени
![Page 44: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/44.jpg)
Задача
Реализация
Callback
44
Вы используете внешнюю библиотеку
Событие во внешней библиотеке должно повлиять на ваш код
Ваш метод который будет вызван по событию – callback
Вы должны передать в библиотеку свой метод
С++: ссылка на функцию
С#: делегаты
Java: вы передаете объект реализующий библиотечный интерфейс
![Page 45: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/45.jpg)
Callback
45
Пример:
class HelloWorld extends HttpServlet { //из примера jetty
public void doGet(HttpServletRequest request, HttpServletResponse response) { //это callback
}
![Page 46: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/46.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/47.jpg)
Pseudorandom number generator — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению
Нет понятия случайного числа Есть последовательности чисел с заданным распределением
Random
47
![Page 48: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/48.jpg)
Алгоритм случайности
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/49.jpg)
Параметры случайности
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/50.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/51.jpg)
…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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/52.jpg)
План лекции
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/53.jpg)
Time & Date
53
Работа со временем
Работу со временем лучше перенести в TimeHelper
От миллисекунд до даты
UNIX или POSIX time – время с 1 января 1970 в секундах
Форматирование даты и времени для пользователей
Как хранить время в приложении и в базе
Подписка на таймер
![Page 54: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/54.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/55.jpg)
Timer
55
java.unil.Timer
java.unil.TimerTask
Порядок работы:
Создаем timer
Создаем класс унаследованный от TimerTask
Пишем в методе run() код, который будет выполнен по таймеру
Передаем в timer таск и время, через которое надо выполнить таск
Ждем положенное время
PROFIT!!!
Выключаем timer через timer.cancel();
![Page 56: Java осень 2014 занятие 5](https://reader034.vdocuments.net/reader034/viewer/2022052601/558b88d5d8b42a171b8b4761/html5/thumbnails/56.jpg)
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);