ضرورت استخراج جنبه
امروزه توسعهدهندگان براي بيان طرحي کاملاً پيمانهاي و مدل کپسولهسازی مشکل دارند. در واقع تکنيکهای برنامهنويسي شيگرا تمامي طراحيهای مهم مورد نياز در پيادهسازی برنامهها را تامين نميکنند. هم چنين بايد گفت که متدها نيز در بعضي از اوقات کارايي ندارند. به عنوان مثال، قصد داريد در برنامهنويسي شيگرا خطوطي از کد را در کلاسهای متعددي تکرار نماييد. بنابراين هر کلاس نياز به يک متد خواهد داشت که اين کد را درون کلاس پيادهسازی نمايد. با روش شیگرا قادر نخواهيد بود آن متد را در يک کلاس جداگانه پيادهسازی کنيد. اين فرآيند بيان کنندهی نياز به استخراج جنبهها است.
در شيگرايي، نرمافزار را از بعد وظيفهمندي به اجزاي کوچکتري تقسيم کرده و به بعد غيروظيفهمند به اندازهی بعد وظيفهمند بها داده نميشود. وجود بعد غيروظيفهمند در درون بعد وظيفهمند سبب میگردد تا موارد مرتبط با بعد وظيفهمندي، در قالب کپسولهسازی مستقل پديدار نگردند. درعوض، اجزايي از نرمافزار که مسئول پوشش وظيفهمندي سيستمها هستند پراکنده میشوند.
مفاهيمي که به خواستههای غيروظيفهمند مربوط میشوند، محيط اشيا را تشکيل میدهند. در صورتي که نرمافزار را با شيوهی شيگرايی به اجزاي کوچکتري تقسيم کنيد، مشکلات زير را در آن مشاهده خواهيد کرد:
• درهمريختگي کد برنامه: بدینمعني که يک کلاس، دربرگيرندهی چند مفهوم میباشد. مفاهيم مربوط به خود کلاس و مفاهيم مربوط به خواستههای غيروظيفهمندي که محيط کلاس را تشکيل میدهند. اين امر سبب پيچيدگي شده و نگهداري نرمافزار را مشکل مینمايد.
• پراکندگي مفاهيم در کد برنامه: به دليل آنکه مفاهيم مربوط به خواستههای غيروظيفهمند در قالب واحدهاي کپسولهسازی مجزا ظاهر نميشوند، از اين رو در کلاسهای مختلف پراکنده میگردند. اين پراکندگي سبب کاهش تحملپذيري کلاس در برابر تغييرات اين مفاهيم میشود. همچنين قابليت استفادهی مجدد کلاسها پايين میآيد.
با توجه به مشکلات ياد شده، بهتر است تغييراتي در نرمافزارهايي که قابليت استفادهی مجدد آنها بالا است اعمال گردد. بدينسان، قابليت پيکربندي اجزاي مختلف نرمافزار براي قرار گرفتن در محيطهای مختلف مهيا میگردد. علاوه براين، قابليت استفادهی مجدد به محيط اشيا و خواستههای غيروظيفهمندي نيز داده میشود.
روش جنبهگرا با تقسيمبندي بخشهای مختلف برنامه، پيچيدگي برنامه را کاهش میدهد. در واقع با کاهش پيچيدگي، طراحي، درک و هم چنين نگهداري سيستم نرمافزاري آسانتر خواهد شد. علاوه بر اين، برنامهنويسي جنبهگرا باعث توليد محصولاتي با بهرهوري بالا، کيفيت بهتر و اضافه کردن قابليتهای بيشتر میگردد.
مشکل ديگر در برنامههای شیگرا، وجود دغدغه است. دغدغه هدفي مشخص، مفهوم يا يک حوزهی کاري میباشد. يک سيستم نرمافزاري عادي داراي دغدغههای متعددي است. اين دغدغهها از لايهی مرکزي تا لايههای سيستمي یک برنامهی نرمافزاری ادامه دارند. براي نمونه، دغدغهی اصلي يک سيستم پردازش کارت اعتباري، پردازش پرداختها میباشد. اما دغدغههای سيستمي آن، ثبت وقايع، يکپارچه کردن تراکنشها، شناسايي کاربر، امنيت، کارآيي و غيره هستند. بسياري از اين دغدغهها به دغدغههای تداخلي معروف هستند که بر پيادهسازی پيمانههای مختلف برنامه تاثير میگذارند. شيوهی جنبهگرا مکانيزمهايي را در اختيار توسعهدهندگان قرار میدهد تا بتوانند کدهايي که بيانگر دغدغههای متداخل باشد را بنويسند.
در صورت استفاده از شيوههای برنامهنويسي کنوني، دغدغههای تداخلي روي تعداد زيادي از پيمانههای برنامه پخش شده و اثر میگذارند. به همين دليل طراحي و درک سيستم مورد نظر سختتر و هم چنين پيادهسازی آن پيچيدهتر خواهد شد. تغيير در چنين سيستمي دشوار است. برنامهنويسي جنبهگرا بهتر از روشهای متداول قبلي، دغدغهها را از پيمانههای سيستم جدا میکند. پس میتوان از تداخل دغدغهها جلوگيري نمود.
میتوان بطور خلاصه چنين نتيجهگيری نمود که هر جنبه، شاخص وظيفهاي خاص از وظايف يک سيستم است. به همين دليل جهت تشخيص وظايف، نياز به استخراج جنبهها از متن برنامههای شيگرا میباشد. استخراج جنبهها و تعيين حدود هر جنبه در داخل کد برنامهها موجب افزايش خوانايي و قابليت توسعه برنامه میگردد. مقولهی استفادهی مجدد معمولاً در قالب عمليات مطرح است و نه کلاسها. لذا، با استخراج و تعيين سرحد جنبهها امکان استفادهی مجدد از کد برنامهها افزايش میيابد.
/س
در شيگرايي، نرمافزار را از بعد وظيفهمندي به اجزاي کوچکتري تقسيم کرده و به بعد غيروظيفهمند به اندازهی بعد وظيفهمند بها داده نميشود. وجود بعد غيروظيفهمند در درون بعد وظيفهمند سبب میگردد تا موارد مرتبط با بعد وظيفهمندي، در قالب کپسولهسازی مستقل پديدار نگردند. درعوض، اجزايي از نرمافزار که مسئول پوشش وظيفهمندي سيستمها هستند پراکنده میشوند.
مفاهيمي که به خواستههای غيروظيفهمند مربوط میشوند، محيط اشيا را تشکيل میدهند. در صورتي که نرمافزار را با شيوهی شيگرايی به اجزاي کوچکتري تقسيم کنيد، مشکلات زير را در آن مشاهده خواهيد کرد:
• درهمريختگي کد برنامه: بدینمعني که يک کلاس، دربرگيرندهی چند مفهوم میباشد. مفاهيم مربوط به خود کلاس و مفاهيم مربوط به خواستههای غيروظيفهمندي که محيط کلاس را تشکيل میدهند. اين امر سبب پيچيدگي شده و نگهداري نرمافزار را مشکل مینمايد.
• پراکندگي مفاهيم در کد برنامه: به دليل آنکه مفاهيم مربوط به خواستههای غيروظيفهمند در قالب واحدهاي کپسولهسازی مجزا ظاهر نميشوند، از اين رو در کلاسهای مختلف پراکنده میگردند. اين پراکندگي سبب کاهش تحملپذيري کلاس در برابر تغييرات اين مفاهيم میشود. همچنين قابليت استفادهی مجدد کلاسها پايين میآيد.
با توجه به مشکلات ياد شده، بهتر است تغييراتي در نرمافزارهايي که قابليت استفادهی مجدد آنها بالا است اعمال گردد. بدينسان، قابليت پيکربندي اجزاي مختلف نرمافزار براي قرار گرفتن در محيطهای مختلف مهيا میگردد. علاوه براين، قابليت استفادهی مجدد به محيط اشيا و خواستههای غيروظيفهمندي نيز داده میشود.
روش جنبهگرا با تقسيمبندي بخشهای مختلف برنامه، پيچيدگي برنامه را کاهش میدهد. در واقع با کاهش پيچيدگي، طراحي، درک و هم چنين نگهداري سيستم نرمافزاري آسانتر خواهد شد. علاوه بر اين، برنامهنويسي جنبهگرا باعث توليد محصولاتي با بهرهوري بالا، کيفيت بهتر و اضافه کردن قابليتهای بيشتر میگردد.
مشکل ديگر در برنامههای شیگرا، وجود دغدغه است. دغدغه هدفي مشخص، مفهوم يا يک حوزهی کاري میباشد. يک سيستم نرمافزاري عادي داراي دغدغههای متعددي است. اين دغدغهها از لايهی مرکزي تا لايههای سيستمي یک برنامهی نرمافزاری ادامه دارند. براي نمونه، دغدغهی اصلي يک سيستم پردازش کارت اعتباري، پردازش پرداختها میباشد. اما دغدغههای سيستمي آن، ثبت وقايع، يکپارچه کردن تراکنشها، شناسايي کاربر، امنيت، کارآيي و غيره هستند. بسياري از اين دغدغهها به دغدغههای تداخلي معروف هستند که بر پيادهسازی پيمانههای مختلف برنامه تاثير میگذارند. شيوهی جنبهگرا مکانيزمهايي را در اختيار توسعهدهندگان قرار میدهد تا بتوانند کدهايي که بيانگر دغدغههای متداخل باشد را بنويسند.
در صورت استفاده از شيوههای برنامهنويسي کنوني، دغدغههای تداخلي روي تعداد زيادي از پيمانههای برنامه پخش شده و اثر میگذارند. به همين دليل طراحي و درک سيستم مورد نظر سختتر و هم چنين پيادهسازی آن پيچيدهتر خواهد شد. تغيير در چنين سيستمي دشوار است. برنامهنويسي جنبهگرا بهتر از روشهای متداول قبلي، دغدغهها را از پيمانههای سيستم جدا میکند. پس میتوان از تداخل دغدغهها جلوگيري نمود.
میتوان بطور خلاصه چنين نتيجهگيری نمود که هر جنبه، شاخص وظيفهاي خاص از وظايف يک سيستم است. به همين دليل جهت تشخيص وظايف، نياز به استخراج جنبهها از متن برنامههای شيگرا میباشد. استخراج جنبهها و تعيين حدود هر جنبه در داخل کد برنامهها موجب افزايش خوانايي و قابليت توسعه برنامه میگردد. مقولهی استفادهی مجدد معمولاً در قالب عمليات مطرح است و نه کلاسها. لذا، با استخراج و تعيين سرحد جنبهها امکان استفادهی مجدد از کد برنامهها افزايش میيابد.
منبع:
G. Kiczales, J. Lamping, A. Mendhekar, C. Maeda, C. V. Lopes, J. M. Loingtier and J. Irwin, “Aspect-Oriented Programming”, proceedings of the European Conference on Object-Oriented Programming (ECOOP), Finland, 1997.
E. Filman, T. Elrad, S. Clarke and M. Aksit, “Aspect-Oriented Software Development”, Addison Wesley Professional, 2004.
J. D. Gradecki and N. Lesiecki, “Mastering AspectJ - Aspect-Oriented Programming in Java”, Wiley Publishing, 2003.
N. Loughran and A. Rashid, “Mining Aspects”, Lancaster University, UK, 2002.
/س