"สวัสดี Amigo! ฉันต้องการอุทิศการบรรยายในวันนี้ให้กับการห่อหุ้มคุณมีความคิดทั่วไปอยู่แล้วว่ามันคืออะไร"

การห่อหุ้ม - 1

แล้วข้อดีของการห่อหุ้มคืออะไร? มีมากมาย แต่ข้าพเจ้าจะชี้ให้เห็นสี่ประการที่สำคัญที่สุดในความเห็นของข้าพเจ้า:

1) สถานะภายในที่ถูกต้อง

โปรแกรมมักมีหลายคลาสที่โต้ตอบกับวัตถุเดียวกัน โดยการโต้ตอบพร้อมกันกับข้อมูลภายในของออบเจ็กต์ สิ่งเหล่านี้อาจละเมิดความสมบูรณ์ของข้อมูลของออบเจ็กต์ ทำให้ออบเจ็กต์หยุดทำงานอย่างถูกต้อง

ดังนั้นอ็อบเจกต์จึงต้องติดตามการเปลี่ยนแปลงใดๆ ต่อข้อมูลภายใน หรือดีกว่านั้น – มันควรจะเป็นคนทำการเปลี่ยนแปลงเหล่านั้น

หากเราไม่ต้องการให้ตัวแปรคลาสบางตัวถูกเปลี่ยนแปลงโดยคลาสอื่น เราจะประกาศตัวแปรคลาสเป็นส่วนตัวซึ่งหมายความว่าเฉพาะเมธอดของคลาสนั้นเท่านั้นที่สามารถเข้าถึงได้ หากเราต้องการให้ตัวแปรเป็นแบบอ่านอย่างเดียวสำหรับคลาสอื่น เราจะเพิ่มpublic getterให้กับตัวแปรเหล่านี้

ตัวอย่างเช่น เราอาจต้องการให้ทุกคนรู้ว่ามีกี่องค์ประกอบในคอลเล็กชันของเรา แต่ไม่ควรมีใครเปลี่ยนแปลงได้หากไม่ได้รับอนุญาตจากเรา ในกรณีนี้ เราประกาศตัวแปรจำนวน int ส่วนตัวและเมธอด สาธารณะ getCount ( )

การห่อหุ้มที่เหมาะสมรับประกันว่าคลาสอื่นไม่สามารถเข้าถึงข้อมูลภายในของคลาสของเราได้โดยตรง และด้วยเหตุนี้จึงไม่สามารถแก้ไขได้โดยที่เราไม่สามารถควบคุมการกระทำของพวกเขาได้ พวกเขาต้องเรียกใช้เมธอดในคลาสที่มีตัวแปรที่จะเปลี่ยนแปลง

เป็นการดีที่สุดที่จะสันนิษฐานว่าโปรแกรมเมอร์คนอื่นๆ จะใช้ชั้นเรียนของคุณในวิธีที่สะดวกที่สุดสำหรับพวกเขาเสมอ ไม่ใช่วิธีที่ปลอดภัยที่สุดสำหรับคุณ (หรือชั้นเรียนของคุณ) นี่เป็นแหล่งที่มาของข้อบกพร่องและวิธีป้องกัน

2) การตรวจสอบพารามิเตอร์

บางครั้งคุณต้องตรวจสอบพารามิเตอร์ที่ส่งไปยังเมธอดของคลาสของคุณ ตัวอย่างเช่น สมมติว่าเรามีชั้นเรียนที่แสดงถึง "บุคคล" และคุณสามารถระบุวันเกิดได้ เราควรตรวจสอบว่าข้อมูลที่ส่งผ่านสอดคล้องกับตรรกะของโปรแกรมและตรรกะของคลาส เช่น ไม่มีเดือนที่ 13 ไม่มีวันที่ 30 กุมภาพันธ์ เป็นต้น

“ทำไมใคร ๆ ถึงระบุวันเกิดเป็นวันที่ 30 กุมภาพันธ์”

"อย่างแรกเลย อาจเป็นผลมาจากข้อผิดพลาดในการป้อนข้อมูล"

ประการที่สอง ก่อนที่โปรแกรมจะทำงานเหมือนเครื่องจักร อาจมีข้อบกพร่องมากมาย ตัวอย่างเช่นสิ่งนี้อาจเกิดขึ้น

