|
|
pl:miw:miw08_ruleruntimeo:mvcthermostate [2019/06/27 15:50] |
pl:miw:miw08_ruleruntimeo:mvcthermostate [2019/06/27 15:50] (aktualna) |
| ====== 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 : |
| |
| <code java> |
| |
| 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<String, jpl.Integer> solution = (java.util.Hashtable<String, jpl.Integer>) elem; |
| |
| jpl.Integer temp = solution.get("T"); |
| |
| value = temp.intValue(); |
| |
| |
| } |
| } |
| return value; |
| } |
| |
| </code> |
| |
| 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. |
| |
| <code prolog> |
| |
| :-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. |
| |
| </code> |
| |
| 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]]. |
| |
| |