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