ความแตกต่าง
ตราบใดที่คุณใช้งานgetType()
หรืออะไรทำนองนั้นคุณไม่ได้ใช้โพลีมอร์ฟิซึม
ฉันเข้าใจความรู้สึกเหมือนคุณจำเป็นต้องรู้ว่าคุณมีประเภทใด แต่งานใด ๆ ที่คุณต้องการจะทำในขณะที่รู้ว่าควรผลักลงสู่ชั้นเรียนจริง ๆ จากนั้นคุณเพียงแค่บอกเมื่อจะทำ
รหัสขั้นตอนรับข้อมูลแล้วทำการตัดสินใจ รหัสเชิงวัตถุบอกให้วัตถุทำสิ่งต่าง ๆ
- อเล็กซ์ชาร์ป
หลักการนี้เรียกว่าบอกไม่ได้ถาม การติดตามช่วยให้คุณไม่กระจายรายละเอียดเช่นพิมพ์ไปรอบ ๆ และสร้างตรรกะที่ทำงานกับพวกเขา การทำเช่นนั้นจะทำให้ชั้นเรียนอยู่ข้างใน เป็นการดีกว่าที่จะรักษาพฤติกรรมนั้นไว้ในชั้นเรียนเพื่อให้สามารถเปลี่ยนแปลงได้เมื่อมีการเปลี่ยนแปลงชั้นเรียน
encapsulation
คุณสามารถบอกฉันว่าไม่จำเป็นต้องมีรูปทรงอื่น แต่ฉันไม่เชื่อคุณและไม่ควรทำ
เอฟเฟกต์ที่ดีของการห่อหุ้มต่อไปนี้คือมันง่ายที่จะเพิ่มประเภทใหม่เพราะรายละเอียดของมันจะไม่กระจายไปในโค้ดที่แสดงif
และswitch
ลอจิก รหัสสำหรับประเภทใหม่ทั้งหมดควรอยู่ในที่เดียว
ระบบตรวจจับการชนชนิดไม่รู้งมงาย
ให้ฉันแสดงให้คุณเห็นว่าฉันจะออกแบบระบบตรวจจับการชนกันของข้อมูลที่มีประสิทธิภาพและทำงานกับรูปร่าง 2D ได้อย่างไรโดยไม่สนใจประเภท
สมมติว่าคุณควรจะวาดมัน ดูเหมือนง่าย มันคือวงกลมทั้งหมด มันเป็นการสร้างคลาสวงกลมที่เข้าใจการชน ปัญหาคือสิ่งนี้จะส่งแนวความคิดที่แยกออกจากกันเมื่อเราต้องการ 1,000 วงกลม
เราไม่ควรคิดถึงวงกลม เราควรคิดถึงพิกเซล
จะเกิดอะไรขึ้นถ้าฉันบอกคุณว่ารหัสเดียวกันที่คุณใช้ในการวาดคนเหล่านี้คือสิ่งที่คุณสามารถใช้เพื่อตรวจจับเมื่อพวกเขาแตะหรือแม้แต่ที่ผู้ใช้คลิก
ที่นี่ฉันวาดวงกลมแต่ละวงด้วยสีที่ไม่เหมือนใคร (ถ้าดวงตาของคุณดีพอที่จะเห็นโครงร่างสีดำ ซึ่งหมายความว่าทุกพิกเซลในรูปภาพที่ซ่อนอยู่จะจับคู่กับสิ่งที่วาด hashmap จะดูแลสิ่งนั้นอย่างดี คุณสามารถทำพหุสัณฐานแบบนี้ได้
ภาพนี้คุณไม่ต้องแสดงต่อผู้ใช้ คุณสร้างมันด้วยรหัสเดียวกันกับที่วาดขึ้นมาก่อน เพียงแค่มีสีที่ต่างกัน
เมื่อผู้ใช้คลิกที่วงกลมฉันรู้ว่าวงกลมใดเพราะสีเพียงวงกลมเดียว
เมื่อฉันวาดวงกลมด้านบนของอีกฉันสามารถอ่านทุกพิกเซลฉันกำลังจะเขียนทับอย่างรวดเร็วโดยการทิ้งพวกเขาในชุด เมื่อฉันทำคะแนนที่ตั้งไว้ให้กับทุกแวดวงที่มันชนกันและตอนนี้ฉันต้องโทรแต่ละคนเพียงครั้งเดียวเพื่อแจ้งให้ทราบถึงการชนกัน
ชนิดใหม่: สี่เหลี่ยม
ทั้งหมดนี้ทำกับวงกลม แต่ฉันถามคุณ: มันจะทำงานแตกต่างกับสี่เหลี่ยมหรือไม่?
ไม่มีความรู้ในแวดวงรั่วไหลเข้าสู่ระบบตรวจจับ ไม่สนใจรัศมีเส้นรอบวงหรือจุดศูนย์กลาง มันใส่ใจเกี่ยวกับพิกเซลและสี
ส่วนเดียวของระบบการชนนี้ที่ต้องผลักลงไปในรูปร่างแต่ละอันนั้นเป็นสีที่ไม่เหมือนใคร นอกเหนือจากนั้นรูปร่างก็สามารถคิดเกี่ยวกับการวาดรูปร่างของพวกเขา มันเป็นสิ่งที่พวกเขาทำได้ดีอยู่แล้ว
ตอนนี้เมื่อคุณเขียนตรรกะการชนคุณไม่สนใจประเภทย่อยที่คุณมี คุณบอกให้มันชนกันและมันจะบอกคุณว่ามันพบอะไรภายใต้รูปร่างที่มันแกล้งทำเป็นวาด ไม่จำเป็นต้องรู้ประเภท และนั่นหมายความว่าคุณสามารถเพิ่มประเภทย่อยได้มากเท่าที่คุณต้องการโดยไม่ต้องอัปเดตโค้ดในคลาสอื่น ๆ
ตัวเลือกการนำไปใช้
จริงๆแล้วมันไม่จำเป็นต้องเป็นสีที่ไม่เหมือนใคร อาจเป็นการอ้างอิงวัตถุจริงและบันทึกระดับของการอ้อม แต่สิ่งเหล่านั้นดูไม่ดีเมื่อวาดในคำตอบนี้
นี่เป็นเพียงตัวอย่างหนึ่งของการติดตั้งใช้งาน มีคนอื่นอย่างแน่นอน สิ่งนี้แสดงให้เห็นว่ายิ่งคุณปล่อยให้รูปร่างย่อยเหล่านี้ติดอยู่กับความรับผิดชอบเดียวของพวกเขามากเท่าไหร่ระบบก็จะทำงานได้ดีขึ้นเท่านั้น มีแนวโน้มว่าจะเร็วกว่าและมีหน่วยความจำที่น้อยกว่า แต่ถ้าพวกมันบังคับให้ฉันกระจายความรู้เกี่ยวกับชนิดย่อย ๆ ที่อยู่รอบ ๆ ฉันก็ไม่กล้าที่จะใช้มันแม้จะมีประสิทธิภาพเพิ่มขึ้นก็ตาม ฉันจะไม่ใช้มันเว้นแต่ฉันต้องการพวกเขาอย่างชัดเจน
การจัดส่งสองครั้ง
จนถึงตอนนี้ฉันได้ละเว้นสมบูรณ์ส่งคู่ ฉันทำอย่างนั้นเพราะฉันทำได้ ตราบใดที่ตรรกะการชนไม่สนใจว่ารูปแบบการชนกันสองแบบใดที่คุณไม่ต้องการ หากคุณไม่ต้องการใช้อย่าใช้มัน หากคุณคิดว่าคุณอาจต้องการมันให้จัดการกับมันให้นานที่สุด ทัศนคติแบบนี้จะเรียกว่าYAGNI
หากคุณตัดสินใจว่าคุณต้องการการชนประเภทต่าง ๆ จริง ๆ แล้วถามตัวคุณเองว่ารูปร่างย่อย n ต้องการการชน2ชนิดหรือไม่ จนถึงตอนนี้ฉันทำงานหนักมากเพื่อให้ง่ายต่อการเพิ่มรูปร่างย่อยอื่น ฉันไม่ต้องการที่จะทำให้เสียด้วยการใช้การส่งสองครั้งที่บังคับให้วงกลมรู้ว่ากำลังสองอยู่
อย่างไรก็ตามมีการชนกันหลายประเภท การเก็งกำไรเล็กน้อย (สิ่งที่อันตราย) ประดิษฐ์การชนแบบยืดหยุ่น (เด้ง), ไม่ยืดหยุ่น (เหนียว), มีพลัง (อธิบาย) และทำลาย (damagy) อาจมีมากกว่านี้ แต่ถ้านี่น้อยกว่า n 2 จะช่วยให้ไม่สามารถออกแบบการชนของเรา
ซึ่งหมายความว่าเมื่อตอร์ปิโดของฉันปะทะกับสิ่งที่ยอมรับความเสียหายมันไม่จำเป็นต้องรู้ว่ามันโจมตียานอวกาศ มันต้องบอกว่า "ฮ่าฮ่า! คุณได้รับความเสียหาย 5 คะแนน"
สิ่งที่จัดการความเสียหายส่งข้อความความเสียหายไปยังสิ่งที่รับข้อความความเสียหาย ทำแบบนั้นคุณสามารถเพิ่มรูปร่างใหม่โดยไม่บอกรูปร่างอื่น ๆ เกี่ยวกับรูปร่างใหม่ คุณจะแพร่กระจายไปตามการชนประเภทใหม่เท่านั้น
ยานอวกาศสามารถส่งกลับไปที่ torp "Ha ha! คุณได้รับความเสียหาย 100 คะแนน" เช่นเดียวกับ "ตอนนี้คุณติดลำเรือของฉัน" และ torp สามารถส่งกลับ "ดีฉันทำเพื่อลืมเกี่ยวกับฉัน"
ไม่มีประเด็นใดที่จะรู้ว่าแต่ละสิ่งนั้นคืออะไร พวกเขารู้วิธีพูดคุยกันผ่านส่วนต่อประสานการชน
ตอนนี้แน่ใจว่าการจัดส่งสองครั้งช่วยให้คุณสามารถควบคุมสิ่งต่าง ๆ ได้มากกว่านี้ แต่คุณต้องการสิ่งนั้นจริงหรือ
ถ้าอย่างน้อยคุณก็ลองคิดอย่างรอบคอบเกี่ยวกับการจัดส่งสองครั้งผ่านสิ่งที่เป็นรูปแบบของการชนที่ยอมรับและไม่ได้เกิดขึ้นกับรูปร่างจริง นอกจากนี้พฤติกรรมการปะทะกันเป็นสิ่งที่คุณสามารถฉีดเป็นการพึ่งพาและมอบหมายให้การพึ่งพานั้น
ประสิทธิภาพ
ประสิทธิภาพเป็นสิ่งสำคัญเสมอ แต่นั่นไม่ได้หมายความว่ามันเป็นปัญหาเสมอ ทดสอบประสิทธิภาพ อย่าเพียงแค่คาดเดา การเสียสละทุกอย่างในชื่อของประสิทธิภาพมักจะไม่นำไปสู่การเจาะรหัส