forked from maciejjaskowski/Lokaj-USOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathideal-design.txt
92 lines (68 loc) · 3.08 KB
/
ideal-design.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class Storage - interfejs dostępu do bazy danych typu (klucz, wartość)
Responsibilities:
* komunikuje sie z baza danych
* udostępnia proste API do wyciągania danych
* udostępnia proste API do zapisywania danych
class KnockingStorage -
* używa Storage
Responsibilities:
* udostępni API umożliwiające:
- wyciągniecie danych dla KnockTriala
- przeiterowanie po wszystkich KnockTrialach
??
class KnockTrial - encja przechowująca informacje o pukaniu
* zna adres do pukania (address)
* zna Knockera (knocker)
* wie kiedy zacząć pukać (timeToStart)
class Knocker - (pukacz) odpowiada za pukanie pod wybrany adres
* synchroniczny!
Responsibilities
* pukacz dostaje adres do zapukania i zwraca wynik pukania (pozytywny lub negatywny)
Knocker.knock(url)
class Scheduler - odpowiada za wysyłanie powiadomień o tym, że nadszedł na coś czas.
* używa spania, używa wielu wątków
Responsibilities
* zachowywanie wydarzeń typu: co n milisekund wykonuj callback, zaczynając od momentu t
History h = Scheduler.getHistory(); //zwraca informacje o rejestracji wydarzen do wywolania, wywolanych wydarzeniach i ich wynikach;
eventId = Scheduler.registerEvent(event); // rejestruje event
Scheduler.unregisterEvent(eventId); // usuwa event
class Event - przechowuje informacje o evencie
* tworzone tylko przez EventBuilder
Immutable Fields:
* timeToStart
* interval
* callback
* onPositiveResult
* onNegativeResult
Event e = EventBuilder.at(t).withInterval(n).run(callback); //wywolanie wielokrotne co n milisekund az do zwrocenia true przez callback;
EventBuilder.at(t).run(callback); //wywolanie jeden raz
EventBuilder.withInterval(n).run(callback); //wywolanie natychmiastowe
EventBuilder.run(callback); //wywolanie jednokrotne callback (natychmiastowe);
event.onResultEqualTo("cosTam").do(resultCallback)
// wywołuje resultCallback, jeśli callback zwrócił "cosTam"
// lub wyjątek jeśli event został już zarejestrowany w Schedulerze
id = event.schedule() - rejestruje event w schedulerze
class Main
Responsibilities
* rezurekcja:
- wczytuje KnockTriale do pukania z Storage
- ustawia wydarzenia Schedulera wedle zebranych KnockTriali
:: Event event = Scheduler.at(knockTrial.timeToStart).withInterval(1000).event(knockTrial.knocker.algorithm);
:: event.onResult().equalTo(true).do(ogłoś na rzecz interfejsu);
:: event.onResult().equalTo(false).do(ogłoś na rzecz interfejsu);
:: event.schedule();
class View
* KnockerViewBuilder -- tworzy odpowiednia htmlke (sklada sie z innych builderow).
Co to dokladnie jest nie moze byc istotne. Powinno dac sie dodac do golego htmla (bez <table> itp)
* KnockerView sklada sie z:
-- InformationView (statyczne z dokładnością do licznika)
-- TrialView (tu pojawiają się nowe statusy triali itp)
:: może to być po prostu licznik prób + informacja o powodzeniu, jeśli takie nastąpi.
::
* KnockerViewAccessor
-- get(knockerId).remove();
-- knockTrialId = get(knockerId).addKnockTrial();
-- TrialViewAccessor trial = get(knockerId).getTrialViewAccessor(trialId)
* TrialViewAccessor
-- trial.setFailure();
-- trial.setSuccess();