Diagramy UML aplikacji wielowątkowych

25

W przypadku aplikacji jednowątkowych lubię korzystać ze schematów klas, aby uzyskać przegląd architektury tej aplikacji. Ten typ diagramu nie był jednak bardzo pomocny, gdy próbowano zrozumieć mocno wielowątkowe / współbieżne aplikacje, na przykład ponieważ różne instancje klasy „działały” w różnych wątkach (co oznacza, że ​​dostęp do instancji jest zapisywany tylko z jednej wątek, w którym żyje). W związku z tym powiązania między klasami niekoniecznie oznaczają, że mogę wywoływać metody na tych obiektach, ale zamiast tego muszę wywoływać to w wątku obiektu docelowego.

Większość literatury, którą odkopałem na ten temat, na przykład Projektowanie aplikacji współbieżnych, rozproszonych i czasu rzeczywistego za pomocą UML autorstwa Hassana Gomyi, miało kilka fajnych pomysłów, takich jak rysowanie granic wątków w diagramach obiektów, ale ogólnie wydawało się to zbyt akademickie i trudne do zrobienia być naprawdę przydatnym.

Nie chcę używać tych diagramów jako ogólnego widoku problematycznej domeny, ale raczej jako szczegółowy opis moich klas / obiektów, ich interakcji i ograniczeń wynikających z granic wątków, o których wspomniałem powyżej.

Chciałbym zatem wiedzieć:

  1. Jakie rodzaje diagramów są najbardziej pomocne w zrozumieniu aplikacji wielowątkowych?
  2. Czy są jakieś rozszerzenia klasycznego języka UML, które uwzględniają specyfikę wielowątkowych aplikacji, np. Za pomocą adnotacji ilustrujących
    • niektóre obiekty mogą żyć w pewnym wątku, podczas gdy inne nie mają powinowactwa do wątku;
    • niektóre pola obiektu mogą być odczytywane z dowolnego wątku, ale zapisywane tylko z jednego wątku;
    • niektóre metody są synchroniczne i zwracają wynik, podczas gdy inne są asynchroniczne, które powodują umieszczanie żądań w kolejce i zwracają wyniki, na przykład poprzez wywołanie zwrotne w innym wątku.
PersonalNexus
źródło
2
Osobiście uważam, że diagramy aktywności są przydatne do modelowania (pontentalnie) równoczesnych przypadków użycia / procesów, ale tak naprawdę nie są odpowiednie, jeśli chcesz zejść na poziom klasy / obiektu.
Péter Török

Odpowiedzi:

12

Najważniejszy wgląd w sposób wykonywania wątków można przedstawić za pomocą tak zwanego diagramu sekwencji . Oto przykład z wikipedii

wprowadź opis zdjęcia tutaj

Ten diagram zasadniczo rysuje listę zdarzeń wraz z kierunkiem nad pionową pojedynczą linią, często nazywaną liną ratunkową . W takim przypadku każdy wątek jest właścicielem własnej linii życia. Schemat umożliwia reprezentację wszystkich rodzajów zdarzeń, takich jak synchroniczne, asynchroniczne itp.

Inną najważniejszą rzeczą w takich systemach są wykresy stanów lub diagramy stanów. Zwykle ma to zastosowanie tylko wtedy, gdy model jest reprezentowany jako maszyna stanu. Jednak w większości systemów wielowątkowych (gdzie wątki nie są trywialne) najlepiej jest zaprojektować je do działania z izolowanymi algorytmami dla różnych stanów.

Istnieją inne typy diagramów, takie jak schemat interakcji i schemat komunikacji, ale myślę, że próba narysowania schematu sekwencji i diagramów stanu zapewni maksymalną jasność.

Dipan Mehta
źródło
6

Moja odpowiedź jest komplementarna do odpowiedzi Dipana , ponieważ obejmuje diagramy sekwencji UML. Odkryłem, że styl, który nie jest w 100% czysty UML, jest również OK. Spójrz na diagramy używane we wzorcach współbieżności . Niektóre są prawie podobne do UML (ale ten zdecydowanie nie jest standardem):

wprowadź opis zdjęcia tutaj

Jeśli znasz synchronizację wątków Java z oczekiwaniem / powiadomieniem, docenisz następujący schemat sekwencji z dokumentu, o którym wspomniałem:

wprowadź opis zdjęcia tutaj

Fuhrmanator
źródło
Dotyczy to również .NET / C #, a Visual Studio ma wbudowane narzędzie do schematu sekwencji UML, w tym typy fragmentów przepływu kontrolnego do opisania zachowań wielowątkowych. Zobacz msdn.microsoft.com/en-us/library/dd465153.aspx#Anchor_1
David Burg
0

W przypadku aplikacji wielowątkowych używających tej samej klasy sztuczką może być przeciągnięcie i upuszczenie tej samej klasy do każdego modelu reprezentującego wątek. Będziesz mógł mieć tę samą klasę z różnymi widokami i poruszać się po modelu i kodzie, klikając klasę, diagram lub kod. Wiem, że scalanie modeli nie jest dobrze znaną koncepcją, ale działa naprawdę dobrze w Eclipse z Omondo.

Mam na myśli to, że kiedy modeluję dużą aplikację, która składa się z więcej niż jednego projektu. Tworzę model dla każdego projektu, a następnie scalam je w większym projekcie. Całe modelowanie odbywa się za pomocą diagramów klas, czyli modelu, który otrzymałem podczas odwracania pełnego projektu z kodu Java do UML. Mam na myśli, że w moim przykładzie używam istniejącego kodu i przekształcam go w pojedynczy model UML, a następnie łączę cały ten kod zwrotny, który utworzył modele UML w jeden duży model. Możesz także utworzyć wiele modeli zamiast odwracać istniejący kod. Działa w obie strony - podczas tworzenia bez kodu lub na etapie inżynierii wstecznej z istniejącym kodem.

Nie wiem, czy to ma sens, ale może mógłbyś stworzyć jeden duży model, przegrupowując pod modele dla każdego wątku, tak jak robię to z modelowaniem wielu projektów? Mam nadzieję, że to pomoże.

UML_GURU
źródło