ความแตกต่างระหว่าง "การซ่อนข้อมูล" และ "การห่อหุ้มข้อมูล" คืออะไร?


29

ฉันกำลังอ่าน "การทำงานพร้อมกันของ Java ในทางปฏิบัติ" และมีการกล่าวว่า: "โชคดีที่เทคนิคเชิงวัตถุเดียวที่ช่วยให้คุณเขียนคลาสที่มีการจัดการที่ดีและบำรุงรักษาได้เช่น encapsulation และการซ่อนข้อมูล - สามารถช่วยคุณสร้าง thread-safe ชั้นเรียน."

ปัญหา # 1 - ฉันไม่เคยได้ยินเกี่ยวกับการซ่อนข้อมูลและไม่รู้ว่ามันคืออะไร

ปัญหา # 2 - ฉันคิดเสมอว่า encapsulation ใช้ private vs public และจริงๆแล้วคือการซ่อนข้อมูล

คุณช่วยอธิบายการซ่อนข้อมูลคืออะไรและแตกต่างจากการห่อหุ้มข้อมูลได้อย่างไร


2
อ่านรหัสรุ่นที่ 2 ที่สมบูรณ์ มันจะตอบคำถามของคุณมากมาย
Shiplu Mokaddim

เกี่ยวกับการซ่อนข้อมูลดู: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis

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

คำตอบ:


19

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

Encapsulation เป็นคำที่พบในกระบวนทัศน์เชิงวัตถุและหมายถึงการเก็บข้อมูลในเขตข้อมูลส่วนตัวและปรับเปลี่ยนผ่านวิธีการเท่านั้น

ดังนั้นencapsulation อาจจะมองว่าเป็นวิธีของการบรรลุข้อมูลที่ซ่อนตัวอยู่ในระบบเชิงวัตถุ


1
ขอบคุณที่ตอบ. ฉันยังคงไม่เข้าใจว่าทำไมหากการซ่อนข้อมูลเหมือนกัน แต่เพียงเล็กน้อยที่กว้างกว่าการห่อหุ้มมันจะถูกอ้างถึงในหนังสือราวกับว่ามันมีความกว้างที่คล้ายกันและไม่มีใครรวมอยู่ด้วย
dhblah

ผู้เขียนอาจสร้างความแตกต่างจากการซ่อนข้อมูลและการซ่อนข้อมูลในแง่ที่ว่าการซ่อนข้อมูลเพียงซ่อนโครงสร้างข้อมูล - เขตข้อมูลส่วนตัว - ในขณะที่การซ่อนข้อมูลอาจหมายถึงการห่อหุ้มรายละเอียดการใช้งาน (อัลกอริทึม
m3th0dman

2
คุณสามารถมีได้โดยไม่ต้องมีอีกอัน - ดูที่ Python ที่ไม่มีข้อมูลซ่อนอยู่เลย (ไม่มีสิ่งใดเป็นแอตทริบิวต์ส่วนตัวหรือป้องกัน)
Latty

@ ประเด็นของ Lattyware นั้นมีความจริงและสำคัญมาก หนึ่งสามารถมี encapsulation (ตามคำนิยามของคุณซึ่งฉันคัดค้านเพราะสิ่งที่ฉันอธิบายที่นี่) โดยไม่ต้องซ่อนอะไรคือโดยสุ่มสี่สุ่มห้าเผยให้เห็นทะเยอทะยานทะเยอทะยานและ setter สำหรับสมาชิกทุกคน นั่นไม่ได้ซ่อนอะไรเลยและไม่ได้ป้องกันอะไรเลย แต่เติมเต็มความหมายทั่วไปของการห่อหุ้มจดหมาย

1
การห่อหุ้มไม่ได้เก็บข้อมูลในเขตข้อมูลส่วนตัวนั่นคือการซ่อนข้อมูลเพิ่มเติม การห่อหุ้มโดยทั่วไปคือแนวคิดของการรวบรวมข้อมูล / ข้อมูลและวิธีการรวมเข้าด้วยกันเป็นชั้นเรียน
nbro

6

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

Abstraction และ encapsulation เป็นแนวคิดเสริม: Abstraction มุ่งเน้นไปที่พฤติกรรมที่สังเกตได้ของวัตถุในขณะที่ Encapsulation มุ่งเน้นไปที่การใช้งานที่ก่อให้เกิดพฤติกรรมนี้ การห่อหุ้มข้อมูลมักกระทำผ่านการซ่อนข้อมูล (ไม่ใช่เพียงการซ่อนข้อมูล) ซึ่งเป็นกระบวนการซ่อนความลับทั้งหมดของวัตถุที่ไม่ได้มีส่วนร่วมในลักษณะที่สำคัญ โดยทั่วไปแล้วโครงสร้างของวัตถุจะถูกซ่อนไว้รวมถึงการนำวิธีการไปใช้


5

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


4

จากวิกิพีเดีย :

ในภาษาการเขียนโปรแกรม encapsulationถูกใช้เพื่ออ้างถึงหนึ่งในสองแนวคิดที่เกี่ยวข้อง แต่แตกต่างกันและบางครั้งการรวมกันของมัน:

  • กลไกภาษาสำหรับจำกัด การเข้าถึงส่วนประกอบบางส่วนของวัตถุ
  • โครงสร้างภาษาที่อำนวยความสะดวก รวมข้อมูลด้วยวิธีการ (หรือฟังก์ชั่นอื่น ๆ ) ในการทำงานกับข้อมูลนั้น

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

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


ขอบคุณสำหรับการตอบกลับของคุณ. คำถามติดตามผล: 1) ภาษาการเขียนโปรแกรมจาวามีสิ่งอำนวยความสะดวกที่ความคิดที่สองที่เกี่ยวข้องกับการห่อหุ้มหมายถึง? 2) ฉันไม่เข้าใจว่าทำไมการซ่อนข้อมูลจึงสำคัญ เช่นใน java คุณสามารถเข้าถึงฟิลด์ใด ๆ (สาธารณะหรือส่วนตัว) ผ่านการสะท้อนกลับ
dhblah

