การจะทำความเข้าใจ AOP นั้น หากจะทำให้ง่ายแล้ว ควรจะแบบเป็น 2 ระดับ นั่นคือ การเข้าใจว่า AOP คืออะไร และการเข้าใจว่า AOP ใช้อย่างไร
AOP คืออะไร? -- software developer issue
การเข้าใจตัว AOP นั้น ต้องรู้จักศัพท์ประมาณ 3 คำ นั่นคือ aspect, pointcut, advice ครับ ผมจะขออธิบายแบบเปรียบเทียบแล้วกัน สำหรับ class จะประกอบด้วย methods และ fields ใช่ไหมครับ? aspect ก็จะประกอบด้วย pointcuts และ advices ครับ
pointcut
- เป็นเหมือน regular expression (เพื่อความเข้าใจง่าย, แต่จริงๆถ้าบอกว่าเหมือนกับ XPath จะใกล้เคียงกว่า) เพื่อระบุว่า method ใดของ class ไหนบ้าง ที่อยู่ใน pointcut นี้
pointcut greeting() :
execution(* HelloWorld.sayHello(..));
- จากตัวอย่างข้างบน: pointcut ชื่อ greeting ซึ่งครอบคลุมทุก method ชื่อ sayHello ของ class HelloWorld ไม่ว่า return type กับ parameter จะเป็นอะไรก็ตาม
advice
- เปรียบได้กับ function ที่จะทำงาน ภายใต้ pointcut นั้นๆ จุดที่แตกต่างกับ method ของ class คือ แทนที่จะเป็น return type จะต้องระบุชนิดของ advice แทน (เช่น before, after เป็นต้น)
before() : greeting() {
System.out.println("Begin transaction");
}
- จากตัวอย่างข้างบน: advice นี้คืือก่อนเข้า pointcut ชื่อ greeting ให้ run code นี้ก่อน (อธิบายให้ละเอียดขึ้นได้ว่า ก่อนเข้าทุก method ที่ถูกครอบคลุมด้วย pointcut ที่ชื่อ greeting) หลังจากที่ได้รู้จัก aspect แล้ว คงพอจะเห็นภาพว่า การทำ aspect ขึ้นมานั้น ทำให้เรามีหน่วยใหม่ ที่ใช้ในการห่อ code นอกเหนือจาก class ที่เรามีกันอยู่แล้วใน OOP นอกจากนี้ เรายังมีวิธีการ re-use code วิธีใหม่ นอกจาก composition (การเรียก method ของ class อื่น) แต่เราสามารถสร้างเป็น advices เหล่านี้ขึ้นมาแทน (การสร้าง advices เหล่านี้ โดยให้มันสัมพันธ์กับ classes ที่เราสร้างขึ้นมา เรียกว่าการ weaving aspect กลับเข้าไปยัง classes เหล่านั้น)
ประโยชน์ของ AOP คืออะไร?
AOP เพิ่มความสามารถในการทำ level of abstraction และ composition เนื่องจากเรามี type ใหม่ในการจะห่อ code (นั่นคือ aspect) และวิธีใหม่ในการเชื่อมโยง code เข้าด้วยกัน (นั่นคือ weaving) และด้วยอิสระของการ weaving นี้ ทำให้เราสามารถเขึยน code ขึ้นมาภายใต้ advice แล้วจะเชื่อมไปยัง class ไหนตรงไหนก็ได้ทั้งนั้น
AOP ใช้อย่างไร -- software architect issue
มาถึงวิธีใช้ AOP สักที นะครับ จากที่กล่าวไว้ข้างต้นว่า การ weaving นั้น เราสามารถ weave aspects เข้าไปกับจุดไหนของ architecture ของระบบเราก็ได้ ทำให้เราสามารถเขียน domain model ของระบบโดยใช้ domain model ในการห่อ business logic code แล้วค่อยๆกลับมามอง domain model ในแต่ละมุมมองที่เราสนใจ (concern) เช่น security, robustness คราวนี้เราก็สามารถสร้าง aspects ที่เกี่ยวกับ concerns เหล่านั้น แล้ว weave กลับเข้าไปยัง domain model ของเราได้ครับ
cross-cutting concern คืออะไร?
ประเภทของ concern กลุ่มหนึ่ง ซึ่งถูกมองว่ามันกระจายตัวอยู่ทั่วๆไปในระบบ เช่น security เป็นต้น ซึ่ง code ประเภทนี้ ทุกๆ components ในระบบของเราต่างต้องจัดการกับมัน คราวนี้ เราจะจัดการกับมันอย่างไรดี?
before era of AOP: เราสามารถทำได้สองทาง คือ duplicate code (developers ร้องยี๊... :: ) และสร้าง service class เอาไว้เก็น common methods เหล่านี้ แล้วให้ทุกๆ components มาเรียกใช้เอา (sw. architects ร้องยี๊... :: )
after era of AOP: สร้าง aspects เรื่องนั้นๆขึ้นมาแล้ว weave กลับเข้าไปใน domain model (sw. architects & developers ยิ้ม :D )
cross-cutting concerns เป็นสิ่งที่มองออกได้ยาก และต้องอาศัยประสบการณ์ของ software architect ระดับหนึ่ง อย่างไรก็ดี มี cross-cutting concerns ที่เป็นที่รู้จักแพร่หลายอยู่บ้าง เช่น security, logging, transaction handling เป็นต้น
ไม่มีความคิดเห็น:
แสดงความคิดเห็น