🎯 Przegląd
Ten przewodnik prowadzi Cię przez projektowanie i modelowanie systemu System sterowania połączeniami telefonicznymi przy użyciu Diagramy maszyn stanów UML. Skupia się na cyklu życia połączenia wychodzącego, pokazując, jak linia telefoniczna przechodzi między stanami w odpowiedzi na działania użytkownika i zdarzenia sieciowe.
Diagram uchwyca zarówno ścieżki pozytywne (pomyślne ustawienie połączenia) oraz ścieżki negatywne (błędy, przekroczenia czasu, zajęte linie), podkreślając odporność, obsługę wyjątków oraz jasne przejścia między stanami – kluczowe zasady w systemach komunikacji w czasie rzeczywistym.
🧩 Podstawowe pojęcia w maszynach stanów UML
Zanim przejdziesz do diagramu, zrozum te podstawowe pojęcia UML:
| Pojęcie | Opis |
|---|---|
| Stan | Stan, w którym obiekt spełnia określone warunki lub wykonuje działania. |
| Przejście | Zmiana z jednego stanu do drugiego, wyzwolona zdarzeniem. |
| Zdarzenie | Zdarzenie, które powoduje przejście (np. na wieszaku, poprawny numer). |
| Przejście samoistne | Przejście, które zaczyna się i kończy w tym samym stanie (np. cyfra(n) podczas gdy w Dzwonienie). |
| Stan pseudoo | Specjalne punkty sterowania takie jak Początkowy lub Ostateczny które nie są rzeczywistymi stanami. |
| Stan złożony | Stan zawierający podstany (np. Błąd stan z Ton zajętości, Szybki ton zajętości, Zapisana wiadomość). |
| Warunek strażnika | Wyrażenie logiczne, które musi być prawdziwe, aby przejście mogło się wydarzyć. |
✅ Porada: Użyj
zdarzenie [strażnik] / działanieskładnia w UML do dokumentowania wyzwalaczy, warunków i skutków ubocznych.
🔄 Cykl życia połączenia wychodzącego: szczegółowy rozkład krok po kroku
1. Faza inicjacji i wybierania
🔹 Początkowy stan pseudowy → Bezczynność
- System zaczyna działanie w stanie Początkowy stan pseudowy.
- Dotychczas brak aktywności; telefon jest na słuchawce.
🔹 Bezczynność → Dzwonienie (na słuchawce)
- Zdarzenie:
na słuchawce(użytkownik podnosi słuchawkę) - Przejście:
na słuchawce → Dzwonienie - Działanie: Wygeneruj dzwonienie; przygotuj się do wprowadzenia cyfry.
📌 Jest to pierwsza widoczna zmiana stanu w cyklu wywołania.
🔹 Dzwonienie → Dialing (cyfra(n))
- Zdarzenie:
cyfra(n)(użytkownik wprowadza cyfrę) - Przejście:
cyfra(n) → Dialing - Stan: Wejdź
Dialingtryb.
🔹 Przejście samoobserwacyjne: Dialing → Dialing (cyfra(n))
- Zdarzenie:
cyfra(n)(wprowadzono wiele cyfr) - Warunek: Brak (zawsze dozwolone)
- Działanie: Dodaj cyfrę do numeru, który jest wybierany.
- Cel: Zezwól na ciągłe wprowadzanie cyfr bez opuszczenia stanu
Wybieraniestanu.
💡 Przejścia samodzielne są niezbędne do obsługi sekwencji wejściowych, takich jak numery telefonów.
2. Logika połączenia i obsługa wyjątków
🔹 Wybieranie → Łączenie (poprawnyNumer)
- Zdarzenie:
poprawnyNumer(pełny numer zwalidowany) - Przejście:
poprawnyNumer → Łączenie - Działanie: Rozpocznij konfigurację połączenia z siecią.
🔹 Wybieranie → Wiadomość nagrana (niepoprawnyNumer)
- Zdarzenie:
niepoprawnyNumer(np. błędna długość, nieprawidłowy prefiks) - Przejście:
niepoprawnyNumer → Wiadomość nagrana - Działanie: Odtwórz nagraną wiadomość: „Numer, który wybrałeś, nie jest dostępny.”
🔹 Łączenie → Sygnał zajętości (numerZajęty)
- Zdarzenie:
numerZajęty - Przejście:
numerZajęty → DzwonTłumok - Działanie: Odtwarzaj dźwięk zajętości; poinformuj użytkownika, że linia jest zajęta.
🔹 Łączenie → Szybki dźwięk zajętości (trunkBusy)
- Zdarzenie:
trunkBusy - Przejście:
trunkBusy → Szybki dźwięk zajętości - Działanie: Odtwarzaj szybki dźwięk zajętości; wskazuj zator sieciowy.
⚠️ Uwaga: To są stan błędu które przerywają normalny przebieg. Muszą być obsługiwane zgodnie z zasadami.
3. Mechanizm wygaśnięcia i ostrzeżeń
🔹 Wybieranie → Ostrzeżenie (wygaśnięcie)
- Zdarzenie:
wygaśnięciepo 30 sekundach bezczynności - Przejście:
wygaśnięcie → Ostrzeżenie - Działanie: Odtwarzaj sygnał ostrzegawczy; poinformuj użytkownika, by kontynuował lub odłożył słuchawkę.
🔹 Ostrzeżenie → Wygaśnięcie (wygaśnięcie)
- Zdarzenie:
wygaśnięcieponownie po 10 sekundach - Przejście:
timeout → Timeout - Działanie: Anuluj próbę połączenia; powrót do
Nieaktywny.
⏱️ Logika timera zapobiega nieograniczonemu oczekiwaniu i poprawia doświadczenie użytkownika.
4. Aktywne połączenie i rozłączenie
🔹 Łączenie → Dzwoni (przekierowane)
- Zdarzenie:
przekierowane(sieć pomyślnie przekierowała połączenie) - Przejście:
przekierowane → Dzwoni - Działanie: Wyślij sygnał dzwonienia do osoby dzwonionej.
🔹 Dzwoni → Połączony (osoba dzwoniona odebrała)
- Zdarzenie:
osoba dzwoniona odebrała - Przejście:
osoba dzwoniona odebrała → Połączony - Działanie: Ustanów połączenie audio; rozpocznij nagrywanie połączenia (jeśli włączone).
🔹 Połączony → Rozłączony (na wisiorku LUB osoba dzwoniona zakończyła połączenie)
- Dwa sposoby rozłączenia:
- Użytkownik kończy połączenie:
na wisiorku → Rozłączony - Druga strona kończy połączenie:
calledPhoneHangsUp → Rozłączony
- Użytkownik kończy połączenie:
🔄 Oba przejścia prowadzą do
Rozłączonyprzed osiągnięciemStan końcowy.
🔹 Rozłączony → Stan końcowy
- Zdarzenie: Brak (niejawne lub poprzez działanie czyszczenia)
- Przejście:
Rozłączony → Końcowy - Działanie: Oczyść zasoby, zapisz czas trwania połączenia, zaktualizuj statystyki.
✅ Stan końcowy oznacza koniec cyklu życia połączenia.
🎨 Zasady projektowania wizualnego dla jasności
Aby uczynić złożone maszyny stanów czytelne i utrzymywalne:
| Zasada | Realizacja |
|---|---|
| Główna droga pozytywna | Utrzymaj główny przepływ (Ciche → Sygnał wybierania → Wybieranie → Łączenie → Dzwoni → Połączony) jako czystą linię pionową lub poziomą. |
| Rozgałęzianie się dla wyjątków | Umieść stany błędów (Sygnał zajętości, Sygnał szybkiej zajętości, Zapisana wiadomość) jako gałęzie boczne. |
| Grupuj powiązane stany | Użyj stanów złożonych dla warunków błędów (patrz niżej). |
| Pomyślnie wykorzystuj stany pseudoczynne | Początkowy i Ostateczny powinien być wyraźnie oznaczony. |
| Unikaj przecinających się przejść | Zachowaj niezakładanie się strzałek; użyj obszarów ortogonalnych, jeśli to konieczne. |
🔧 Zaawansowane techniki modelowania
✅ Stan złożony: grupowanie „Błąd”
Zamiast wymieniania BusyTone, FastBusyTone, i RecordedMessage jako osobne stany, zgrupuj je pod stanem złożonym nazywanym Błąd:
[Błąd]
├── BusyTone
├── FastBusyTone
└── RecordedMessage
- Akcja wejścia: Odtwarzaj dźwięk błędu lub wiadomość.
- Akcja wyjścia: Powrót do
DialTonelubPustapo odpowiedzi użytkownika.
✅ Zalety:Zmniejsza zamieszanie wizualne i poprawia skalowalność.
✅ Warunki zabezpieczające (opcjonalne ulepszenia)
Dodaj warunki zabezpieczające, aby dopasować przejścia:
cyfra(n) [number.length < 15] → Wybieranie
poprawnyNumer [number.isInternational] → Łączenie
🛠️ Warunki zabezpieczające zapobiegają nieprawidłowym przejściom i wspierają logikę warunkową.
📌 Kluczowe wnioski: Najlepsze praktyki dla złożonych maszyn stanów
| Ćwiczenie | Dlaczego to ma znaczenie |
|---|---|
| Modeluj ścieżki niepowodzeń | Prawdziwe systemy zawodzą. Projektowanie z myślą o niepoprawnyNumer, przekroczonoLimitCzasu, liniaZajęta zapewnia niezawodność. |
| Użyj wyrażeń akcji | Uwzględnij / logujProbaPolaczenia() lub / odtwarzajTone() aby pokazać skutki uboczne. |
| Utrzymuj zdarzenia szczegółowe i skierowane na działanie | Użyj naLinię, przekierowano, wywołanyTelefonOdbiera zamiast e1, e2. |
| Jasno nazwij stany | Unikaj Stan1, Stan2. Użyj Dzwonienie, Dzwoni, Połączony. |
| Zapisz założenia | Np. „Timeout po 30 sekundach bezczynności” powinien być zaznaczony w komentarzach. |
💻 Generowanie kodu: PlantUML i Mermaid
Oto gotowe bloki kodu do wygenerowania tego diagramu w preferowanym przez Ciebie formacie.
✅ Kod PlantUML
@startuml
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' Przejście samoistne
Dialing --> Connecting : validNumber
Dialing --> RecordedMessage : invalidNumber
Dialing --> Warning : timeout
Warning --> Timeout : timeout
Connecting --> Ringing : routed
Connecting --> BusyTone : numberBusy
Connecting --> FastBusyTone : trunkBusy
Ringing --> Connected : calledPhoneAnswers
Connected --> Disconnected : onHook
Connected --> Disconnected : calledPhoneHangsUp
Disconnected --> [*] : cleanup
state "Błąd" as ErrorState {
state "BusyTone" as BusyTone
state "FastBusyTone" as FastBusyTone
state "Wiadomość głosowa" as RecordedMessage
}
' Działania wewnętrzne
Idle : entry / Czekaj na odłożenie słuchawki
DialTone : entry / Odtwarzaj ton wybierania
Dialing : entry / Zbieraj cyfry
Connecting : entry / Przekieruj połączenie
Ringing : entry / Dzwoni na telefon zdalny
Connected : entry / Ustanów sesję połączenia
Disconnected : entry / Zakończ sesję
@enduml 📥 Jak używać: Wklej do PlantUML Live lub wtyczkę do Twojego IDE.
✅ Kod Mermaid

