====== Termostat w modelu MVC ======
===== Cel =====
Celem tego przykładu było stworzenie prostej aplikacji do wyznaczania temperatury opartej o wzorzec MVC, implementując Model w obiektach Logtalk oraz Widok i Kontroler w J2SE. Termostat ma wyznaczać dokładną temperaturę jak powinna być w ogrzewanym biurze na podstawie trzech danych:
- Aktualnej godziny
- Dnia tygodnia
- Aktualnego miesiąca
Reguły opisujące wyznaczanie tej temperatury są opisane w ARD i XTT w [[hekate:hekate_case_thermostat|modelu termostatu]].
===== Realizacja projektu =====
Jest to również bardzo prosty przykład, aby go zaimplementować wystarczy tak naprawdę utworzyć trzy klasy odpowiadające każdemu z modułów wzorca :
==== Widok ====
**ThermostatView** prosta klasa tworząca Swingowe okno umożliwiające wprowadzenie aktualnej Godziny, Dnia tygodnia oraz Miesiąca, oraz Wyświetlająca wyznaczoną temperaturę.
{{:pl:miw:miw08_ruleruntimeo:termostatview.png|:pl:miw:miw08_ruleruntimeo:termostatview.png}}
Po zatwierdzeniu wyboru danych wejściowych są one przekazywane do kontrolera.
==== Kontroler ====
klasa **ThermostatController** jest bardzo podobna do LogtalkControler z [[pl:miw:miw08_ruleruntimeo:mvceditor#dokonane_modyfikacje|przykładu z edytorem tekstu]]. Wewnątrz konstruktora dokonuje koniecznej konfiguracji Logtalka i SWIProloga, oraz tworzy obiekt Logtalk thermostatModel. Następnie poprzez metodę **GetTemperature** wywołuje zmianę modelu w następujący sposób :
public int GetTemperature(int hour, int day, int month)
{
Query getTemp = new Query("thermostatModel::get_temp(" +hour + ", "+ day + ", " + month + ", T).");
int value = -1;
if (getTemp.hasMoreElements()) {
Object elem = getTemp.nextElement();
if (elem instanceof java.util.Hashtable) {
java.util.Hashtable solution = (java.util.Hashtable) elem;
jpl.Integer temp = solution.get("T");
value = temp.intValue();
}
}
return value;
}
Metoda ta zwraca wyznaczoną w modelu wartość temperatury, która zostaje potem wyświetlona w Widoku.
==== Model ====
Zaimplementowany w Logtalku obiekt **thermostatModel**, który zawiera jedną publiczną metodę get_temp(Hour, Day, Month, T), która umożliwia wyznaczenie aktualnej temperatury zgodnie z modelem reguł narzuconych przez projekt.
:-object(thermostatModel, imports(properties)).
:-public(get_temp/4).
get_temp(Hour, Day, Month, T):-
checkDayTime(Hour),
season(S,Month),
checkWorkingTime(Day, Hour, O),
temperature(S, O, T),
write(T).
...
:-end_object.
Pełny kod obiektu [[pl:miw:miw08_ruleruntimeo:thermostatmodel|thermostatModel]], natomiast źródła pełnego projektu znajdują się w sekcji [[pl:miw:miw08_ruleruntimeo#projekt|Projekt]].