แนวคิดพื้นฐานที่อยู่เบื้องหลัง 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
คลาสเป็นตายไม่มีพฤติกรรมคลาสที่มีโครงสร้างเหมือนกัน