اکتیویتی دیاگرام Actvity Diagram چیست؟
همانطور که در مقاله یوزکیس دیاگرام Usecase Diagram دیدید، یوزکیس ها به شما میگویند که نرم افزار قرار است چه کاری قرار انجام دهد ولی اکتیویتی دیاگرام Activity Diagram به شما خواهند گفت که این کارهای باید چگونه انجام شوند تا نیازمندی های نرم افزار برآورده شود. در نمودار اکتیویتی قرار است بصورت سطح بالا مشخص شود که چه فعالیتهایی باید انجام شود تا هر کدام از این کارها و usecase ها انجام شوند.در این دیاگرام مراحل و step ها و زنجیره انجام کارهای مشخص خواهند شد.
میتوانیم اکتیویتی دیاگرام را به عنوان مدلسازی بیزینس و لاجیک Business Logic Modeling دانست. بیزینس مدل زنجیره ای فعالیت ها و Task ها است که با هم منجر به یک کاری خواهند شد. بعضی از نرم افزارهای مدلسازی پراسس های تجاری Business Proccess Management Tools یا به اختصار BPM ها ابزاری را برای شما فراهم میسازند که فرآیند تجاری هر بخشی از کسب و کار خود را مدلسازی و ترسیم کنید.
اکتیویتی دیاگرام تنها نموداری است که در معماری نرم افزار در بخش Process Architecture ترسیم خواهد شد. قواعد و Syntax هایی که در اکتیویتی دیاگرام استفاده می شوند بسیار ساده و مانند فلوچارت هستند و notation های خیلی قابل فهمی برای عمومی دارند و به همین دلیل این نمودار بهترین دیاگرام برای ارائه به ذینفعان سطح بالای نرم افزار مانند هست مدیره و Board Member ها هستند. در اکتیویتی دیاگرام شما قرار است مراحلی که برای انجام هر یوزکیس لازم است را مدلسازی کنید.
شروع هر نمودار اکتیویتی یک دایره توپر هست که بهش Initial Node گفته میشه و سپس با فلش هایی روبه پایین حرکت میکنیم که این فلش ها رو Edge یا Path میگیم و یه سری باکس های مستطیلی که بهشون Action گفته میشه هم برای نشون دادن کاری هست که در هر قدم باید انجام بشه. علامت لوزی یعنی تصمیم گیری و Desecion که نشون میده که این فلو بعد از این نقطه دو حالت براش ممکنه پیش بیاد. مثلا یا کاربر لاگین هست و یا کاربر لاگین نیست و یه لوزی دیگه هم داریم که فلش ها بهش وارد میشن، یعنی چند تا حالت مختلف به یه لوزی وارد میشن و این یعنی از این مرحله به بعد فلوهاشون یکی میشه ولی در اولی فلش ها از لوزی خارج میشدند. به حالت دومی Merge میگیم و در نهایت Final Node رو دایم که یه دایره توپر هست که دورش یه دایره گرد داره.
به فلش های ورودی به یک نود Incoming Edge و به خروجی Outcoming Edge گفته میشه.Action ها قدم های فعال در یک Process هستند و هر اکشنی میتونه یه چیز محاسباتی یا منطقی باشه، مثلا محاسبه مالیات یا بررسی لاگین بودن و ... ضمنا میشه دور هر نمودار Activity یک باکس هم کشید که بهش میگن Activity Frame و اختیاری هست و معمولا نمیکشند و اگر در یک صفحه قرار شد بیش از یک نمودا اکتیویتی باشه اینکار میکنیم و داخل این اکتیویتی فریم هم اسم اکتیویتی رو Activity Name بصورت بولد مینویسیم.
در Outgoing Edge های هر Decssion روی edge ها باید داخل براکت شرطی که اتفاق افتاده رو بنویسیم وبه اینها Guard Condition میگیم و البته این خروی ها بصورت true-false هستند و فقط یکی از دو حالت ممکن را دارند. دقت کنید اگر بیش از دو تا guard condition داشته باشیم باید خیلی دقت کنیم که فقط یکی از همه اونها درست باشه
مفهوم Concurrency و یا Parallel در Activity Diagram

