Observer

ช่วงนี้ตอบคำถามเกี่ยวกับเรื่องนี้บ่อยเอามาเขียนซะเลย เริ่มจาก misui บ่นๆ มาว่าทำยังไงให้ Tree ในจาวาเปลี่ยนแปลงข้อมูลในตารางเมื่อข้อมูลจริงมันเปลี่ยนไป โดยก็บอกว่าตอนนี้ทำไว้เป็นลูปวนไปเรื่อยๆ ฟังปุ๊บก็เอะใจทันที เอ๊ะ Tree ในจาวามันมี Event Listener นี่หว่าก็เลยบอกไปว่าดูฟังก์ชั่นพวกนั้นซะ แล้วก็เล่าไปนิดหน่อยว่ามันไว้ทำไรบ้าง มาวันนี้เจออีกกรณี แต่รูปแบบคนละเรื่องเลยคือ MSN Library ที่ใช้อยู่เวลามันทำอะไรมันจะทำอยู่อีกเธรดเกิดเหตุการณ์อะไรขึ้นก็ค่อยเรียกฟังก์ชั่นที่ลงทะเบียนไว้ คราวนี้มันเกิดเหตุการณ์นั้นจริงแต่ว่ามันไม่สามารถส่งข้อความไปบอกไอ้คนที่ต้องใช้มันได้ ก็เลยต้องหาอะไรมารับมันอีกต่อ แล้วก็ให้คนที่ต้องการมาคอยฟังซะ(แต่จริงๆ มันไม่ใช่อย่างนี้หรอก ไอ้คนฟังมันดันอยู่ชั้นบนๆ เป็นตัวติดต่อเว็บ แต่ไอ้คนไปติดต่อ MSN มันดันวิ่งๆ อยู่ด้านล่าง พอเจอปัญหาจะวิ่งไปบอกชั้นบนเลยลำบาก)
อ่ะเล่าถึงกรณีตัวอย่างไปซะเยอะ แต่ไม่เห็นเขียนถึงคำว่า Observer เลย จริงๆแล้วมันก็คือตัวเดียวกับ Event Listener นั่นแหละ หน้าที่ของมันนั้นก็แสนง่ายเมื่อมีเหตุการณ์อะไรขึ้นก็คอยบอกให้ทุกคนที่เกี่ยวข้องรับรู้นั่นเอง พวกส่วนที่เป็นหน้าตาทั้งหลายเลยมักต้องมีรูปแบบพวกนี้อยู่ในตัว ถ้าใครเขียน Flex มาเยอะน่าจะรู้ดีเลยหละ เพราะ Component ทุกตัวเป็น EventDispatcher ที่สามารถเรียกคู่กรณีที่ต้องรับหน้าที่ต่อจากมัน หรืออยาก Swing ในจาวาก็มีรูปแบบที่เหมือนกัน แต่ใช่ว่าจะใช้แค่ใน UI จริงๆ พวกส่วนที่เกี่ยวข้องกับข้อมูลอย่าง ArrayCollection หรือ Data service ของ Flex ก็สามารถส่งหน้าที่ต่อได้เหมือนกัน การที่มันสามารถส่งหน้าที่ต่อได้นี่แหละ ทำให้จินตนาการว่ามันควรจะทำอะไรได้ง่าย ขึ้นโดยที่ชิ้นส่วนแต่ละชิ้นส่วนก็เขียนเฉพาะหน้าที่ที่มันต้องทำเท่านั้น พอทำเสร็จก็บอกให้คนอื่นทำต่อได้เลย
คราวนี้สิ่งที่ต้องคิดสำหรับ Observer คือถ้าหากมีคนที่รับหน้าที่ต่อหลายคนหละ มันจะทำยังไง จะคอยเรียกไปทีละคนให้ทำ หรือว่าจะเรียกทุกคนพร้อมกัน แล้วจะเรียกมันพร้อมกันได้ยังไงอีก หรือถ้าเรียกทีละคน จะเรียกใครก่อนหลังหละ ถ้าจะให้ตอบจริงๆ ก็บอกได้เลยว่าไม่รู้หรอก ^^! มันขึ้นอยู่กับแต่ละเหตุการณ์และความจำเป็น อย่าง Flex นี่ใครลงทะเบียนก่อนได้ก่อน ไล่ทำไปเรื่อยๆ (ใช่ป่าวฟะ สังเกตุเอาจากพฤติกรรมอ่ะนะ แหะๆ) จนครบ ใน Flex มันก็เลยทำให้เลยเป็นคลาส EventDispatcher แต่สำหรับจาวาไม่ต้องน้อยใจ มันมีเหมือนกันชื่อ Observable และ Observer(ทั้งคู่อยู่ใน java.utils) โดยใครที่ต้องการจะส่งข้อความไปหาคนอื่นหลังจากทำอะไรเสร็จแล้วก็ extend Observable มาซะ ส่วนคนที่จะรับหน้าที่ไปทำต่อก็ implement Observer เวลาใช้ก็มาลงทะเบียนกับ Observable แล้วก็ให้มันทำงานไป พอทำเสร็จหรือมีเหตุการณ์อะไรมันก็จะไปเรียก Observer ทั้งหลายที่มาลงทะเบียนกับมันให้มาทำงาน
โอ้ เขียนมายาว แต่รู้สึกเขียนวนไปวนมา ฮะๆๆ เล่าถึงประสบการณ์ในการใช้มันบ้างดีกว่า ที่เคยใช้ส่วนใหญ่จะเป็นการส่งข้อมูลข้าม Object ที่ไม่อยู่ติดกันซะส่วนมาก (เรียกหากันตรงๆ ไม่ได้อ่ะ) ซึ่งทำให้ชีวิตสะดวกสบายมากขึ้นทีเดียว แต่!!! ส่ิงที่ตามมาคือความมั่ว การใช้รูปแบบนี้ไปเยอะ บางครั้งทำให้ไม่รู้ว่าอะไรจะเกิดขึ้นบ้าง บางครั้งก็ทำให้ช้าไปเลย หรือไม่เวลามาเขียนว่า การกดปุ่มนี้ปุ่มนึงมันทำอะไรบ้าง พอเขียนไปลึกๆ มันจะรู้สึกมั่วๆ อยู่เหมือนกัน เพราะกลายเป็นว่า ไอ้นี่อิงกับไอ้นั่นเต็มไปหมดเลย เวลาจะใช้อะไรพวกนี้ทีหลังมานี่ก็เลยต้องนึกก่อนเสมอว่า ไอ้นี่มันจำเป็นต้องเรียกอย่างนี้มั้ย หรือไม่ก็เขียนผังว่าข้อมูลมันไหลยังไงมาก่อนเลย จะได้ไม่เกิดความสับสนขึ้นมา เอาหละ จบแค่นี้ดีกว่า เวียนหัว เบลอๆ ตั้งแต่ช่วงบ่าย เลยกะว่าจะนอนเร็ว แต่เห็นว่าบล๊อกมันนิ่งๆ นานเลยอดไม่ได้ที่จะเขียน แต่วันนี้ไม่ไหวและ ราตรีสวัสดิ์

About llun

Just a programmer

,