🎯 Przegląd
Ten przewodnik prowadzi Cię przez projektowanie i modelowanie systemu System sterowania połączeniami telefonicznymi przy użyciu Diagramy maszyny 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ę odbyć. |
✅ Porada: Użyj
zdarzenie [strzeżenie] / 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.
-
Do tej pory nie ma 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.
📌 To pierwsza widoczna zmiana stanu w cyklu połączenia.
🔹 Dzwonienie → Dialing (cyfra(n))
-
Zdarzenie:
cyfra(n)(użytkownik wprowadza cyfrę) -
Przejście:
cyfra(n) → Dialing -
Stan: Wejdź
Dialingtryb.
🔹 Przejście samoistne: 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: Zezwalaj 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ą wcześniej 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 timeout 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
-
🔄 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, zaloguj czas trwania połączenia, zaktualizuj statystyki.
✅ Stan końcowy oznacza koniec cyklu życia połączenia.
🎨 Zasady projektowania wizualnego dla przejrzystości
Aby uczynić złożone maszyny stanów czytelne i utrzymywalne:
| Zasada | Realizacja |
|---|---|
| Główna droga pozytywna | Utrzymaj główny przebieg (Nieaktywny → 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). |
| Podejmuj rozsądne decyzje dotyczące stanów pseudostanów | Początkowy i Ostateczny powinien być wyraźnie oznaczony. |
| Unikaj przecinających się przejść | Zachowaj niezakładanie się strzałek; w razie potrzeby użyj obszarów ortogonalnych. |
🔧 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
DialTonelubPustypo odpowiedzi użytkownika.
✅ Zalety:Zmniejsza zgiełk wizualny i poprawia skalowalność.
✅ Warunki zabezpieczające (opcjonalne ulepszenia)
Dodaj zabezpieczenia, aby doprecyzować przejścia:
cyfra(n) [number.length < 15] → Wybieranie
poprawnyNumer [number.isInternational] → Łączenie
🛠️ Zabezpieczenia 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 dla niepoprawnyNumer, przekroczonyLimitCzasu, 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 | Na przykład: „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 wybranym przez Ciebie formacie.
✅ Kod PlantUML
@startuml
[*] –> Pusta
Pusta –> SygnałDzwonienia : naLinię
SygnałDzwonienia –> Dzwonienie : cyfra(n)
Dzwonienie –> Dzwonienie : cyfra(n) ‘ Przejście samoistne
Dzwonienie –> Łączenie : poprawnyNumer
Dialing –> RecordedMessage : nieprawidlowyNumer
Dialing –> Warning : przekroczonyCzasOczekiwania
Warning –> Timeout : przekroczonyCzasOczekiwania
Connecting –> Ringing : przekierowano
Connecting –> BusyTone : numerZajety
Connecting –> FastBusyTone : trunekZajety
Ringing –> Connected : dzwoniacyOdbiera
Connected –> Disconnected : odlozono
Connected –> Disconnected : dzwoniacyOdlozyl
Disconnected –> [*] : czyszczenie
stan „Error” jako ErrorState {
stan „BusyTone” jako BusyTone
stan „FastBusyTone” jako FastBusyTone
stan „RecordedMessage” jako RecordedMessage
}
‘ Działania wewnętrzne
Idle : entry / Oczekiwanie na odłożenie
DialTone : entry / Odtwarzanie sygnału wybierania
Dialing : entry / Zbieranie cyfr
Connecting : entry / Przekierowanie połączenia
Ringing : entry / Dzwonienie do zdalnego telefonu
Connected : entry / Ustanowienie sesji połączenia
Disconnected : entry / Zakończenie sesji
@enduml
📥 Jak używać: Wklej do PlantUML Live lub wtyczki do Twojego IDE.
✅ Kod Mermaid

stateDiagram-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
state Error {
BusyTone
FastBusyTone
RecordedMessage
}
Connecting --> BusyTone : numberBusy
Connecting --> FastBusyTone : trunkBusy
Dialing --> RecordedMessage : invalidNumber
note right of BusyTone
Odtwarzaj standardowy sygnał zajętości
end note
note right of FastBusyTone
Odtwarzaj szybki sygnał zajętości (zatłoczenie sieci)
end note
note right of RecordedMessage
Odtwarzaj nagrany komunikat: "Numer nie jest dostępny."
end note
note right of Timeout
Próba połączenia anulowana po 40 sekundach
end note
📥 Jak używać: Wklej do Edytor Mermaid Live lub obsługiwanych narzędzi Markdown (VS Code, Obsidian itp.).
📚 Podsumowanie i ostatnie myśli
Ten System sterowania połączeniami telefonicznymi maszyna stanów jest przykład z rzeczywistego świata tego, jak UML może modelować złożone, oparte na zdarzeniach systemy o wysokiej 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, oraz warunków.
-
Jasność wizualna dzięki grupowaniu i adnotacjom.
🛠️ Kiedy stosować ten wzorzec:
-
Systemy telefoniczne
-
Sterowanie urządzeniami IoT
-
Zarządzanie sesjami użytkownika
-
Silniki przepływów pracy
-
Systemy wbudowane z logiką skończonego stanu
📝 Chcesz rozszerzyć to?
Rozważ dodanie:
-
Nagrywanie połączeń stan (z
startRecording,stopRecordingzdarzeniami) -
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, gdzie przejścia stanów, zdarzenia, i odporność na błędy ma znaczenie.
✅ Gotowy na generowanie, wizualizację lub rozszerzenie?
👉 Skopiuj PlantUML lub Mermaid kod 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












