ฉันคิดว่ามีปัจจัยบางอย่างที่ยังไม่ได้กล่าวถึง
ก่อนอื่นอย่างน้อยใน "pure OOP" (เช่น Smalltalk) ที่ทุกอย่างเป็นวัตถุคุณต้องบิดใจของคุณให้เข้ากับการกำหนดค่าที่ไม่เป็นธรรมชาติมากกว่าที่จะคิดตัวเลข (สำหรับตัวอย่างเดียว) เป็นวัตถุอัจฉริยะแทน เพียงคุณค่า - ในความเป็นจริง21
(ตัวอย่าง) จริง ๆ แล้วเป็นเพียงคุณค่า สิ่งนี้กลายเป็นปัญหาโดยเฉพาะเมื่อคุณบอกว่าข้อดีอย่างหนึ่งของ OOP คือการสร้างแบบจำลองความเป็นจริงอย่างใกล้ชิด แต่คุณเริ่มต้นด้วยการดูสิ่งที่น่ากลัวมากมายเช่นมุมมองที่ได้รับแรงบันดาลใจจาก LSD แม้ในส่วนพื้นฐานและชัดเจนที่สุดของ ความจริง
ประการที่สองการสืบทอดใน OOP ไม่ได้ทำตามแบบจำลองจิตของคนส่วนใหญ่อย่างใกล้ชิดเช่นกัน สำหรับคนส่วนใหญ่การจำแนกสิ่งที่เฉพาะเจาะจงมากที่สุดไม่ได้อยู่ใกล้กับกฎสัมบูรณ์ที่จำเป็นในการสร้างลำดับชั้นของชั้นเรียนที่ใช้งานได้ โดยเฉพาะอย่างยิ่งการสร้างclass D
ที่สืบทอดจากที่อื่นclass B
หมายความว่าวัตถุของclass D
หุ้นอย่างแน่นอนบวกทุกclass B
ลักษณะของ class D
สามารถเพิ่มคุณสมบัติใหม่และแตกต่างของมันเอง แต่ลักษณะทั้งหมดของclass B
ต้องยังคงเหมือนเดิม
ในทางตรงกันข้ามเมื่อผู้คนจำแนกสิ่งต่าง ๆ ทางจิตใจพวกเขามักจะทำตามแบบที่หลวมมาก ตัวอย่างหนึ่งถ้าคนสร้างกฎบางอย่างเกี่ยวกับสิ่งที่ถือเป็นคลาสของวัตถุมันเป็นเรื่องปกติที่เกือบจะกฎข้อใดข้อหนึ่งสามารถถูกทำลายได้ตราบใดที่มีการปฏิบัติตามกฎอื่น ๆ แม้แต่กฎไม่กี่ข้อที่ไม่สามารถทำลายได้จริงๆก็สามารถ "ยืด" ได้นิดหน่อยอยู่ดี
ตัวอย่างเช่นลองพิจารณา "รถยนต์" เป็นคลาส มันค่อนข้างง่ายที่จะเห็นว่าคนส่วนใหญ่คิดว่า "รถยนต์" มีสี่ล้อ อย่างไรก็ตามคนส่วนใหญ่ได้เห็นรถยนต์อย่างน้อยสามล้อ พวกเราสองคนในยุคที่ถูกต้องยังจำรถแข่งหนึ่งหรือสองคันตั้งแต่ต้นยุค 80 (หรือมากกว่านั้น) ที่มีหกล้อ - เป็นต้น สิ่งนี้ทำให้เรามีสามตัวเลือกโดยทั่วไป:
- อย่ายืนยันอะไรเลยเกี่ยวกับจำนวนล้อที่รถมี - แต่สิ่งนี้มีแนวโน้มที่จะนำไปสู่ข้อสันนิษฐานที่แน่นอนว่ามันจะเป็น 4 เสมอและรหัสที่มีแนวโน้มว่าจะแตกสำหรับหมายเลขอื่น
- ยืนยันว่ารถยนต์ทุกคันมีสี่ล้อและแยกประเภทอื่น ๆ เป็น "ไม่ใช่รถยนต์" แม้ว่าเราจะรู้ว่าพวกเขาเป็นจริง
- ออกแบบคลาสเพื่อให้มีความหลากหลายของล้อในกรณีที่มีโอกาสที่ดีไม่จำเป็นต้องใช้ความสามารถหรือทดสอบอย่างเหมาะสม
การสอนเกี่ยวกับ OOP มักมุ่งเน้นไปที่การสร้าง taxonomies ขนาดใหญ่ - เช่นบิตและชิ้นส่วนของสิ่งที่จะเป็นลำดับชั้นยักษ์ของชีวิตที่รู้จักกันทั้งหมดในโลกหรือบางสิ่งในลำดับที่ สิ่งนี้ทำให้เกิดปัญหาสองประการ: สิ่งแรกและสำคัญที่สุดคือมันมีแนวโน้มที่จะนำคนจำนวนมากไปสู่การมุ่งเน้นไปที่ข้อมูลจำนวนมากที่ไม่เกี่ยวข้องกับคำถามในมือ มีอยู่ช่วงหนึ่งที่ฉันได้เห็นการถกเถียงกันถึงวิธีการทำตัวเป็นสายพันธุ์สุนัขที่ค่อนข้างยาวและตัวอย่างเช่น "พุดเดิ้ลจิ๋ว" ควรได้รับมรดกมาจาก "พุดเดิ้ลขนาดเต็ม" หรือในทางกลับกัน "คลาสพร้อมกับ" พุดเดิ้ลขนาดเต็ม "และ" พุดเดิ้ลขนาดเล็ก "ทั้งคู่สืบทอดมาจากมัน สิ่งที่พวกเขาดูเหมือนจะเพิกเฉยก็คือแอปพลิเคชันควรจัดการติดตามใบอนุญาตสำหรับสุนัข
ประการที่สองและที่สำคัญเกือบจะนำไปสู่การมุ่งเน้นไปที่ลักษณะของรายการแทนที่จะมุ่งเน้นไปที่คุณลักษณะที่มีความสำคัญสำหรับงานในมือ มันนำไปสู่การสร้างแบบจำลองสิ่งต่าง ๆ ที่พวกเขาต้องการ (ส่วนใหญ่) สิ่งที่จำเป็นจริงๆคือการสร้างแบบจำลองที่ง่ายที่สุดที่จะเติมเต็มความต้องการของเราและใช้นามธรรมเพื่อให้พอดีกับคลาสย่อยที่จำเป็นเพื่อให้พอดีกับนามธรรม
สุดท้ายผมจะบอกอีกครั้ง: เราช้าไปตามเส้นทางเดียวกับที่ถ่ายโดยฐานข้อมูลปีที่ผ่านมา ฐานข้อมูลก่อนตามโมเดลลำดับชั้น นอกเหนือจากการมุ่งเน้นไปที่ข้อมูลเท่านั้นนี่คือการสืบทอดเดี่ยว ในช่วงเวลาสั้น ๆ ฐานข้อมูลสองสามตัวติดตามโมเดลเครือข่าย - โดยพื้นฐานแล้วเหมือนกับมรดกหลาย ๆ อัน (และดูจากมุมนี้หลายอินเตอร์เฟสไม่แตกต่างจากคลาสพื้นฐานหลายคลาสที่จะสังเกตเห็นหรือสนใจ)
อย่างไรก็ตามนานมาแล้วฐานข้อมูลส่วนใหญ่มาบรรจบกับโมเดลเชิงสัมพันธ์ (และแม้ว่ามันจะไม่ใช่ SQL ในระดับที่เป็นนามธรรมของฐานข้อมูล "NoSQL" ในปัจจุบันก็มีความสัมพันธ์เช่นกัน) ข้อดีของแบบจำลองเชิงสัมพันธ์นั้นเป็นที่รู้จักกันดีว่าฉันจะไม่สนใจพวกเขาซ้ำที่นี่ ฉันเพิ่งจะทราบว่าแอนะล็อกที่ใกล้เคียงที่สุดของโมเดลเชิงสัมพันธ์ที่เรามีในการเขียนโปรแกรมคือการเขียนโปรแกรมทั่วไป (และขออภัย แต่แม้ว่าชื่อ Java generics ตัวอย่างหนึ่งไม่ได้ผ่านการรับรองจริง ๆ แม้ว่าพวกเขาจะเป็นขั้นตอนเล็ก ๆ ทิศทางที่ถูกต้อง)