diagramStanu-v2
[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' Przejście samoistne
Dialing --> Connecting : validNumber
Dialing --> RecordedMessage : invalidNumber
Dialing --> Warning : timeout
Warning --> Timeout : timeout
Connecting --> Ringing : routed
Connecting --> BusyTone : numberBusy
Connecting --> FastBusyTone : trunkBusy
Ringing --> Connected : calledPhoneAnswers
Connected --> Disconnected : onHook
Connected --> Disconnected : calledPhoneHangsUp
Disconnected --> [*] : cleanup
stan Error {
BusyTone
FastBusyTone
RecordedMessage
}
Connecting --> BusyTone : numberBusy
Connecting --> FastBusyTone : trunkBusy
Dialing --> RecordedMessage : invalidNumber
notatka po prawej od BusyTone
Odtwarzaj standardowy sygnał zajętości
koniec notatki
notatka po prawej od FastBusyTone
Odtwarzaj szybki sygnał zajętości (zatłoczenie sieci)
koniec notatki
notatka po prawej od RecordedMessage
Odtwarzaj nagrany komunikat: "Numer nie jest dostępny."
koniec notatki
notatka po prawej od Timeout
Próba połączenia anulowana po 40 sekundach
koniec notatki
📥 Jak używać: Wklej do Edytor Mermaid w czasie rzeczywistym lub obsługiwanych narzędziach Markdown (VS Code, Obsidian itp.).
📚 Podsumowanie i ostatnie myśli
To System sterowania połączeniami telefonicznymi maszyna stanów jest przykład z rzeczywistego świata takim, jak UML może modelować skomplikowane, oparte na zdarzeniach systemy z wysoką niezawodnością.
✅ Co czyni ten diagram skutecznym:
- Jasna ścieżka głównego przebiegu z logicznym przebiegiem.
- Kompleksowe obsługa błędów.
- Użycie przejść samoistnych, stanów złożonych, i warunki.
- Jasność wizualna dzięki grupowanie i adnotacja.
🛠️ Kiedy stosować ten wzorzec:
- Systemy telefoniczne
- Sterowanie urządzeniami IoT
- Zarządzanie sesjami użytkownika
- Silniki przepływu pracy
- Systemy wbudowane z logiką skończonego stanu
📝 Chcesz rozszerzyć to?
Rozważ dodanie:
- Nagrywanie połączeń stan (z
startRecording,stopRecordingzdarzenia) - Przekierowanie połączeń logika (warunkowe routowanie)
- Oczekiwanie na połączenie obsługę (stanów równoległych)
- Przekazanie połączenia jako podstanu
Połączony - Historia stanów (historia głęboka/powierzchowna) do ponownego wejścia po przerwaniu
📌 Ostateczna rekomendacja
Zawsze modeluj zarówno ścieżki sukcesu, jak i porażki.
Maszyna stanów, która obsługuje tylko „szczęśliwe ścieżki”, jest niepełna i podatna na błędy w środowisku produkcyjnym.
Użyj tego przewodnika jako szablonu do modelowania dowolnego systemu czasu rzeczywistego, w którym przejścia stanów, zdarzenia, oraz odporność na błędy ma znaczenie.
✅ Gotowy na generowanie, wizualizację lub rozszerzenie?
👉 Skopiuj kod PlantUML lub Mermaid powyżej i zintegruj go z dokumentacją, diagramami architektury lub dokumentami projektu systemu.
Daj znać, jeśli chcesz wersję PDF, interaktywny diagram, lub integrację do większego modelu systemu (np. z komponentami lub diagramami sekwencji)!
📘 „Najlepsze systemy nie są tylko poprawne – przewidują awarie.”
— Projektowanie z użyciem maszyn stanów UML










