ยินดีต้อนรับ สู่ห้องทดลองโปรแกรมอย่างง่าย

KM4UTH (Knowledge Management for You - Thai : การจัดการความรู้สำหรับคุณ - ภาษาไทย)
วัตถุประสงค์ของบล็อกนี้ก็เพื่อ เป็นห้องทดลอง เก็บตัวอย่างโค้ดสั้น ๆ สำหรับงานง่าย ๆ เกี่ยวกับ การเขียนโปรแกรม การเขียนเว็ป โครงสร้างข้อมูล อัลกอริทึม ... สำหรับผู้เยี่ยมชมผ่านไปผ่านมาแถวนี้ หากมีคำแนะนำอะไร ฝากความคิดเห็นไว้ที่นี่ได้

การเขียนโปรแกรมแบบ AOP ด้วย AspectJ

Aspect-Oriented Programming หรือ AOP ใน AspectJ เป็นการเพิ่มเติมโครงสร้างภาษาใหม่ เข้าไปในภาษา java เพื่อให้สามารถเขียนโปรแกรมแบบ AOP ใน java ได้ โดยยังคงใช้ jvm ของ java อยู่ อย่างไรก็ตาม เป้าหมายหลักอยู่ที่ การสร้างแนวคิดใหม่ในการเขียนโปรแกรม โดยการแยกงานที่เป็นลักษณะเดียวกันไปไว้ด้วยกัน เรียกว่า aspect เพื่อให้การเขียนโปรแกรมในส่วนต่าง ๆ ไม่ต้องวุ่นวายกับเรื่องหลายเรื่อง ที่มีความเกี่ยวพันธ์กันน้อย ลักษณะธรรมชาติอย่างหนึ่งของ AspectJ ก็คือ การเขียนโปรแกรม java ตามปรกติ แต่เราสามารถแทรกการทำงานต่าง ๆ ลงไปในโปรแกรม java ของเรา โดยที่เราไม่ต้องไปแก้ไขโปรแกรม java เดิม AspectJ มีเครื่องมือให้โปรแกรมเมอร์ สามารถแทรกการทำงาน เข้าไปโปรแกรม java ได้ ซึ่งมีชื่อเรียกจุดที่จะแทรกการทำงานเข้าไปว่า join point ซึ่งมีได้หลายจุด เช่น จุดที่ประมวลผลฟังก์ชั่น (execution) จุดที่เรียกให้ฟังก์ชั่นประมวลผล (call) จุดที่เริ่มสร้าง object จุดที่เปลี่ยนค่าใน object จุดที่อ่านค่าใน object เป็นต้น ซึ่งโปรแกรมเมอร์ สามารถรวมเอาจุดเหล่านี้เข้าด้วยกัน แล้วเรียกเป็น pointcut เพื่อแทรกคำสั่งการทำงานเข้าไป และคำสั่งการทำงานที่แทรกเข้าไปเรียกว่า advice ตัวอย่างของโปรแกรมก็เช่น

// Human.java เป็นโปรแกรม java ปรกติ -----------------------------------
public class Human {
private String name;

public Human(String name) { // เกิด
this.name = name;
System.out.println(name + " is born.");
}
public void wakeup() { // ตื่น
System.out.println(name + " wake up.");
}
public void sleep() { // นอน
System.out.println(name + " sleep.");
}
public void buyFood(double baht) { // ซื้ออาหาร
System.out.println(name + " buy food " + baht);
}
public void buyDrink(double baht) { // ซื้อน้ำ
System.out.println(name + " buy drink " + baht);
}
public void payBill(double baht, String bill) { // จ่ายเงินค่า ...
System.out.println(name + " pay " + bill + " " + baht);
}

public static void main(String[] args) {
Human man = new Human("Addam");
man.wakeup();
Human woman = new Human("Eve");
man.buyFood(30.0);
woman.wakeup();
man.buyDrink(10.0);
man.payBill(200.0, "phone bill");
woman.buyFood(40.0);
man.sleep();
woman.sleep();
}
}

// HumanAspect.java เป็นส่วนที่ทำ aspect -----------------------------
public aspect HumanAspect {

// pointcut ตอนเกิด = สร้าง Human ขึ้น = constructor Human(String) ทำงาน
pointcut birth() : initialization(Human.new(String));
// หลังจาก pointcut ตอนเกิด = หลังจาก สร้าง Human ขึ้น ให้ทำ ...
after(): birth() {
System.out.println("--> Hello World");
}

// pointcut ตอนเช้า = ตื่นนอน = Human.wakeup() ทำงาน
pointcut morning() : call(public void Human.wakeup());
// หลังจาก pointcut ตอนเช้า = หลังจาก ตื่นนอน ให้ทำ ...
after() : morning() {
System.out.println("--> Good Morning");
}

// pointcut ตอนกลางคืน = เข้านอน = Human.sleep() ทำงาน
pointcut night() : call(public void Human.sleep());
// ก่อน pointcut ตอนกลางคืน = ก่อน เข้านอน ให้ทำ ...
before() : night() {
System.out.println("--> Good Night");
}

// pointcut ซื้อของ = ซื้อ ... = Human.buy*(double) ทำงาน
// => buy*(double) หมายถึง function ที่ขึ้นต้นด้วย buy และรับ parameter เป็น double
pointcut buy() : call(public void Human.buy*(double));
// ก่อน pointcut ซื้อของ = ก่อน ซื้อ ... ให้ทำ ...
before() : buy() {
System.out.println("--> Buy Something");
}
}

No comments: