|
1 | 1 | # 🏠 Facade - SmartHome System |
2 | 2 |
|
3 | | -**Difficulty**: easy |
4 | | -**Time**: 10 minutes |
5 | | -**Focus**: Facade pattern - simplifying complex subsystems |
| 3 | +**Poziom**: łatwy |
| 4 | +**Cel**: Facade - uproszczenie interfejsu do złożonych podsystemów |
6 | 5 |
|
7 | 6 | ## 🎯 Zadanie |
8 | | -Zaimplementuj `SmartHomeFacade` - upraszcza sterowanie wieloma urządzeniami. |
| 7 | +Zaimplementuj wzorzec Facade dla systemu inteligentnego domu. `SmartHomeFacade` upraszcza sterowanie wieloma urządzeniami poprzez wystawienie prostych metod wysokiego poziomu. |
9 | 8 |
|
10 | 9 | ## 📋 Wymagania |
11 | | -- [ ] `SmartHomeFacade.__init__()` - tworzy Light, Thermostat, Security, TV |
12 | | -- [ ] `evening_mode()` - dim(50), temp(22), disarm, TV on |
13 | | -- [ ] `leaving_home()` - light off, temp(18), arm, TV off |
| 10 | +- [ ] Przechodzą doctesty |
| 11 | +- [ ] Przechodzą testy jednostkowe (pytest) |
| 12 | +- [ ] `SmartHomeFacade` tworzy wszystkie podsystemy w konstruktorze |
| 13 | +- [ ] Metoda `evening_mode()` koordynuje wszystkie podsystemy |
| 14 | +- [ ] Metoda `leaving_home()` koordynuje wszystkie podsystemy |
14 | 15 |
|
15 | 16 | ## 🚀 Jak zacząć |
16 | | -```bash |
17 | | -cd day2_structural/05_facade |
18 | | -pytest test_facade.py -v |
19 | | -``` |
| 17 | +1. Otwórz `starter.py` |
| 18 | +2. Uruchom testy (powinny failować): |
| 19 | + - Doctests: `python -m doctest starter.py -v` |
| 20 | + - Pytest: `pytest` (lub `pytest -v` dla bardziej szczegółowego outputu) |
| 21 | +3. Podsystemy (`Light`, `Thermostat`, `SecuritySystem`, `TV`) są już gotowe |
| 22 | +4. Zaimplementuj klasę `SmartHomeFacade`: |
| 23 | + - Konstruktor tworzy instancje wszystkich podsystemów |
| 24 | + - Metoda `evening_mode()` - wywołuje odpowiednie metody podsystemów |
| 25 | + - Metoda `leaving_home()` - wywołuje odpowiednie metody podsystemów |
| 26 | +5. Uruchom testy ponownie (teraz powinny przejść) |
| 27 | +6. Gdy wszystkie testy przechodzą: |
| 28 | + ```bash |
| 29 | + git add . |
| 30 | + git commit -m "Complete Facade pattern" |
| 31 | + git push |
| 32 | + ``` |
| 33 | +7. Sprawdź wynik w GitHub Actions |
20 | 34 |
|
21 | 35 | ## 💡 Facade w pigułce |
22 | 36 |
|
23 | | -**Upraszcza interfejs do złożonego podsystemu** |
| 37 | +**Facade deleguje pracę do wielu podsystemów i upraszcza interfejs** |
| 38 | + |
| 39 | +### Jak to działa: |
| 40 | +1. Facade tworzy instancje wszystkich podsystemów w konstruktorze |
| 41 | +2. Klient wywołuje jedną metodę Facade (np. `evening_mode()`) |
| 42 | +3. Facade koordynuje wywołania do wielu podsystemów w odpowiedniej kolejności |
| 43 | + |
| 44 | +### Kluczowy moment: |
| 45 | +```python |
| 46 | +def evening_mode(self) -> str: |
| 47 | + # Facade wywołuje wiele podsystemów |
| 48 | + result1 = self.light.dim(50) |
| 49 | + result2 = self.thermostat.set_temperature(22) |
| 50 | + # ... itd |
| 51 | +``` |
| 52 | + |
| 53 | +Klient nie musi znać `Light`, `Thermostat`, `SecuritySystem`, `TV` - tylko `SmartHomeFacade`. |
| 54 | + |
| 55 | +--- |
24 | 56 |
|
25 | | -❌ **Źle** (klient zna wszystkie podsystemy): |
| 57 | +### ❌ Bez wzorca: |
26 | 58 | ```python |
27 | | -# Klient wywołuje 4 klasy ❌ |
| 59 | +# Klient zarządza wszystkim |
28 | 60 | light = Light() |
29 | 61 | thermostat = Thermostat() |
30 | 62 | security = SecuritySystem() |
31 | 63 | tv = TV() |
32 | 64 |
|
33 | | -# Klient musi pamiętać sekwencję ❌ |
| 65 | +# Musi pamiętać sekwencję |
34 | 66 | light.dim(50) |
35 | 67 | thermostat.set_temperature(22) |
36 | 68 | security.disarm() |
37 | 69 | tv.turn_on() |
38 | 70 | ``` |
39 | 71 |
|
40 | | -✅ **Dobrze** (Facade ukrywa złożoność): |
| 72 | +### ✅ Z wzorcem (Facade): |
41 | 73 | ```python |
42 | | -home = SmartHomeFacade() # Jedna klasa ✅ |
43 | | -home.evening_mode() # Jedna metoda ✅ |
44 | | - |
45 | | -# Facade wywoła wszystkie 4 podsystemy w odpowiedniej kolejności |
| 74 | +home = SmartHomeFacade() |
| 75 | +home.evening_mode() |
| 76 | +# Facade zarządza wszystkim wewnętrznie |
46 | 77 | ``` |
47 | 78 |
|
48 | | -**Korzyść**: Klient nie zna Light/Thermostat/Security/TV - tylko Facade. |
49 | | - |
50 | | -**Kiedy stosować**: |
51 | | -- Uproszczenie złożonego API |
52 | | -- Ukrycie legacy code |
53 | | -- Jeden punkt wejścia do wielu systemów |
54 | | - |
55 | | -Sprawdź `solution_facade.py` po wykonaniu. |
| 79 | +**Korzyść**: Klient wywołuje jedną metodę zamiast czterech, bez znajomości implementacji podsystemów. |
0 commit comments