Sunday, June 18, 2006

Dojo.event.topic

ในการเขียน Reuse Component นั้น
หลักการที่สำคัญก็คือ Loosely Couple,
ให้มี dependency กับ Component อื่นๆให้น้อยที่สุด
ซึ่งใน java สามารถ implement ได้โดยใช้พวก
interface, IOC container, event bus, Listener Pattern, ...

แล้วใน javascript หล่ะ
ถ้าเรามี component ที่ต้องปฏิสัมพันธ์กัน
แต่เราก็อยากให้สัมพันธ์กันแบบ Anonymous, ต่างฝ่ายต่างไม่รู้จักกัน
เราจะ implement ด้วยวิธีไหน

package "dojo.event.topic" ของ Dojo
ช่วยให้เรา implement "Topic-Subscriber" pattern ได้

สมมติเรามี component
var componentA = {
update: function() {
// do some calculate
}
};

var componentB = {
refresh: function() {
// ...
}
};


ถ้าเราต้องการเชื่อมทั้งสองเข้าด้วยกัน
โดยเราอยากให้ componentB.refresh ทำงาน หลังจากที่ componentA.update ทำงาน
var componentA = {
update: function() {
// do some calculate
}
};
dojo.event.topic.registerPublisher("/foo", componentA, "update");

ส่วนฝั่ง B ก็เพิ่ม
var componentB = {
refresh: function() {
// ...
}
};
dojo.event.topic.subscribe("/foo", componentB, "refresh");


วิธี implement ภายในของ dojo ก็น่าสนใจทีเดียว
โดย feature topic จะ base อยู่บน do.event.connect
ซึ่ง base อยู่บนวิธีที่อิง concept จาก Aspect Oriented Programming
ลองดูตัวอย่าง code ของ Dojo ในส่วน JointPoint

dojo.event.MethodJoinPoint = function(obj, methname){
this.object = obj||dj_global;
this.methodname = methname;
this.methodfunc = this.object[methname];
this.before = [];
this.after = [];
this.around = [];
}

ใครที่เคยใช้ AOP ก็คงจะเริ่มเดาได้เลาๆ ว่า feature MethodJoinPoint ทำอะไรได้บ้าง

อ่านรายละเอียดเกี่ยวกับ dojo.event ได้ที่นี่

Related link from Roti

No comments: