Saturday, April 29, 2006

กลไกการสาน code ที่มีผลจากการใช้ IF pointcut

เราสามารถประกาศ pointcut แบบมีเงื่อนไขด้วย if(...) pointcut ใน Aspect J แต่ผลการทำงานของ pointcut ตัวนี้จะเป็นการทำงานขณะ runtime คือเงื่อนไขที่ระบุใน if(...) จะถูก bypass ขณะที่ weaver สาน code และจะนำเงื่อนไขดังกล่าวไปฝังไว้ใน advice เพื่อประมวลผลอีกทีโดยใช้ reflection ตอนโปรแกรมรันแล้ว



ผมคิดว่าเหตุผลก็คือ ผู้พัฒนา AspectJ ไม่มีทางรู้ล่วงหน้าว่าผู้ใช้ AspectJ จะประกาศเงื่อนไขพลิกแพลงขนาดไหน จึงใช้วิธีสร้าง if pointcut ที่ครอบคลุมการใช้งานได้ทุก ๆ กรณี



ในขณะที่บางงานที่ต้องการ code optimisation (อย่างเช่นงานที่ผมกำลังทำอยู่) ต้องการ code ที่ค่อนข้างรัดกุมและอยากจะเลี่ยงการประมวลผลด้วย reflection ให้ได้มากที่สุด ตัว if pointcut จึงกลายเป็นตัวปัญหา

Wednesday, April 12, 2006

AOP ในอุตสาหกรรม Java

AspectJ เป็นภาษาและคอมไพเลอร์ตัวแรกที่สนับสนุนแนวคิดของ AOP โดยขยายจากภาษา Java ปัจจุบัน AspectJ เป็น Technology Project อยู่ภายใต้ Eclipse.org ซึ่งมี AJDT ที่เป็น Eclipse plugin สำหรับสนับสนุนการใช้งานใน Eclipse


AJDT สนับสนุนการทำงานกับ AspectJ ใน Eclipse ได้เป็นอย่างดี ความสามาถใน AJDT มีดังต่อไปนี้

  • Syntax Hi-li

  • Weaving Info

  • Generation of AOP.XML

จุดเริ่มต้นของ aspect

AOP เป็นประเด็นขึ้นมาทันทีหลังจาก Kiczales และกลุ่มของเขาได้ตีพิมพ์บทความชื่อ Aspect-oriented programming ที่การประชุมทางวิชาการ ECOOP ในปี 1997 เอกสารชิ้นนี้จึงเป็นเอกสารที่เกี่ยวข้องกับการเปิดตัว AOP อย่างเป็นทางการชิ้นแรก

AOP: การโปรแกรมเชิงลักษณะ

ผู้พัฒนาซอฟต์แวร์ในประเทศเริ่มมีความรู้ความเข้าใจเกี่ยวกับ AOP หรือการโปรแกรมเชิงลักษณะมากขึ้น ผมคิดว่าน่าจะมี blog เสริมอีกซักตัวไว้เฉพาะสำหรับ AOP ที่เป็นภาษาไทย จึงเปิดตัวนี้เพิ่มครับ และจะทยอยนำเนื้อหาที่เกี่ยวข้องกับ AOP ทั้งย้อนหลังและที่กำลังจะออกมาใหม่มา blog ไว้ครับ



AOP คืออะไร
Aspect-oriented programming หรือ AOP หรือที่ผมเรียกเป็นภาษาไทยว่า การโปรแกรมเชิงลักษณะ นั้นเป็นแนวคิดที่สร้างขึ้นบนการโปรแกรมเชิงวัตถุหรือ OOP โดยมีจุดประสงค์หลักเพื่อแก้ปัญหาที่ยากหรือแก้ไม่ได้ด้วย OOP ในแง่ของ Separation of Concerns ซึ่ง concern ที่ว่าก็คือ croscutting concerns ที่ ตัดขวาง การไหลของโปรแกรม (flow of program) แนวคิดของ AOP คือการดึง code ทั้งหลายที่กระจายตัวในลักษณะ crosscut มารวบไว้ด้วยกันเป็นหน่วย เรียกว่า aspect โดยภายใน aspect จะประกอบไปด้วย pointcut ซึ่งเป็นประโยคอธิบายจุดนามธรรมที่เรียกว่า joinpoint abstraction สำหรับ joinpoint ก็คือ well-defined point ในการไหลของโปรแกรมอย่างเช่น constructor, method เป็นต้นครับ ในการประกาศ pointcut จะมีการโยง advice เข้ากันกับ pointcut นั้น ๆ เพื่อระบุว่า code ที่ต้องการจะสาน (weave) จะอยู่ในตำแหน่งใดของ joinpoint เช่น before, around, after เป็นต้น



ในปัจจุบันมีการใช้ AOP กันกว้างขวางขึ้นโดยเฉพาะในแวดวงของภาษา Java

เฟรมเวิร์คหลายชุดเช่น Spring, Hibernate, JBoss AOP หรือแม้แต่ EJB 3 ก็มีแนวคิดและความสามารถในลักษณะของ AOP แทบทั้งสิ้น