ฉันคิดว่าคุณต้องมองแนวคิดนี้จากจุดเริ่มต้นอื่น ลองดูจากมุมมองของผู้ออกแบบฐานข้อมูล: ประเภทที่ส่งผ่านในตัวอย่างแรกไม่ได้กำหนดพารามิเตอร์ของคุณด้วยวิธีที่ไม่เหมือนใคร
public void bookTicket(
String name,
String firstName,
String film,
int count,
String cinema);
จำเป็นต้องใช้พารามิเตอร์สองตัวเพื่อระบุผู้มีพระคุณที่แท้จริงที่จองตั๋วคุณอาจมีภาพยนตร์สองเรื่องที่มีชื่อเหมือนกัน (เช่น remakes) คุณอาจมีภาพยนตร์เรื่องเดียวกันที่มีชื่อต่างกัน (เช่นการแปล) โซ่โรงภาพยนตร์บางแห่งอาจมีสำนักงานสาขาที่แตกต่างกันดังนั้นคุณจะจัดการกับมันอย่างไรในสายและในวิธีที่สอดคล้องกัน (เช่นคุณกำลังใช้$chain ($city)
หรือ$chain in $city
หรืออย่างอื่นและคุณจะแน่ใจได้อย่างไรว่านี่คือ ใช้อย่างสม่ำเสมอสิ่งที่แย่ที่สุดคือการระบุผู้มีพระคุณของคุณด้วยพารามิเตอร์สองตัวความจริงที่ว่าทั้งชื่อและนามสกุลนั้นไม่ได้รับประกันลูกค้าที่ถูกต้อง (และคุณไม่สามารถแยกแยะความแตกต่างได้สองประการJohn Doe
)
คำตอบสำหรับเรื่องนี้คือการประกาศประเภท แต่สิ่งเหล่านี้จะไม่ค่อยห่อหุ้มบางอย่างที่ฉันแสดงข้างต้น ส่วนใหญ่แล้วพวกเขาจะทำหน้าที่เป็นที่เก็บข้อมูลของคุณหรือเชื่อมต่อกับฐานข้อมูลบางประเภท ดังนั้นCinema
วัตถุน่าจะมีชื่อที่ตั้ง ... และวิธีที่คุณกำจัดความคลุมเครือเช่นนั้น หากพวกเขาเป็น wrappers บางพวกเขาโดยบังเอิญ
ดังนั้น IMHO ที่โพสต์ในบล็อกกำลังพูดว่า "ทำให้แน่ใจว่าคุณผ่านประเภทที่ถูกต้อง" ผู้เขียนได้เลือกตัวเลือกที่ จำกัด มากเกินไปที่จะเลือกประเภทข้อมูลพื้นฐานโดยเฉพาะ (ซึ่งเป็นข้อความผิด)
ทางเลือกที่เสนอจะดีกว่า:
public void bookTicket(
Name name,
FirstName firstName,
Film film,
Count count,
Cinema cinema);
ในทางกลับกันฉันคิดว่าการโพสต์บล็อกไปไกลเกินกว่าจะครอบคลุมทุกอย่าง Count
สามัญมากเกินไปฉันสามารถนับแอปเปิ้ลหรือส้มด้วยการเพิ่มพวกเขาและยังคงมีสถานการณ์ในมือของฉันที่ระบบประเภทช่วยให้ฉันสามารถดำเนินการที่ไร้สาระ แน่นอนคุณสามารถใช้ตรรกะเดียวกันกับในบล็อกและกำหนดประเภทCountOfOranges
ฯลฯ แต่นั่นก็โง่ธรรมดา
สำหรับสิ่งที่คุ้มค่าฉันควรเขียนอะไรบางอย่างเช่น
public Ticket bookTicket(
Person patron,
Film film,
int numberOfTickets,
Cinema cinema);
เรื่องสั้นสั้น ๆ : คุณไม่ควรส่งตัวแปรไร้สาระ; ครั้งเดียวที่คุณจะระบุวัตถุด้วยค่าที่ไม่ได้ระบุวัตถุจริงคือเมื่อคุณเรียกใช้แบบสอบถาม (เช่นpublic Collection<Film> findFilmsWithTitle(String title)
) หรือเมื่อคุณรวบรวมหลักฐานการพิสูจน์แนวคิด รักษาระบบการพิมพ์ของคุณให้สะอาดดังนั้นอย่าใช้ประเภทที่กว้างเกินไป (เช่นภาพยนตร์ที่แสดงโดย a String
) หรือ จำกัด / เจาะจง / ประดิษฐ์เกินไป (เช่นCount
แทนที่จะเป็นint
) ใช้ประเภทที่กำหนดวัตถุของคุณไม่ซ้ำกันและไม่น่าสงสัยเมื่อใดก็ตามที่เป็นไปได้และทำงานได้
แก้ไข : สรุปสั้นลง สำหรับการใช้งานขนาดเล็ก (เช่นการพิสูจน์แนวคิด): ทำไมต้องกังวลกับการออกแบบที่ซับซ้อน? เพียงแค่ใช้String
หรือint
ไปกับมัน
สำหรับแอปพลิเคชันขนาดใหญ่: เป็นไปได้หรือไม่ที่คุณมีคลาสจำนวนมากที่ประกอบด้วยฟิลด์เดียวที่มีชนิดข้อมูลพื้นฐาน ถ้าคุณมีคลาสเล็ก ๆ น้อย ๆ คุณแค่มีวัตถุ "ปกติ" ไม่มีอะไรพิเศษเกิดขึ้นที่นั่น
ฉันรู้สึกว่าความคิดในการห่อหุ้มสตริง ... เป็นเพียงการออกแบบที่ไม่สมบูรณ์: ซับซ้อนเกินไปสำหรับแอปพลิเคชันขนาดเล็กไม่สมบูรณ์เพียงพอสำหรับแอปพลิเคชันขนาดใหญ่