@Software Engeneering Learner: คลาสที่สร้างซอร์สโค้ดแสดงถึงแนวคิดที่สอง สำหรับการซ่อนข้อมูลจุดคือการ จำกัด ขอบเขตของข้อมูลมักขึ้นอยู่กับกลไกภาษาเฉพาะและแยกต่างหาก
Michael Borgwardt

2

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

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

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


0

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

โปรดทราบว่า Python อนุญาตให้ม้วนข้อมูลในคลาส แต่ไม่อนุญาตให้ใช้ตัวแปรส่วนตัว ดังนั้นจึงอาจกล่าวได้ว่า Python ให้การห่อหุ้มโดยไม่ต้องซ่อนข้อมูล

คุณสามารถทำสิ่งเดียวกันใน Java โดยการทำให้ตัวแปรสมาชิกทั้งหมดของคุณpublicแต่นอกเหนือจากการให้หัวใจวายทุกคนคุณจะสูญเสียประโยชน์จากการซ่อนข้อมูล ... นั่นคือการรักษาความหมายของวัตถุโดย จำกัด การเข้าถึงสถานะของมัน


0

ใน OO นั้นEncapsulationเป็นที่เก็บข้อมูลภายใน Object ตัวอย่างเช่น a Personมีnameและลูกค้าของบุคคล (เช่นคุณ) รู้ว่าบุคคลถือชื่อไม่ว่าจะโดยวิธีการสาธารณะหรือวิธีการเข้าถึง และหวังว่าคุณไม่จำเป็นต้องถือชื่อในชื่อโกลบอลเช่นกันดังนั้นนี่จึงเป็นขั้นตอนใหญ่ที่จะหลีกเลี่ยงรหัสสปาเก็ตตี้ที่ไม่สามารถจัดการได้ แต่ลูกค้ายังจำเป็นต้องรู้อะไรเกี่ยวกับวิธีที่ Person จัดการกับชื่อ: space หรือคั่นด้วยเครื่องหมายจุลภาค?

ซ่อนข้อมูลเป็นที่ที่Personมีเขตข้อมูลชื่อ แต่อย่างน้อยในทางทฤษฎีไม่มีใครรู้ว่า ฟิลด์นี้เป็นแบบส่วนตัวโดยไม่มีวิธีการเข้าถึงแบบสาธารณะ ลูกค้าอาจส่งชื่อจากบันทึกฐานข้อมูล, XML, HTTP POST, อะไรก็ได้ แต่การทำงานภายในของวิธีการที่บุคคลจัดการชื่อเป็น "กล่องดำ" การใช้งานในอนาคตของคนมีอิสระในการเปลี่ยนแปลงเช่นการสลับไปมีและfirstNamelastName

ในโลกอุดมคติของ Data Hiding นั้นเหนือกว่า Encapsulation แต่ไม่ใช่ทุกโลกที่เหมาะ :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.