โปรแกรมเมอร์เขียนโค้ดที่กำหนดว่าใครมีวันเกิดในวันมะรืนนี้ สมมติว่าวันนี้เป็นวันที่ 3 มีนาคม โปรแกรมเพิ่ม 2 ให้กับวันที่ปัจจุบันและค้นหาทุกคนที่เกิดในวันที่ 5 มีนาคม จนถึงตอนนี้ดีมาก

แต่เมื่อถึงวันที่ 30 มีนาคม โปรแกรมไม่พบใครเลย เนื่องจากไม่มีวันที่ 32 มีนาคม โปรแกรมจะมีปัญหาน้อยกว่ามากเมื่อเมธอดทำการตรวจสอบพารามิเตอร์"

"ฉันจำได้ว่าตอนที่เราศึกษา ArrayList ฉันดูโค้ดของมัน และมีการตรวจสอบในเมธอด get และ set เพื่อให้แน่ใจว่าพารามิเตอร์ดัชนีมีค่ามากกว่าหรือเท่ากับศูนย์และน้อยกว่าความยาวของอาร์เรย์ โค้ดจะส่ง ยกเว้นในกรณีที่อาร์เรย์ไม่มีองค์ประกอบที่สอดคล้องกับดัชนี

"ใช่ นั่นเป็นการตรวจสอบอินพุตแบบคลาสสิก "

3) บั๊กน้อยลงเมื่อเปลี่ยนโค้ดภายในคลาส

สมมติว่าเราเขียนชั้นเรียนที่มีประโยชน์จริงๆ โดยเป็นส่วนหนึ่งของโครงการขนาดใหญ่ ทุกคนชอบมันมากจนโปรแกรมเมอร์คนอื่นเริ่มใช้มันในหลายร้อยแห่งในรหัสของพวกเขาเอง

ชั้นเรียนนี้มีประโยชน์มากจนคุณตัดสินใจปรับปรุง แต่ถ้าคุณกำจัดเมธอดใด ๆ ในคลาส โค้ดของโปรแกรมเมอร์อื่น ๆ อีกนับสิบจะไม่คอมไพล์อีกต่อไป พวกเขาจะต้องเขียนโค้ดใหม่อย่างรวดเร็ว และยิ่งมีการเขียนซ้ำมากเท่าไหร่ก็ยิ่งมีโอกาสเกิดข้อบกพร่องมากขึ้นเท่านั้น หากคุณทำลายสิ่งก่อสร้างเป็นประจำ คุณจะถูกเกลียด

แต่ถ้าเราเปลี่ยนเมธอดที่ทำเครื่องหมายเป็นไพรเวต เรารู้ว่าเมธอดเหล่านี้ไม่ได้ถูกเรียกใช้โดยโค้ดของใครก็ตาม เราสามารถเขียนใหม่ได้ และเปลี่ยนจำนวนและประเภทของพารามิเตอร์ และโค้ดที่อ้างอิงจะยังคงใช้งานได้ หรืออย่างน้อยก็จะยังคงรวบรวม

4) เรากำหนดว่าวัตถุอื่นจะมีปฏิสัมพันธ์กับวัตถุของเราอย่างไร

เราสามารถจำกัดการกระทำใด ๆ กับวัตถุของเราได้ ตัวอย่างเช่น เราอาจต้องการสร้างอินสแตนซ์ของคลาสเพียงหนึ่งอินสแตนซ์ แม้ว่าจะถูกสร้างขึ้นในหลายๆ ที่พร้อมๆ กันในโครงการก็ตาม และเราสามารถทำได้โดยใช้การห่อหุ้ม

การห่อหุ้ม - 2

Encapsulation ช่วยให้ เรากำหนดข้อจำกัดเพิ่มเติมที่อาจกลายเป็นผลประโยชน์เพิ่มเติม ตัวอย่างเช่น คลาส String ถูกนำไปใช้เป็นวัตถุที่ไม่เปลี่ยนรูปแบบ อินสแตนซ์ของคลาส String ไม่สามารถเปลี่ยนแปลงระหว่างการสร้างและการทำลายได้ เมธอดทั้งหมดของคลาสสตริง (remove, substring, ...) ส่งคืนสตริงใหม่และไม่มีทางเปลี่ยนวัตถุที่ถูกเรียกใช้

"วัวศักดิ์สิทธิ์ มันเป็นอย่างนั้น"

"การห่อหุ้มเป็นสิ่งที่น่าสนใจ"

"ฉันเห็นด้วย."