بافنده جوانب

بافندهٔ جوانب (به انگلیسی: Aspect weaver) ابزاری برای زبان‌های جنبه گرا هست که وظیفه دارد جنبه‌ های برنامه را در ورودی بگیرد و کد نهایی را با استفاده از آنها تولید کند. بافنده با تلفیق جنبه‌ها و کلاس‌ها، ساختاری جدید به نام کلاس‌های بافته شده تولید می‌کند. استفاده این ابزار در مرحله پیش از کامپایل می‌باشد.

بافنده جوانب
در بالا دو کلاس و یک جنبه وجود دارند، که با بافته شدن در هم، در قسمت پیاده سازی تنها دو کلاس متمایز می‌ماند.
در بالا دو کلاس و یک جنبه وجود دارند، که با بافته شدن در هم، در قسمت پیاده سازی تنها دو کلاس متمایز می‌ماند.
در دسترس بهAspectC++, AspectJ
گونهAspect-oriented programming

دستورهای داده شده به بافنده‌ها صوابدید نام دارند. این صوابدیدها با استفاده از ترکیبی از نقاط پیوست تعریف می‌شوند که تعیین می‌کنند کدام توابع باید توسط کد جنبه‌ها تکمیل شود. شیوهٔ دقیق تکمیل این توابع به خود جوانب برمیگردد. با این کار بافنده‌ها ابزاری ارزشمند برای ارتقای پودمانی هستند.

انگیزه

زبان‌های متعدد جنبه گرا وجود دارد که شناخته شده باشند اما انگیزه کافی برای طراحی و ساخت زبان‌های جنبه گرای جدید به علل اقتصادی وجود ندارد. [۱] استفاده از تکنولوژی کاملاً متفاوت نیاز به این دارد که شرکت‌ها برنامه نویسان جدید استخدام کنند، زنجیره ابزار های متفاوتی برای توسعه تهیه کنند و همچنین کدهای قبلی خود را رها کنند که همگی خرج‌های زیادی دربردارد.[۲]

برای حل این معضلات در کنار داشتن برنامه‌نویسی جنبه گرا بافنده‌ها به ما این اجازه را می‌دهند که با اندکی تعمیم مانند AspectJ از زبان پرکاربردی مانند جاوا استفاده کنیم.[۳] بجای طراحی یک زبان کاملاً جدید، بافنده پسوندهای تعریف شده توسط AspectJ را تفسیر می‌کند و کد جاوا را «می بافد» تا بتواند توسط هر جاوا کامپایلری استفاده شود. این تضمین می‌کند که هر کد شی گرا موجود، یک کد معتبر جنبه گرا نیز باشد و توسعه مانند روال عادی توسعه شیء گرا انجام شود.[۴] مثالی دیگر از اینگونه تعمیمات زبان ++AspectC است که تعمیمی جنبه گرا برای زبان ++C می‌باشد.[۵]

پیاده‌سازی

همانطور که گفته شد، کار بافنده این است که با گرفتن دستورالعمل‌هایی از جنبه برنامه (همان صوابدید)، به صورت خودکار این دستورالعمل‌ها را در بین کلاس‌های موجود اعمال کند. در نتیجه کلاس‌هایی خواهیم داشت همنام کلاس‌های اصلی برنامه، اما با کدی متفاوت برای توابع. محل اضافه شدن این دستورالعمل‌ها توسط صوابدید تعیین می‌شود.[۶]

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

مثال

در کد AspectJ زیر، نقاط پیوست و کد کلاس شده جنبه، در قالبی شبیه کلاس جاوا پیاده شده‌اند. وظیفه بافنده این است که تنها یک کلاس در انتها تولید کند که جنبه تعریف شده را در خود اعمال کرده باشد.

مثال زده شده، قصد لاگ اندازی ورود به توابع را دارد. بدون وجود بافنده، برنامه‌نویس باید به صورت دستی تمام این لاگ‌ها را در توابع مورد نیاز قرار می‌داد، که مشخصا در یک برنامه‌ی واقعی امری به مراتب زمانگیر و کلافه‌کننده است. در هر تابع، با توجه به صوابدید کدی مختص آن تابع تولید می‌شود.

برای افزایش کارایی کد، می‌توان آن را مستقیماً تبدیل به bytecode کرد، در واقع بافنده در نقش کامپایلر نیز عمل می‌کند. اما کار بافنده در این حالت پیچیده‌تر و زمانگیرتر می‌شود طبق انتظار.

aspect Logging {
    pointcut method() : execution(* *(..));
    before() : method() {
        System.out.println("Entering " + 
            thisJoinPoint.getSignature().toString());
    }
}
public class C {
    public void first() {
        System.out.println("Executing C.first()");
    }
    public void second() {
        System.out.println("Executing C.second()");
    }
}

کد AspectJ بالا تبدیل به کد جاوای پایین می‌شود:

public class C {
    public void first() {
        System.out.println("Entering C.first()");
        System.out.println("Executing C.first()");
    }
    public void second() {
        System.out.println("Entering C.second()");
        System.out.println("Executing C.second()");
    }
}

کارایی

عملکرد زمان کامپایل با استفاده بافنده‌ها به دلیل کار اضافی لازم برای پیدا کردن توابع مطابق با نقاط پیوست، به طور کلی از کامپایلر های سنتی معادل آنها بدتر است. یک مطالعه نشان داد که کامپایلر ajc که برای زبان AspectJ هست، حدود ۳۴٪ کندتر از کامپایلر Java 1.3 و حدود ۶۲٪ کندتر از کامپایلر جاوا ۱.۴ است. [۷]

