เหตุการณ์ Laravel 5 - นี่คือคนกลางหรือผู้สังเกตการณ์หรือไม่

วันนี้ฉันกำลังคุยเรื่องระบบกิจกรรมของ Laravel กับนักพัฒนาคนอื่น เขากล่าวว่าผู้มอบหมายงานกิจกรรมของ Laravel ใช้รูปแบบผู้สังเกตการณ์

ฉันคิดเสมอว่ามันใช้รูปแบบตัวกลางเนื่องจากวัตถุของคุณคอยฟัง/ส่งสัญญาณเหตุการณ์ผ่านวัตถุผู้ส่งเหตุการณ์เสมอ แต่เอกสารบอกว่าเป็นผู้สังเกตการณ์

Event::listen('event.name', function ($foo, $bar) {
    //
});

Event::fire("event.name", []);

นี่ไม่ใช่รูปแบบคนกลางใช่ไหม


person Moon    schedule 15.02.2016    source แหล่งที่มา


คำตอบ (1)


ฉันไม่มีความคิดที่ชัดเจนเกี่ยวกับสิ่งที่ Laravel ทำอย่างเป็นรูปธรรม และจริง ๆ แล้วถ้าเอกสารบอกว่ามันสร้างขึ้นจากรูปแบบผู้สังเกตการณ์ ฉันก็จะเชื่อ

อย่างไรก็ตาม คำถามของคุณเกี่ยวกับลักษณะของโค้ด และจากประสบการณ์ของฉัน ฉันสามารถจดจำผู้สังเกตการณ์ได้อย่างง่ายดายด้วยการเปรียบเทียบ:

  • ฟังจะคล้ายกับการสมัคร/แนบของผู้สังเกตการณ์
  • ไฟจะคล้ายกับการแจ้งเตือน/การอัปเดตของผู้สังเกตการณ์

คนกลางอาจดูแปลกสำหรับฉันที่นี่ เพราะแม้ว่าจุดประสงค์จะอำนวยความสะดวกในการสื่อสารระหว่างวัตถุบางอย่าง แต่ฉันก็ไม่เห็นว่าเป็นวิธีที่ดีในการกระจายการแจ้งเตือน ฉันจะเดิมพันกับผู้สังเกตการณ์อย่างแน่นอนด้วยเหตุผลนั้น

