อย่าประกาศอินเตอร์เฟสสำหรับวัตถุที่ไม่เปลี่ยนรูป
[แก้ไข] เมื่อวัตถุที่เป็นปัญหาแสดงถึง Data Transfer Objects (DTOs) หรือ Plain Old Data (PODs)
นั่นเป็นแนวทางที่สมเหตุสมผลหรือไม่?
ถึงตอนนี้ฉันมักจะสร้างอินเตอร์เฟสสำหรับคลาสที่ปิดผนึกซึ่งไม่เปลี่ยนรูป (ข้อมูลไม่สามารถเปลี่ยนแปลงได้) ฉันพยายามระวังตัวเองว่าจะไม่ใช้อินเทอร์เฟซที่ใดก็ตามที่ฉันสนใจเกี่ยวกับการไม่เปลี่ยนรูป
โชคไม่ดีที่อินเทอร์เฟซเริ่มแพร่หลายรหัส (และไม่ใช่เพียงรหัสของฉันที่ฉันกังวล) คุณเลิกใช้งานอินเทอร์เฟซแล้วต้องการส่งไปยังโค้ดที่ต้องการสมมติว่าสิ่งที่ส่งผ่านไปนั้นไม่สามารถเปลี่ยนแปลงได้
เนื่องจากปัญหานี้ฉันจึงพิจารณาไม่ประกาศส่วนต่อประสานสำหรับวัตถุที่ไม่เปลี่ยนรูป
สิ่งนี้อาจมีเครือข่ายที่เกี่ยวข้องกับการทดสอบหน่วย แต่นอกเหนือจากนั้นสิ่งนี้ดูเหมือนจะเป็นแนวทางที่สมเหตุสมผลหรือไม่?
หรือมีรูปแบบอื่นที่ฉันควรใช้เพื่อหลีกเลี่ยงปัญหา "อินเตอร์เฟซการแพร่กระจาย" ฉันเห็น?
(ฉันใช้วัตถุที่ไม่เปลี่ยนรูปแบบเหล่านี้ด้วยเหตุผลหลายประการ: ส่วนใหญ่เพื่อความปลอดภัยของเธรดเนื่องจากฉันเขียนโค้ดแบบมัลติเธรดจำนวนมาก แต่เพราะมันหมายความว่าฉันสามารถหลีกเลี่ยงการทำสำเนาชุดป้องกันวัตถุที่ส่งผ่านไปยังวิธีต่างๆ หลายกรณีเมื่อคุณรู้ว่าบางสิ่งบางอย่างไม่เปลี่ยนรูป - ซึ่งคุณไม่ได้รับถ้าคุณได้ส่งมอบอินเทอร์เฟซที่จริงแล้วบ่อยครั้งที่คุณไม่สามารถทำสำเนาการป้องกันของวัตถุที่อ้างอิงผ่านทางอินเทอร์เฟซ การดำเนินการโคลนหรือวิธีการทำให้เป็นอนุกรมใด ๆ ... )
[แก้ไข]
เพื่อให้บริบทมากขึ้นด้วยเหตุผลของฉันที่ต้องการทำให้วัตถุไม่เปลี่ยนรูปให้ดูโพสต์บล็อกนี้จาก Eric Lippert:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
ฉันควรชี้ให้เห็นว่าฉันกำลังทำงานกับแนวคิดระดับล่างบางอย่างที่นี่เช่นรายการที่จัดการ / ส่งต่อในคิวงานแบบมัลติเธรด สิ่งเหล่านี้คือ DTO
นอกจากนี้โจชัวโบลชแนะนำให้ใช้วัตถุที่ไม่เปลี่ยนรูปในหนังสือของเขาที่มีประสิทธิภาพชวา
ติดตาม
ขอบคุณสำหรับความคิดเห็นทั้งหมด ฉันตัดสินใจที่จะไปข้างหน้าและใช้แนวทางนี้สำหรับ DTOs และตระกูลของพวกเขา มันใช้งานได้ดีจนถึงเพียงสัปดาห์เดียว ... ถึงกระนั้นมันก็ดูดี
มีประเด็นอื่น ๆ ที่เกี่ยวข้องกับเรื่องนี้ที่ฉันต้องการถามเกี่ยวกับ; สิ่งที่สะดุดตาที่ฉันเรียกว่า "Deep or Shallow Immutability" (ศัพท์เฉพาะที่ฉันขโมยมาจาก Deep and Shallow cloning) - แต่นั่นเป็นคำถามอีกครั้ง
List<Number>
ซึ่งสามารถเก็บไว้Integer
, Float
, Long
, BigDecimal
ฯลฯ ... ซึ่งทั้งหมดจะไม่เปลี่ยนรูปตัวเอง