UML-діаграми багатопотокових програм


25

Для однопотокових програм я люблю використовувати діаграми класів, щоб отримати огляд архітектури цього додатка. Цей тип діаграм, однак, не був дуже корисним при спробі зрозуміти сильно багатопотокові / одночасні програми, наприклад, тому що різні екземпляри класу "живуть" на різних потоках (тобто доступ до екземпляра зберігається лише від одного нитка, на якій вона живе). Отже, асоціації між класами не обов'язково означають, що я можу викликати методи на цих об'єктах, але замість цього мені потрібно здійснити цей виклик у потоці цільового об’єкта.

Більшість літератури, яку я розкопав на тему, наприклад, " Проектування одночасних, розповсюджених та додатків у режимі реального часу" з UML від Хассана Гомаа, мали деякі приємні ідеї, такі як нанесення меж потоків в діаграми об'єктів, але загалом здавалося, що це занадто академічно і багатослівно, щоб бути дуже корисним.

Я не хочу використовувати ці діаграми як вигляд високого рівня проблемної області, а як детальний опис моїх класів / об’єктів, їх взаємодії та обмежень через межі ниток, про які я згадував вище.

Тому я хотів би знати:

  1. Які типи діаграм вам виявилися найбільш корисними для розуміння багатопотокових програм?
  2. Чи є розширення до класичного UML, які враховують особливості багатопотокових програм, наприклад, через анотації, що ілюструють, що
    • деякі об'єкти можуть жити в певній потоці, тоді як інші не мають спорідненості до потоку;
    • деякі поля об’єкта можуть бути прочитані з будь-якого потоку, але записані лише з одного;
    • деякі методи є синхронними і повертають результат, а інші - асинхронні, що отримують запити в чергу і повертають результати, наприклад, через зворотний виклик в іншому потоці.

2
Я особисто знайшов діаграми діяльності корисними для моделювання (потенційно) одночасних випадків використання / процесів, але вони не дуже підходять, якщо ви хочете перейти на рівень класу / об'єкта.
Péter Török

Відповіді:


12

Найважливіше розуміння того, як відбувається виконання потоків, може бути зображене за допомогою діаграми послідовностей . Ось приклад із вікіпедії

введіть тут опис зображення

Ця діаграма по суті малює перелік подій разом із напрямком по вертикальній одиничній лінії, яку часто називають рятувальною лінією . У цьому випадку кожна нитка є власником власної життєвої лінії. Діаграма дозволяє представити всі типи подій, такі як синхронні, асинхронні тощо.

Інша найважливіша річ у таких системах - діаграми стану або діаграми стану. Зазвичай це стосується лише тоді, коли модель представлена ​​як стан машини. Однак у більшості багатопотокових систем (де потоки нетривіальні) найкраще, щоб вони були розроблені для функціонування з ізольованими алгоритмами для різних станів.

Є й інші типи діаграм, такі як діаграма взаємодії та діаграма зв'язку, але я думаю, що намагаючись скласти діаграму послідовностей та діаграми стану дасть максимальну чіткість.


6

Моя відповідь доповнює Діпана тим, що вона включає послідовні діаграми UML. Я виявив, що стиль, який не є на 100% чистим UML, також добре. Погляньте на діаграми, які використовуються у шаблонах валюти . Деякі з них майже схожі на UML (але це, безумовно, не є стандартним):

введіть тут опис зображення

Якщо ви знайомі з функцією очікування / сповіщення в синхронізації потоку Java, ви оціните наступну діаграму послідовностей із згаданого нами документа:

введіть тут опис зображення


Це також стосується .NET / C # і Visual Studio має вбудовану інструментальну схему послідовності UML, включаючи типи фрагментів потоку управління для опису багатопотокової поведінки. Дивіться msdn.microsoft.com/en-us/library/dd465153.aspx#Anchor_1
David Burg

0

Для багатопотокових програм, що використовують один і той же клас, фокусом може бути перетягування одного класу в кожну модель, що представляє собою потік. Ви могли б мати той самий клас із різними видами та орієнтуватися в моделі та коді, натискаючи на клас, діаграму чи код. Я знаю, що злиття моделі - це не дуже відома концепція, але вона справді добре працює в межах Eclipse з Omondo.

Я маю на увазі, що коли я моделюю велику програму, яка складається з більш ніж одного проекту. Я створюю модель для кожного проекту, а потім об'єдную їх у більший проект. Все моделювання проводиться за допомогою діаграм класів, що є моделлю, яку я отримав при перетворенні повного проекту з коду Java на UML. Я маю на увазі, що в своєму прикладі я використовую існуючий код і перетворюю його в єдину модель UML, а потім зливаю весь цей зворотний код, який створив моделі UML, в одну велику модель. Ви також можете створити кілька моделей, а не обернути наявний код. Це працює обома способами - при створенні без коду або на етапі зворотного проектування з існуючим кодом.

Я не знаю, чи є сенс, але ви могли б створити одну велику модель, перегрупуючи підмоделі для кожного потоку, як, що я роблю при моделюванні багатопроектів? Сподіваюся, що це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.