مقدمه
شايد براي شما هم اين سؤال پيش آمده باشد كه چه تغيير مهمي در UML رخ داده است كه پس از UML 2.0، UML 1.5 عرضه شد؟ آيا اضافه شدن دياگرامهاي جديد (مثل Timing Diagram) يا بهبود دياگرامهاي موجود (مانند افزودن امكانات بيشتر به Sequence Diagram ) موجب اين ارتقاء قابل توجه شده است؟ حقيقت اين است كه آنچه كه موجب اين ارتقاء نسخه قابل توجه از 1 به 2 شده است، فراتر از اين جزئيات است. آنچه كه توليد مدلگرا (Model Driven Development) ناميده ميشود، كه بر پايه سطح تجرد بالاتر و استفادة بيشتري از توليد خودكار كد نسبت به روشهاي سنتي قرار دارد، اثر قابل توجه خود در بهبود كيفيت نرمافزار و بهرهوري توليد نشان داده است. از آنجاييكه نقش زبان مدلسازي براي موفقيت MDD بسيار مهم است، يك تجديد نظر عمده در زبان استاندارد UML انجام شده است كه منجر به عرضه UML 2.0 گرديده است. درعين حال كه چندين قابليت جديد مدلسازي اضافه شده است – مانند قابليت بيان دقيقتر معماري نرمافزار - خصوصيت غالب اين بازبيني عمده، زياد كرد دقچت قابليت تعريف زبان است كه سطح بالاتري از خودكارسازي را فراهم ميكند. در ادامه شرح خواهيم داد كه UML2.0 چگونه به اين موارد دست يافته است و ساير جنبههاي مهم آنرا نيز بيان خواهيم كرد. همانگونه كه ميدانيد UML بوسيله توليدكنندگان بزرگ ابزارهاي مدلسازي پذيرفته و پشتيباني ميشود، و بصورت يك بخش ضروري از دانش مهندسي نرمافزار درآمده است و در دانشگاهها نيز تدريس ميشود. همچنين نقش مهمي در مدلسازي نرمافزارهاي پيچيده ايفا ميكند. اما با وجود همه اين مزايا همچنان مقاومتهايي در برابر استفاده از UML وجود دارد. دلايل زيادي براي اين وضعيت وجود دارد، لكن يكي از مهمترين آنها اين است كه مدلهاي نرمافزار ممكن است در بعضي موارد بسيار نادقيق باشند و ارزش كاربردي هر مدلي با ميزان دقت و صحت آن تناسب مستقيم دارد. چنانچه شما نتوانيد به يك مدل از يك سيستم نرمافزار اعتماد كنيد، بدتر از حالتي است كه مدلي وجود نداشته باشد، زيرا ممكن است منجر به تصميمگيري غلط شما شود. بنابراين بهترين راهحل افزايش ارزش مدلهاي نرمافزاري كم كردن فاصلة ميان آنها و سيستمي است كه آنرا مدل كردهاند. جالب است بدانيد - همانطور كه در ادامه بيان خواهيم كرد- در مهندسي نرمافزار بيش از ساير رشتههاي مهندسي اين كاهش فاصله امكانپذير است.
Model-Driven Development
راهحل اين معما اتصال دقيق يك مدل به معادل پيادهسازي نرمافزاري آن با استفاده از يك يا چند تبديل مدل خودكار است. شايد بهترين مثال يك كامپايلر باشد، كه يك برنامه كه به زبان سطح بالا نوشته شده است را به متناظر سطح ماشين آن برنامه تبديل ميكند. مدل، در اين حالت، نقش آن زبان سطح بالا را ايفا ميكند كه جزئيات غير ضروري را نمايش ميدهد. جالب است توجه كنيد در هيچ يك از رشتههاي مهندسي ديگر نميتوانند اين ارتباط قوي بين مدل و فرآوردة مهندسي آن ايجاد كنند. زيرا فرآوردهاي كه شما آنرا مدل ميكنيد نرمافزار است و نه سختافزار. يك مدل از هر نوع از فرآوردههاي فيزيكي (بعنوان مثال، يك اتومبيل، ساختمان، پل و موارد ديگر) هنگام مدلكردن نياز به يكسري حذف جزئيات و مجردسازي است كه بصورت غير دقيق انجام ميشود و هنگام ساخت يك فرآورده مهندسي از روي مدل مجرد نيز لازم است يك سري تبديلهاي غير دقيق انجام شود. ماهيت اين تبديلها به دليل عدم دقتي كه دارند ممكن است مدلها را به يك موجوديت ناكارا يا حتي مزاحم تبديل كنند. حال آنكه در نرمافزار اين تبديلها، بطور كلي، ميتوانند بصورت كاملا دقيق و قاعدهمند انجام شوند. پتانسيلي كه در وراي اين تركيب قدرتمند تجرد و خودكارسازي وجود دارد منجر به ظهور تكنولوژي مدلسازي جديدي به همراه روشهاي توليد متناظر با آن شده است كه با عنوان توليد مدلگر (model-driven development) شناخته ميشود. ويژگي اصلي MDD اين است كه مدلها به فرآوردة اصلي طراحي نرمافزار بدل گشتهاند، كه منجر به انتقال تمركز بيشتر از كد برنامه به مدل ميشود. با دقيقتر شدن مدلها (كه UML 2.0 اين قابليت را فراهم ميآورد) سطح خودكارسازي توليد كد از روي مدل افزايش پيدا ميكند و مزاياي MDD بيشتر نمايان ميشوند. لازم به ذكر است كه پيش از اين هم در عمل MDD مورد استفاده قرار گرفته است، لكن در حال حاضر به دليل رشد و افزايش قابليت تكنيكها و استانداردها (مانند UML 2) اين امكان بيشتر فراهم شده است و MDD بيشتر مورد توجه قرار گرفته است.
اهمِ موارد جديد در UML 2.0
توسعههاي جديدي كه در UML 2.0 انجام شده است را ميتوان در اين پنج دسته عمده گروهبندي كرد كه در ادامه به ترتيب اهميت بيان شدهاند.
افزايش قابل توجه ميزان دقت در تعاريف زبان
كه نتيجه نياز به پشتيباني از خودكارسازي سطح بالاتري است كه براي MDD لازم است. لازمة خود كارسازي رفع ابهام و عدم دقت از مدلها (و در نتيجه از زبان مدلسازي) است تا برنامههاي كامپيوتر ي بتوانند مدلهاي را تبديل به كد كنند. يكي از اقداماتي كه به منظور كمينه كردن ابهامات و افزايش دقت مدل انجام شده است استفاده از metamodel است. اين مدل خصوصيات هر عنصر مدلسازي UML و ارتباط آن با ساير مفاهيم مدلسازي را تعريف ميكند. اين metamodel با استفاده از يك زيرمجموعه از عناصر UML - كه بيشتر مفاهيم Class Diagram هستند و اصطلاحا Meta-Object Facility (MOF) ناميده ميشوند - تعريف شده است و بوسيله يك مجموعه از محدوديتهاي رسمي كه به زبان Object Constraint Language (OCL) نوشته شده است پشتيباني ميشود. بطور خلاصه ميزان دقت تعاريف زبان UML 2.0 با روشهاي زير بطور قابل توجهي افزايش يافته است :
• يك سازماندهي مجدد عمده در فراساختار metamodel
• توصيفهاي معنايي توسعه يافته و دقيقتر
• يك چارچوب معنايي پويا و شفاف به منظور پركردن خلاءهايي كه در اين زمينه وجود داشت
شكل 1 - چارچوب معنايي UML 2.0
بهبود سازماندهي زبان
با پيمانهاي (Modular) كردن زبان، علاوه بر اينكه براي كاربران جديد امكان شناخت و استفاده سادهتر خواهد بود، همكاري ميان ابزارها را نيز تسهيل ميكند. در واقع معماري بهتري براي زبان ايجاد شده است. با توجه به افزايش دقت UML 2.0، تعاريف زبان بزرگتر شدهاند و در نتيجه چنانچه از همان ساختار و معماري UML 1 براي آن استفاده ميشد، فهم و استفاده از آن را بسيار مشكل ميساخت. به منظور مقابله با مشكل پيچيدگي زبان، UML 2.0 بصورت پيمانهاي درآمده است تا امكان استفادة انتخابي از پيمانههاي زبان فراهم شود. شكل كلي اين ساختار در شكل 2 نمايش داده شده است. همانطور كه مشاهده ميشود از يك پايه كه شامل عناصر به اشتراك گذاشته شده است (مانند كلاسها و روابط association)، كه بر روي آن مجموعهاي از زير-زبانها يا عناصر زبان وجود دارد. هر كدام از اين زير-زبانها براي مدلسازي يك قالب يا جنبة بخصوص مناسب هستند. اين عناصر در Error! Reference source not found. نمايش دادهشده اند. اين عناصر افقي زبان بطور معمول از يكديگر مستقل هستند و بنابراين شما ميتوانيد آنها را بصورت مستقل استفاده كنيد (برخلاف UML 1 كه بعنوان مثال activity diagram بطور كامل بر روي state diagram قرار گرفته بود).
شكل 2- معماري زبان UML 2.0
علاوهبر اين عناصر افقي زبان بصورت سلسلهمراتبي در سه سطح سازماندهي شدهاند كه سطح بالاتر قابليتهاي بيشتري نسبت به سطح پايينتر دارد. به اين ترتيب زبان از يك بعد ديگر نيز پيمانهاي است و شما را قادر ميسازد كه حتي در يك واحد زبان هم يك زيرمجموعة بخصوص را انتخاب كنيد. اين ساختار معماري زبان شما را قادر ميسازد كه تنها يك زير مجموعه از UML را بياموزيد و بكار ببريد كه مناسب كار شما است و به مرور زمان و كسب تجارب بيشتر ميتوانيد با عناصر قدرتمندتر زبان آشنا شويد و در هنگام نياز از آنها استفاده كنيد.
جدول 1- عناصر زبان UML 2.0
Purpose | Language Unit |
(Foundation) modeling of fine-grained actions | Actions |
Data and control flow behavior modeling | Activities |
(Foundation) modeling of basic structures | Classes |
Complex structure modeling for componenttechnologies | Components |
Deployment modeling | Deployments |
(Foundation) common behavioral semantic base and timemodeling | General Behaviors |
Abstract data flow modeling | Information Flows |
Inter-object behavior modeling | Interactions |
Model organization | Models |
Language customization | Profiles |
Event-driven behavior modeling | State Machines |
Complex structure modeling | Structures |
Pattern modeling | Templates |
Informal behavioral requirements modeling | Use Cases |
بهبود قابل توجه در توانايي براي مدل كردن سيستمهاي نرمافزاري بزرگ
برخي از نرمافزارهاي كاربردي مدرن تجميع برنامههاي كاربردي مستقل را در قالب سيستمي از سيستمها نمايان ميسازند و اين روندي است ادامه دار كه منجر به پيچيدهتر شدن سيستمها خواهد شد. براي پشتيباني از چنين روندهايي، قابليتهاي جديد انعطافپذيرِ سلسلهمراتبي به زبان اضافه شده است تا از مدلسازي نرمافزار در سطوح دلخواه پيچيدگي پشتيباني كند. بطور كلي تعداد قابليتهاي جديد اضافه شده به UML 2.0 كم است تا از بزرگ شدن زياد زبان جلوگيري شود و بخش عمدهاي از اين قابليتهاي جديد مدلسازي، گسترشي بر استفاده از قابليتهاي جديد است كه به شما امكان مدلسازي سيستمهاي نرمافزاري بزرگ را ميدهد. علاوهبراين، اين گسترشها با استفاده از يك راهكار پايهاي يكسان بدست آمدهاند : استفادة بازگشتي از مجموعة يكساني از مفاهيم در سطوح مختلف تجرد. بدين معني كه شما ميتوانيد عناصر مدلسازي مربوط به يك گونه بخصوص را با يكديگر تركيب كنيد تا واحدهايي ايجاد شود كه بعنوان بلوكهاي سازنده در سطح بعدي تجرد مورد استفاده قرار گيرند. اين وضعيت قابل مقايسه با روشي است كه در برنامهنويسي procedure ها ميتوانند تا چندين سطح در داخل يكديگر فراخواني شوند(Nested Procedure Call). بطور مشخص، قابليتهاي مدلسازي زير بدين روش توسعه يافتهاند :
• ساختارهاي پيچيده (Complex Structures)
• فعاليتها (Activities)
• تعاملها (Interactions)
• ماشينهاي حالت (State machines)
سه تاي اول از ليست بالا 90% قابليتهاي جديد UML 2.0 را شكل ميدهند.
ساختارهاي پيچيده (Complex Structures)
به اين منظور عناصر پايهاي ساختاري كه part ناميده ميشوند ممكن است يك يا چند درگاه (port) داشته باشند كه با استفاده از كانالهاي ارتباطي كه اتصالدهنده (connector) ناميده ميشوند (همانگونه كه درشكل 3 نمايش داده شده است) به يكديگر متصل شدهاند. اين ساختار تجمعي ميتواند در داخل عناصر سطح بالاتر كپسوله شود كه port هاي خود را دارند و ميتوانند با عناصر سطحبالاتري متصل شوند و به همين ترتيب عناصر سطح بالاتري ميتوانند ساخته شوند.
شكل 3- مفاهيم مدلسازي ساختارهاي پيچيده
فعاليتها (Avtivities)
Activity ها در UML براي مدلكردن انواع مختلفي از جريان مورد استفاده قرار ميگيرد : جريان signal يا data، و نيز جريانهاي algorithmic يا procedural. در UML 1 يك محدوديت عمده براي Activity ها وجود داشت و آن هم اين بود كه آنها بر پايه ماشين حالت قرار گرفته بودند و بنابراين در حوزة معنايي ماشينهاي حالت محدود شده بودند. در UML 2.0 پاية ماشين حالت با يك چارچوب معنايي عمومي ديگر كه تمام اين محدوديتها را حذف كرده است جايگزين شده است. (در واقع، پاية معنايي با استفاده از petri net colored هاي عموميشده جايگزين شده است). علاوه بر اين از برخي استانداردهاي صنعتي براي مدلسازي فرآيندهاي كسب و كار مانند BPEL4WS الهام گرفته است.
تعاملها (Interactions)
تعاملهاي ميان اشياء در UML 1 يا با استفاده از collaboration diagram و يا با استفاده از sequence diagram نمايش داده ميشدند. لكن متأسفانه دو قابليت اساسي جا افتاده بودند :
1. امكان استفادة مجدد از تواليها كه ممكن بود در متن دنبالههاي ديگر تكرار شوند. بعنوان مثال، يك دنباله كه هويتشناسي كاربر را انجام ميدهد ممكن است در چندين جاي مختلف يك برنامة كاربردي رخ دهد. بدون امكان بستهبندي اين دنبالههاي تكرار شونده در عناصر جداگانه، لازم بود كه آنها را چندين مرتبه بيان كنيد كه علاوه بر افزودن سربار اضافي، نگهداري مدل را نيز مشكلتر ميكرد.
2. امكانات كافي براي مدلكردن جريانهاي پيچيده مختلف كه در بازنمايي تعاملات سيستمهاي پيچيده رايج هستند. اين قابليتها شامل تكراركردن يك زيردنباله، مسيرهاي اجرايي آلترناتيو، اجراهاي همروند و مستقل از ترتيب، حلقه، شرط و موارد مشابه ميشود.
مهمترين نوآوري در اين زمينه معرفي تعاملها (Interaction) بصورت يك واحد مدلسازي جداگانه نامگذاري شده است كه امكان پارامتري كردن آنها نيز وجود دارد و بنابراين ميتوان هر سطح پيچيدگي دلخواهي از تعاملهاي ميان اشياء را در يك نمودار تعامل مدل كرد.
شكل 4 - مثالي از يك مدل تعاملي پيچيده
همانگونه كه در شكل 4 نشان داده شده است شما ميتوانيد اين تعاملات بستهبندي شده را در تعاملات سطح بالاتر بصورت بازگشتي فراخواني كنيد.
ماشينهاي حالت (State Machine)
مهمترين قابليتي كه ماشينهاي حالت در UML 2.0 اضافه شده است كاملا مشابه موارد قبلي است. ايدة اصلي اين است كه شما ميتوانيد يك ماشين حالت پيچيده را كاملا بصورت پيمانهاي مدل كنيد كه داراي نقاط مشخصي براي ورود و خروج است. به اين ترتيب شما ميتوانيد تجزيه داخلي يك ماشين حالت را بوسيله يك مجموعه از ماشينهاي حالت جداگانه و قابل استفاده انجام دهيد. به اين ترتيب توصيف يك الگوي رفتاري مشترك در چند حوزة مختلف به سادگي انجام ميپذيرد.
شكل 5- نمونهاي از نمودار حالت در UML 2.0
بهبود پشتيباني براي سفارشي سازي براي يك حوزه بخصوص
تجارب عملي استفاده از UML ارزش مكانيزمهاي توسعه (Extension) آنرا نمايان ساخته است. در UML 1.x فقط از مكانيزمهاي توسعة stereotype و profile استفاده ميشد، لكن در UML 2.0 مكانيزم توسعة جديد metamodel اضافه شده است كه امكانات توسعة سطح بالاتري را فراهم ميكند.
تقويت، تطابق با اصول، روشني و وضوح بيشتر براي مفاهيم مختلف مدلسازي
زبان سادهتر و سازگارتر شده است. اقدامات جديد شامل تقويت و تثبيت مفايهم و – در بعضي موارد – حذف مفاهيم تكراري، پالايش چندين تعريف و افزودن توضيحات متني و مثال بوده است.
منبع:www.smhoseyni.com
/س