เมื่อออกแบบกิจกรรม เป็นความคิดที่ดีหรือไม่ที่จะป้องกันไม่ให้มีการเพิ่มผู้ฟังซ้ำสองครั้ง

ฉันกำลังสร้าง API ตามเหตุการณ์ที่ผู้ใช้สามารถสมัครรับเหตุการณ์ได้โดยการเพิ่มออบเจ็กต์ Listener (ตามปกติใน Java หรือ C#) เมื่อเหตุการณ์ถูกยกขึ้น Listener ที่สมัครเป็นสมาชิกทั้งหมดจะถูกเรียกใช้พร้อมกับข้อมูลเหตุการณ์

ในตอนแรกฉันตัดสินใจที่จะป้องกันไม่ให้เพิ่มผู้ฟังเหตุการณ์มากกว่าหนึ่งครั้ง หากมีการเพิ่ม Listener ที่มีอยู่แล้วในคอลเลกชัน Listener จะไม่ถูกเพิ่มอีกครั้ง อย่างไรก็ตาม หลังจากที่คิดเพิ่มเติมแล้ว ดูเหมือนว่าโครงสร้างตามเหตุการณ์ส่วนใหญ่ไม่ได้ป้องกันสิ่งนี้จริงๆ สัญชาตญาณเริ่มแรกของฉันผิดหรือเปล่า? ฉันไม่แน่ใจว่าจะไปทางไหนที่นี่ ฉันเดาว่าฉันคิดว่าการป้องกันการเพิ่มผู้ฟังที่มีอยู่จะช่วยหลีกเลี่ยงข้อผิดพลาดในการเขียนโปรแกรมทั่วไป นอกจากนี้ยังสามารถซ่อนข้อบกพร่องที่อาจนำไปสู่การเรียกใช้โค้ดหลายครั้งโดยที่ไม่ควรเกิดขึ้น


person Matt H    schedule 13.06.2010    source แหล่งที่มา
comment
ดูเหมือนว่าซ้ำกันของ stackoverflow.com/questions/1321296/   -  person Cincinnati Joe    schedule 29.06.2011


คำตอบ (3)


ฉันเห็นด้วยกับ Henk แต่ขอย้ำอีกครั้งว่า การยกเลิกการลงทะเบียนการติดต่อกลับจะง่ายกว่าหากมีเพียงฝ่ายเดียว มิฉะนั้นคุณจะต้องระบุว่าอันสุดท้ายหรืออันแรกจะถูกลบออก หรือไม่ก็เป็นไปตามอำเภอใจ คลาส Observable ของ Java ทำงานในลักษณะนี้ หากมี Observer อยู่ในรายการแล้ว addObserver โดยที่ Observer นั้นจะไม่ดำเนินการ อีกครั้งในโค้ด Python ของฉัน ฉันเพิ่งลบสำเนาล่าสุดของผู้สังเกตการณ์ออกจากรายการ และอนุญาตให้ทำซ้ำได้ ฉันไม่เคยพบกรณีการใช้งานที่ดีที่ขึ้นอยู่กับกลยุทธ์ใดกลยุทธ์หนึ่งเลย

person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x    schedule 13.06.2010
comment
ฉันลืมเรื่อง Observable ไปได้แล้ว ฉันเดาว่ามันสามารถไปทางใดทางหนึ่งแล้ว - person Matt H; 14.06.2010

ฉัน เดา ว่าระบบเหตุการณ์ส่วนใหญ่ไม่สนใจ ต้องใช้ความพยายามพอสมควรในการตรวจจับและบล็อกรายการที่ซ้ำกัน และมีเพียง (มาก) เท่านั้นที่ไม่มีใครพยายามโฆษณากิจกรรมมากกว่าหนึ่งครั้งโดยไม่ตั้งใจ การทำเช่นนั้นโดยตั้งใจนั้นเกิดขึ้นได้ยากเช่นกัน แต่ก็สามารถทำได้

เหตุใดจึงบล็อกการใช้งานที่หายากแต่ถูกต้องเพื่อป้องกันข้อผิดพลาดที่หายากยิ่งขึ้น

กล่าวโดยย่อ ฉันคิดว่า "ข้อผิดพลาดในการเขียนโปรแกรมทั่วไป" ของคุณไม่บ่อยนัก

person Henk Holterman    schedule 13.06.2010

ฉันขอขอบคุณคำตอบที่ได้รับ แต่ฉันคิดว่าฉันจะดำเนินการป้องกันไม่ให้มีการเพิ่มผู้ฟังคนเดิมมากกว่าหนึ่งครั้ง Observable ของ Java ทำงานในลักษณะนี้ และฉันใช้ CopyOnWriteArrayList เป็นคอลเลกชั่นสำรองสำหรับผู้ฟังซึ่งมีสิ่งนี้อยู่แล้ว (addIfAbsent()) ดูเหมือนว่ามีโอกาสน้อยที่ใครจะต้องการเพิ่ม Listener คนเดิมหลายๆ ครั้ง และเป็นเรื่องง่ายที่จะบรรลุพฤติกรรมเดียวกันโดยการสร้าง Listener อื่นหรือใช้การวนซ้ำภายใน Listener เดียวกัน ฉันสามารถเข้าใจข้อโต้แย้งในการอนุญาตให้ทำซ้ำได้ (ดังนั้นฉันจึงสงสัย) แต่ไม่เพียงพอที่จะเปลี่ยนแปลง

person Matt H    schedule 22.06.2010