person floppy12    schedule 15.02.2016
comment
@ floopy12 แต่คุณไม่ได้รับอินสแตนซ์ของวัตถุแล้วฟังมันถ้ามันเป็นผู้สังเกตการณ์ใช่ไหม? ในกรณีนี้ คุณกำลังฟังคลาส Event ไม่ใช่วัตถุที่คุณสนใจ การมี Listen/Fire ไม่ได้หมายความว่าเป็นผู้สังเกตการณ์ คนกลางสามารถฟัง/ยิงได้เช่นกัน - person Moon; 16.02.2016
comment
@Moon ในความคิดของฉัน สิ่งเดียวที่สำคัญคือคุณกำลังฟังอย่างอื่นอยู่แม้ว่าจะไม่ใช่วัตถุก็ตาม หมายความว่าคุณสนใจในทางใดทางหนึ่ง รูปแบบผู้สังเกตการณ์ (หรือใด ๆ ) ไม่ได้อยู่ในภาษาหรือกระบวนทัศน์ใด ๆ เป็นแนวคิดเชิงแนวคิดในการแสดงปัญหาและวิธีแก้ไข การนำไปใช้งานควรได้รับการปรับแต่งตามความต้องการเฉพาะของคุณ ที่นี่ดูเหมือนว่าจะเป็นวิธีการที่ใช้งานได้จริงมากขึ้นโดยที่คุณรับฟังเหตุการณ์และเชื่อมโยงการโทรกลับเข้ากับเหตุการณ์นั้นมากกว่าการใช้ OOP แบบคลาสสิก - person floppy12; 16.02.2016
comment
@floopy12 // ที่ฉันเข้าใจอย่างถ่องแท้ ปัญหาก็คือการฝังนี้ยังหมายถึงการคอมไพล์ที่ค่อนข้างหลวมเนื่องจากชื่อเหตุการณ์สามารถเป็นอะไรก็ได้และ Event จะทำหน้าที่เป็นสื่อกลางไม่ว่าฉันจะฟังเหตุการณ์ใดเหตุการณ์หนึ่งหรือไม่ก็ตาม ฉันคิดว่านี่คือสาเหตุที่เฟรมเวิร์ก PHP บางตัวเรียกมันว่าตัวกลาง แต่ Laravel ไม่ได้เป็นเช่นนั้น - person Moon; 16.02.2016
comment
@Moon: เกี่ยวกับสิ่งที่เชื่อมต่อกันอย่างหลวม ๆ ทั้งใน Mediator และ Observer นั้น objA และ objB จะไม่สื่อสารโดยตรง (ตามลำดับผ่าน Mediator หรือเหตุการณ์แม้ว่ามันจะถูกไล่ออกจากวัตถุที่สังเกตได้ก็ตาม) รหัสที่ให้มาไม่เพียงพอที่จะรู้ว่าจริง ๆ แล้ว Laravel ทำอะไรภายใต้ประทุน อย่างไรก็ตาม เนื่องจากผู้ไกล่เกลี่ยอำนวยความสะดวกในการสื่อสารระหว่างวัตถุอื่นสองวัตถุ (หรือมากกว่า) โดยที่ ทั้งสองหัวข้อที่นี่หากเหตุการณ์เป็นตัวแทนของผู้ไกล่เกลี่ย ? นอกจากนี้ Event จะเป็นชื่อที่เหมาะสมสำหรับ Mediator หรือไม่ (พิจารณาว่าเป็นชื่อที่ยอมรับได้สำหรับ Observable) - person floppy12; 16.02.2016
comment
@ floopy12 // ไม่เห็นด้วย แต่ก็ไม่เห็นด้วยเช่นกัน เท่าที่ฉันเข้าใจหนังสือ GOF ผู้สังเกตการณ์ต้องพึ่งพาซึ่งกันและกัน คุณต้องมีตัวอย่างหัวข้อเพื่อฟัง ฉันเข้าใจว่าการปลูกถ่ายเปลี่ยนไป แต่ฉันไม่คิดว่าความตั้งใจควรเปลี่ยนจริงๆ ในกรณีนี้ ไม่มีใครพึ่งพาซึ่งกันและกันจริงๆ มันอยู่ในหัวของโปรแกรมเมอร์เท่านั้น ฉันเดาว่าฉันถามคำถามผิดที่นี่เนื่องจากจะไม่มีคำตอบที่เป็นรูปธรรม แต่เป็นความคิดเห็นที่ดี ฉันขอขอบคุณความคิดของคุณ - person Moon; 16.02.2016
comment
@Moon : ฉันเข้าใจความงุนงงของคุณ และมันจะยากสำหรับฉันที่จะชี้แจงสถานการณ์ IMHO ฉันเห็น Observable (ผู้ถือเหตุการณ์หรือเหตุการณ์) ที่นี่และผู้สังเกตการณ์ (ผู้ถือฟังก์ชันหรือฟังก์ชัน) เอนทิตีทั้งสองเชื่อมโยงกันด้วยสตริง event.name แทนที่จะสื่อสารอย่างชัดเจน (ฟังก์ชันการเรียกผู้ถือเหตุการณ์ด้วย args foo และ bar) ฉันคิดว่าเจตนาของผู้สังเกตการณ์ได้รับการเคารพอย่างเต็มที่ ในทางตรงกันข้าม คนไกล่เกลี่ยจะเป็นวัตถุที่สามที่จะรับเหตุการณ์ในด้านหนึ่งและเรียกใช้ฟังก์ชันในอีกทางหนึ่ง - person floppy12; 16.02.2016
comment
@Moon: สิ่งที่ทำให้คุณสับสนอย่างแน่นอนคือการเชื่อมโยงระหว่างเหตุการณ์และการโทรกลับทำได้โดยใช้สตริงแทนที่จะเป็นวัตถุที่เป็นรูปธรรม แต่มันเป็นเพียงวิธีเดียวที่จะบรรลุการออกแบบคู่ที่หลวมมากขึ้นโดยใช้อาร์กิวเมนต์ทั่วไปแทนที่จะอาศัยอ็อบเจ็กต์ ข้อมูลเพิ่มเติมเกี่ยวกับ en.wikipedia.org/wiki/Loose_coupling - วิธีการส่วนสำหรับลดการมีเพศสัมพันธ์ - person floppy12; 16.02.2016