منابع

  1. Kiczales (October 2001), p.2
  2. Kiczales (October 2001), p.7
  3. Kiczales (October 2001), p.5
  4. Kiczales (June 2001), p.3
  5. Spinczyk (2002), p.1
  6. Wand (2004), p.1
  7. Hilsdale (2004), p.7
  • Avgustinov, Pavel; Hajiyev, Elnar; Ongkingco, Neil; de More, Oege; Sereni, Damien; Tibble, Julian; Verbaere, Mathieu (2007). Semantics of Static Pointcuts in AspectJ. Proceedings of the 34th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. ACM. pp. 11&ndash, 23. CiteSeerX 10.1.1.109.1796. doi:10.1145/1190216.1190221. ISBN 978-1-59593-575-5.
  • Colyer, Adrian; Clement, Andy; Bodkin, Ron; Hugunin, Jim (2003). Using AspectJ for Component Integration in Middleware (PDF). Companion of the 18th Annual ACM SIGPLAN Conference on Object-oriented Programming, Systems, Languages, and Applications. pp. 339&ndash, 344. doi:10.1145/949344.949440. ISBN 978-1-58113-751-4. Retrieved 23 January 2009.[پیوند مرده]
  • Gal, Andreas; Schröder-Preikschat, Wolfgang; Spinczyk, Olaf (2001). "On Minimal Overhead Operating Systems andAspect-Oriented Programming" (PDF). Proceedings of the 4th Workshop on Object-Orientation and Operating Systems at the 15th European Conference on Object-Oriented Programming (ECOOP-OOOSW). Retrieved 27 January 2010.
  • Hilsdale, Erik; Hugunin, Jim (2004). Advice Weaving in AspectJ (PDF). Proceedings of the 3rd International Conference on Aspect-oriented Software Development. ACM. pp. 24&ndash, 35. doi:10.1145/976270.976276. ISBN 978-1-58113-842-9. Archived from the original (PDF) on 27 July 2011. Retrieved 23 January 2009.
  • Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffrey; Griswold, William (October 2001). "Getting Started with AspectJ". Communications of the ACM. 44 (10): 59–65. CiteSeerX 10.1.1.147.2820. doi:10.1145/383845.383858.
  • Kiczales, Gregor; Hilsdale, Erik; Hugunin, Jim; Kersten, Mik; Palm, Jeffery; Griswold, William G. (June 2001). An Overview of AspectJ (PDF). Proceedings of the European Conference on Object-Oriented Programming. Lecture Notes in Computer Science. 2072. pp. 327&ndash, 354. doi:10.1007/3-540-45337-7_18. ISBN 978-3-540-42206-8. Archived from the original (PDF) on 2004-07-30. Retrieved 4 January 2010.
  • McEachen, Nathan; Alexander, Roger (2005). Distributing Classes with Woven Concerns – An Exploration of Potential Fault Scenarios. Proceedings of the 4th International Conference on Aspect-Oriented Software Development. ACM. pp. 192&ndash, 200. doi:10.1145/1052898.1052915. ISBN 978-1-59593-043-9.
  • Popovici, Andrei; Alonso, Gustavo; Gross, Thomas (2003). Just-In-Time Aspects: Efficient Dynamic Weaving for Java. Proceedings of the 2nd International Conference on Aspect-Oriented Software Development. ACM. pp. 100&nbsp, 109. doi:10.1145/643603.643614. ISBN 978-1-58113-660-9.
  • Sato, Yoshiki; Chiba, Shigeru; Tatsubori, Michiaki (September 2003). "A Selective, Just-In-Time Aspect Weaver" (PDF). Proceedings of the 2nd International Conference on Generative Programming and Component Engineering: 189&ndash, 208. Archived from the original (PDF) on 2010-09-24. Retrieved 4 January 2010.
  • Spinczyk, Olaf; Gal, Andreas; Schröder-Preikschat, Wolfgang (2002). "AspectC++: An Aspect-Oriented Extension to the C++ Programming Language" (PDF). Proceedings of the Fortieth International Conference on Tools Pacific. 21: 53&ndash, 60. Archived from the original (PDF) on 13 October 2009. Retrieved 4 January 2010.
  • Spinczyk, Olaf; Lohmann, Daniel (October 2007). "The design and implementation of AspectC++" (PDF). Knowledge-Based Systems. 20 (7): 636&ndash, 651. CiteSeerX 10.1.1.149.7119. doi:10.1016/j.knosys.2007.05.004. Retrieved 23 January 2010.
  • Viega, John; Voas, Jeffrey (November 2000). "Can Aspect-Oriented Programming lead to More Reliable Software?". IEEE Software. 17 (6): 19&ndash, 21. doi:10.1109/52.895163.
  • Wand, Michael; Kiczales, Gregor; Dutchyn, Christopher (2004). "A semantics for advice and dynamic join points in aspect-oriented programming" (PDF). ACM Transactions on Programming Languages and Systems. 26 (5): 890&ndash, 910. CiteSeerX 10.1.1.57.6581. doi:10.1145/1018203.1018208. Archived from the original (PDF) on 25 August 2011. Retrieved 23 January 2009.
  • Wang, Yi; Zhao, Jianjun (July 2007). Specifying Pointcuts in AspectJ (PDF). Proceedings of the 21st Annual International Computer Software and Applications Conference. 2. pp. 5&ndash, 10. CiteSeerX 10.1.1.547.6577. doi:10.1109/COMPSAC.2007.196. ISBN 978-0-7695-2870-0. Retrieved 23 January 2010.