در مدلسازی uml و نمودار اکتیویتی گاهی بعضی کارها و اکشن ها میتوانند همزمان با هم انجام شوند و نیازی و ربطی به یکیدیگر ندارند و بصورت همزمان میتوانند انجام شوند که به اینها اکشن های concurrent و یا parallel میگیم. که در نمودار اکتیویتی نمایش اکشن های پارالل را با Fork و Join انجام میدیم که هر دو یک خط عمومی پررنک صاف هستند و فرقشان در این است که در fork که یک چنگال است یک edge وارد میشه و چند تا edge همزمان که موازی و همزمان میتونند اجرا بشن خارج میشوند. و در حالت join نیز چند تا edge وارد میشن و یکی خارج میشه.

یعنی بعد از هر Fork فلوی ما به چند تا فلوی همزمان میشکنه و بعد از هر join چند فلوی همزمان میشن یک فلو. نکته ای که هست اینه که درسته این فلوها بعد از join بصورت همزمان انجام میشن ولی قرار نیست لزوما با هم تموم بشوند.
زمان در Activity Diagram
در نمودار اکتیویتی بعضی مواقع زمان یک عامل در مدلسازی شما محسوب میشود. مثلا نیاز است بعضی جاها یک وقفه زمانی ایجاد شود . به عنوان مثال 3 روز بعد از اجرای فعالیت خاصی باید بک ارسال محصول اتفاق بیفتد یا اینکه مثلا هر 3 ماه یکبار باید بک آپ گیری اتفاق میفتد. علامت زمان در نمودار اکتیویتی بصورت ساعت شنی است که روش میزان زمان را مینویسیم مثلا wait 3 weeks نوشته می شود. اگر برای time ورودی خاصی وجود نداشته باشد این یعنی اکشن بعد آن بصورت recurring انجام و تکرار خواهد شد. مثلا هر 1 ثانیه یکبار.


استفاده از time بدون ورودی یکی از روش های شروع یک اکتیویتی دیاگرام است.
فراخوانی سایر اکتیویتی ها
وقتی ما جزییات بیشتری به activity diagram اضافه میکنیم کم کم نمودار ما بسیار طولانی و بزرگ میشود و یا اینکه یک سری از کارها در اکتیویتی در جاهای دیگر نیز ممکن است اتفاق بیفتند. در چنین شرایطی برای افزایش readability میتوانیم این بخش جزییات یا تکراری را در یک دیاگرام دیگر ایجاد کنیم و در این دیاگرام اصلی فراخوانی کنیم و کمک کنیم دیاگرام اصلی ما مرتب تر باشد.

همانطور که در شکل بالا میبینید اکشن prepare Motherboard با علامت چنگک نشون میده که این خودش یک اکتیویتی دیاگرام جدا هست که اینجا include شده. خود اون اکتیویتی مجزا دقیقا نقطه شروع و پایان خواهد داشت
آبجکت ها Objects در نمودار اکتیویتی دیاگرام
بسیاری جاها در نمودار اکتیویتی ما نیاز داریم که برای انجام یک کاری دسترسی به یه اطلاعاتی داشته باشیم . مثلا برای بررسی سوابق مشتری نیاز داریم اطلاعات مشتری را داشته باشیم. این حالت را دیتا آبجکت میگوییم. این آبجکت ها قرار نیست فقط دسترسی به دیتا یا یک چیز نرم افزاری باشند، بعضی وقتها آبجکت ها میتوانند حتی یک کار فیزیکی باشند که باید با دست انجام شود.آبجکت یعنی در اون node این موضوع فراهم است. این دیتا فراهم است یا اینکار فیزیکی فراهم است و ...
آبجکت ها را با مستطیل با گوشه های 90 درجه نشون میدیم. یک روش بهتر برای نشان دادن آبجکت ها استفاده از پین است. یعنی یک مربع کوچک که به ابتدا یا انتهای یک Action ای چسبیده است.

