แนวคิดพื้นฐานที่อยู่เบื้องหลัง OOP คือข้อมูลและพฤติกรรม (ตามข้อมูลนั้น) แยกออกไม่ได้และพวกเขาจะถูกควบคู่ไปกับแนวคิดของวัตถุของคลาส วัตถุมีข้อมูลและวิธีการที่ทำงานกับ (และข้อมูลอื่น ๆ ) เห็นได้ชัดว่าตามหลักการของ OOP วัตถุที่เป็นเพียงข้อมูล (เช่นโครงสร้างของ C) นั้นถือว่าเป็นรูปแบบการต่อต้าน
จนถึงตอนนี้ดีมาก
ปัญหาคือฉันสังเกตว่ารหัสของฉันดูเหมือนจะเพิ่มมากขึ้นเรื่อย ๆ ในทิศทางของรูปแบบการต่อต้านเมื่อเร็ว ๆ นี้ ดูเหมือนว่ายิ่งฉันพยายามที่จะบรรลุข้อมูลที่ซ่อนอยู่ระหว่างคลาสและการออกแบบที่คู่กันอย่างหลวม ๆ ยิ่งคลาสของฉันได้รับการผสมของข้อมูลที่บริสุทธิ์มากขึ้นเท่านั้นไม่มีคลาสพฤติกรรมและพฤติกรรมทั้งหมดไม่มีคลาสข้อมูล
โดยทั่วไปฉันออกแบบคลาสในวิธีที่ลดการรับรู้ของการมีอยู่ของคลาสอื่นและลดความรู้ของอินเทอร์เฟซของคลาสอื่น ฉันบังคับใช้สิ่งนี้โดยเฉพาะอย่างยิ่งจากบนลงล่างชั้นเรียนระดับล่างไม่ทราบเกี่ยวกับชั้นเรียนระดับสูงกว่า เช่น:
สมมติว่าคุณมี API เกมการ์ดทั่วไป Cardคุณได้เรียน ตอนนี้Cardคลาสนี้จำเป็นต้องกำหนดทัศนวิสัยให้กับผู้เล่น
วิธีหนึ่งคือการมีboolean isVisible(Player p)ในCardชั้นเรียน
อีกอย่างคือให้มีboolean isVisible(Card c)ในPlayerชั้นเรียน
ฉันไม่ชอบวิธีแรกโดยเฉพาะอย่างยิ่งในขณะที่มันมอบความรู้เกี่ยวกับระดับที่สูงกว่าPlayerระดับให้อยู่ในระดับที่ต่ำกว่าCardระดับ
แต่ฉันเลือกใช้ตัวเลือกที่สามที่เรามีViewportคลาสซึ่งให้ a Playerและรายการการ์ดกำหนดว่าจะมองเห็นการ์ดใด
อย่างไรก็ตามวิธีนี้ปล้นทั้งสองCardและPlayerคลาสของฟังก์ชั่นสมาชิกที่เป็นไปได้ เมื่อคุณทำสิ่งอื่นนอกเหนือจากการมองเห็นการ์ดแล้วคุณจะเหลือCardและPlayerคลาสที่มีข้อมูลล้วนๆเนื่องจากมีการใช้งานฟังก์ชั่นทั้งหมดในคลาสอื่นซึ่งส่วนใหญ่เป็นคลาสที่ไม่มีข้อมูลเช่นเดียวกับวิธีการViewportข้างต้น
ชัดเจนว่าเป็นแนวคิดหลักของ OOP
วิธีใดถูกต้อง ฉันควรจะทำอย่างไรในการลดการพึ่งพาซึ่งกันและกันของชั้นเรียนและลดความรู้และการมีเพศสัมพันธ์ให้น้อยที่สุด แต่ไม่มีการออกแบบแปลก ๆ ที่ชั้นเรียนระดับต่ำทั้งหมดมีข้อมูลเท่านั้นและชั้นเรียนระดับสูงมีวิธีทั้งหมดหรือไม่ ไม่มีใครมีทางออกที่สามหรือมุมมองในการออกแบบชั้นเรียนที่หลีกเลี่ยงปัญหาทั้งหมดหรือไม่
PS นี่เป็นอีกตัวอย่าง:
สมมติว่าคุณมีคลาสDocumentIdที่ไม่เปลี่ยนรูปแบบมีเพียงBigDecimal idสมาชิกเดียวและทะเยอทะยานสำหรับสมาชิกนี้ ตอนนี้คุณต้องมีวิธีการบางอย่างซึ่งได้รับDocumentIdผลตอบแทนDocumentสำหรับรหัสนี้จากฐานข้อมูล
คุณ:
- เพิ่ม
Document getDocument(SqlSession)วิธีการในDocumentIdชั้นเรียนทันทีแนะนำความรู้เกี่ยวกับการคงอยู่ของคุณ ("we're using a database and this query is used to retrieve document by id"), API ที่ใช้ในการเข้าถึงฐานข้อมูลและสิ่งที่คล้ายกัน นอกจากนี้คลาสนี้ยังต้องการไฟล์ JAR ที่มีอยู่เพื่อคอมไพล์ - เพิ่มคลาสอื่น ๆ ด้วยวิธีการ
Document getDocument(DocumentId id)ปล่อยให้DocumentIdคลาสเป็นตายไม่มีพฤติกรรมคลาสที่มีโครงสร้างเหมือนกัน