Kompletny przewodnik: Modelowanie systemu sterowania połączeniami telefonicznymi przy użyciu maszyny stanów UML

🎯 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 wieszakupoprawny 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ściSzybki ton zajętościZapisana 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łanie skł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ź Dialing tryb.

🔹 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 Wybieranie stanu.

💡 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ęcie po 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ęcie ponownie 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:

    1. Użytkownik kończy połączenie: na wisiorku → Rozłączony

    2. Druga strona kończy połączenie: calledPhoneHangsUp → Rozłączony

🔄 Oba przejścia prowadzą do Rozłączony przed osiągnięciem Stan 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 BusyToneFastBusyTone, 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 DialTone lub Pusty po 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 niepoprawnyNumerprzekroczonyLimitCzasuliniaZaję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ęprzekierowanowywołanyTelefonOdbiera zamiast e1e2.
Jasno nazwij stany Unikaj Stan1Stan2. Użyj DzwonienieDzwoniPołą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ść samoistnychstanó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 startRecordingstopRecording zdarzeniami)

  • 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ówzdarzenia, 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ę PDFinteraktywny 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