====== 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]].