ปัญหาหลักของที่นี่คือ Encapsulation ไม่ใช่แนวคิดที่กำหนดไว้อย่างเข้มงวดและทำไมจึงมีประโยชน์ การทำวิจัยบางอย่างแสดงให้เห็นว่าผู้คนเห็นการห่อหุ้มมีความเห็นสูงและผู้คนจำนวนมากสับสนกับสิ่งที่เป็นนามธรรม
คำจำกัดความแรกที่คุณจะพบคือ
Encapsulation เป็นแนวคิดที่เชื่อมโยงข้อมูลและฟังก์ชันเข้าด้วยกันที่จัดการข้อมูล ...
หากนี่เป็นคำจำกัดความของคุณภาษาส่วนใหญ่จะมีวิธีจัดกลุ่มข้อมูลและฟังก์ชั่นที่ทำงานกับข้อมูลนั้นลงในคลาสโมดูลห้องสมุดเนมสเปซ ฯลฯ
แต่ฉันจะยืนยันว่าไม่ใช่จุดประสงค์หลักของการห่อหุ้มเนื่องจากคำจำกัดความดังกล่าวยังคงดำเนินต่อไป:
... และนั่นทำให้ทั้งคู่ปลอดภัยจากการรบกวนจากภายนอกและการใช้ในทางที่ผิด
Wikipedia เห็นด้วยกับสิ่งต่อไปนี้:
กลไกภาษาสำหรับ จำกัด การเข้าถึงโดยตรงไปยังองค์ประกอบบางส่วนของวัตถุ
แต่ตอนนี้เราต้องถามสิ่งที่มีความหมายโดย "การรบกวนและการใช้ในทางที่ผิด" และทำไมจึงควร จำกัด การเข้าถึงข้อมูลโดยตรง ฉันเชื่อว่ามีสองเหตุผล
ข้อแรกคือขอบเขตที่ จำกัด ซึ่งข้อมูลสามารถกลายพันธุ์ได้นั้นเป็นประโยชน์สูงสุดของนักพัฒนา บ่อยครั้งเกินไปที่จำเป็นต้องมีตรรกะก่อน / หลังตั้งค่า และการมีสถานที่จำนวน จำกัด ที่สามารถตั้งค่าได้นั้นมีค่าอย่างยิ่ง ในภาษา OOP สามารถทำได้โดยใช้คลาส ในการปิดการใช้งานภาษา "ไม่แน่นอน" มีวัตถุประสงค์เดียวกัน และเนื่องจากเรารู้ว่าคลาส = การปิดจึงเป็นสิ่งที่พิสูจน์ได้มากกว่าภาษาที่ใช้งานไม่ได้ซึ่งแตกต่างจาก "กระบวนทัศน์" ถึง OOP
แต่สิ่งที่เกี่ยวกับภาษาที่ไม่เปลี่ยนรูป? ไม่มีปัญหาในการกลายพันธุ์ของตัวแปร นี่คือที่มาของปัญหาที่สอง: ฟังก์ชันการเชื่อมโยงและข้อมูลอนุญาตให้เก็บข้อมูลนั้นในสถานะที่ถูกต้อง Email
ลองนึกภาพคุณมีโครงสร้างไม่เปลี่ยนรูปสำหรับ โครงสร้างนี้มีstring
ฟิลด์เดียว เรามีข้อกำหนดว่าถ้าคุณมีค่าประเภทEmail
แล้วฟิลด์นั้นมีที่อยู่ที่ถูกต้อง ในการห่อหุ้มของ OOP สิ่งนี้ทำได้ง่ายโดยการประกาศฟิลด์private
นั้นโดยให้Get
วิธีการและมีเท่านั้นconstructor method
ที่ประสบความสำเร็จก็ต่อเมื่อผ่านในสตริงเป็นที่อยู่ที่ถูกต้อง สิ่งที่คล้ายกันกับการปิด ตอนนี้สำหรับภาษาที่ไม่เปลี่ยนรูปแบบก็จะต้องมีวิธีบอกว่าโครงสร้างสามารถเริ่มต้นได้ผ่านฟังก์ชั่นเฉพาะและฟังก์ชั่นดังกล่าวสามารถล้มเหลว และฉันไม่ได้ตระหนักถึงภาษาใด ๆ ที่จะตรงกับเกณฑ์นั้น (บางทีใครบางคนในความคิดเห็นสามารถสอนฉัน)
ปัญหาล่าสุดคือสิ่งที่มีความหมายโดยภาษา "สนับสนุน" การห่อหุ้ม อีกด้านหนึ่งมีภาษาที่อนุญาตให้บังคับใช้การห่อหุ้มดังนั้นรหัสจะไม่รวบรวมหากการห่อหุ้มขาด ในอีกด้านหนึ่งภาษาอาจให้วิธีการทำแค็ปซูล แต่มันไม่ได้บังคับใช้โดยปล่อยให้นักพัฒนาซอฟต์แวร์บังคับใช้เอง สำหรับกรณีที่สองภาษาใด ๆ ที่มีโครงสร้างและฟังก์ชั่นสามารถทำงานได้ ภาษาไดนามิกและแฮสเค็ลล์คำนึงถึง และฉันจะบอกว่ามีไม่กี่ภาษาที่ตกหลุมอีกด้านของสเปกตรัม แม้แต่ C # ซึ่งดีมากในการบังคับใช้การห่อหุ้มสำหรับวัตถุนั้นสามารถข้ามโดยใช้การสะท้อน แต่เมื่อเห็นว่าใน C # จะถือว่ามีกลิ่นของรหัสขนาดใหญ่และไม่มีนักพัฒนา C # คนใดที่ทำสิ่งนี้ด้วยความเต็มใจ