دریافت و ارسال Signal ها در Activity Diagram
اکتیویتی ها ممکن است با سایر موجودیت های بیرونی مثل کاربران، افراد،سرویس ها، سیستم ها، وب سرویس ها و ... بیرونی در ارتباط باشند تا بتوانند کاری را انجام دهند. در نمودار اکتیویتی Signal ها برای ارتباط سیستم با اجزای بیرونی استفاده میشود. سیگنال های message هایی هستند که میتوانند ارسال یا دریافت شوند.مثل ارسال request به یک سرویس بیرونی، دریافت کلیک کاربر و یا ارسال یک نوتیفیکیشن به گوشی کاربر و ...

سیگنال دریافت Recieve Signal که از بیرون می آید باعث میشود که یکی از اکشن های اکتیویتی فعال شود و این اکشن پذیرنده سیگنال دقیقا میداند که با سیگنال قرار است چه کاری انجام دهد و قرار است سیگنال را چه زمانی دریافت کند. سیگنال ارسال Send Siagnal پیامی است که از طرف اکتیویتی ما به یک موجودیت بیرونی ارسال میشود. معمولا وقتی پذیرنده بیرونی ما یک سیگنال از اکتیویتی ما میگیرد response را به اکتیویتی ما میفرستد ولی ما این پاسخ را دیگر در دیاگراممان مدل نمیکنیم. دقت کنید که در نمودار اکتیویتی فرض این است که سیگنال ها Asynchronous هستند . یعنی بصورت همزمان و سریع انجام میشوند و وقفه ای در فرآیند اکتیوی ایجاد نخواهند کرد. یعنی اکتیویت وقتی سیگنال را ارسال کرد دیگه منتظر ریسپانسش نخواهد شد و به اکشن بعدی حرکت میکند.
اگر سیگنال دریافت را بدون ورودی شروع کنیم یعنی اینکه کل اکتیویتی ما برای شروع نیاز به یک سیگنال بیرونی است و نقطه شروعش همین است
شروع و پایان یک اکتیویتی
چندین راه برای شروع یک اکتیویتی وجود دارد که روتین تین و ساده ترینش همون نقطه شروع با دایره توپر است. .ولی راه های دیگه ای مانند سیگنال ورودی، تایم نیز هستند.

برای پایان در اکتیویتی ها یک حالت عمومی نقطه پایان اصلی و روتین هست ولی حالت های دیگه ای هم هست که یکی از فلوهای داخل امتیویتی تمام بشه بدون اینکه کل اکتیویتی تمام بشود که در این حالت از یک دایره و یک ضربدر کامل داخلش استفاده میکنیم و یا اینکه یک وقفه interrupt ای در اکتیویتی بخوایم ایجاد کنیم.
پارتیشن کردن یا swimline ها در نمودار اکتیویتی
برای اینکه در نمودار اکتیویتی نشون دهیم هر اکشنی مربوط به بخش خاصی یا کاربران خاصی یا رول خاصی است از سوییم لاین ها استفاده میکنیم و کل اکتیویتی دیاگرام را به چندین سویم لاین تقسیم میکنیم و اکشن های هر رول را در زیر اون بخش مینویسیم.یا اینکه میتوانیم بالای هر اکشن داخل پرانتز اسم گروه یا نقشی که قرار است این اکتیویتی را انجام دهد مشخص کنیم

اکتیویتی ها طولانی و شکستن سطر
بعضی وقتها اکتیویتی ها طولانی هستند و در یک سطر جا نمیشن و برای همین منظور مجبور هستیم سطر را بشکنیم. در این مواقع از کانکتورها Connectors استفاده میکنیم. روی کانکتور اسمشو که معمولا یک کاراکتر هست رو مینویسیم و اونجا سطرو میبندیم و در سطر بعدی با اسم همون کانکتور شروع میکنیم.