ก่อนอื่นให้ชัดเจนในกระบวนทัศน์
- โครงสร้างข้อมูล -> เลย์เอาต์ของหน่วยความจำที่สามารถเคลื่อนที่และจัดการโดยฟังก์ชั่นที่มีความรู้ที่เหมาะสม
- วัตถุ -> โมดูลที่มีอยู่ในตัวเองซึ่งซ่อนการนำไปใช้งานและจัดเตรียมอินเทอร์เฟซที่อาจสื่อสารผ่าน
getter / setter มีประโยชน์ที่ไหน?
getters / Setters มีประโยชน์ในโครงสร้างข้อมูลหรือไม่ เลขที่
โครงสร้างข้อมูลเป็นข้อมูลจำเพาะเลย์เอาต์ของหน่วยความจำที่ใช้ร่วมกันและจัดการโดยกลุ่มฟังก์ชัน
โดยทั่วไปฟังก์ชั่นใหม่ที่เก่าสามารถเข้ามาและจัดการกับโครงสร้างข้อมูลได้หากทำเช่นนั้นในลักษณะที่ฟังก์ชั่นอื่นยังสามารถเข้าใจได้ฟังก์ชั่นจะเข้าร่วมกับตระกูล มิฉะนั้นมันเป็นฟังก์ชั่นอันธพาลและแหล่งที่มาของข้อบกพร่อง
อย่าเข้าใจฉันผิดอาจมีหลายครอบครัวที่ใช้งานฟังก์ชั่นที่รับประกันโครงสร้างข้อมูลที่มีสแนปเทิร์นโค้ทและเอเจนต์คู่ได้ทุกที่ ไม่เป็นไรเมื่อพวกเขาแต่ละคนมีโครงสร้างข้อมูลของตัวเองเล่น แต่เมื่อพวกเขาแบ่งปัน ... แค่คิดว่าครอบครัวอาชญากรรมหลายคนไม่เห็นด้วยกับการเมืองมันอาจกลายเป็นความยุ่งเหยิงอย่างรวดเร็ว
เมื่อกำหนดให้ฟังก์ชันส่วนขยายของระเบียบสามารถบรรลุได้มีวิธีเข้ารหัสโครงสร้างข้อมูลหรือไม่เพื่อให้ฟังก์ชั่นการโกงไม่ยุ่งเหยิงทุกอย่าง? ใช่พวกเขาถูกเรียกว่าวัตถุ
getters / setters มีประโยชน์ใน Objects หรือไม่? เลขที่
จุดทั้งหมดของการห่อโครงสร้างข้อมูลในวัตถุคือเพื่อให้แน่ใจว่าไม่มีฟังก์ชั่นอันธพาลอยู่ หากฟังก์ชั่นต้องการเข้าร่วมครอบครัวมันจะต้องได้รับการตรวจอย่างละเอียดก่อนแล้วจึงกลายเป็นส่วนหนึ่งของวัตถุ
จุด / วัตถุประสงค์ของผู้ทะเยอทะยานและผู้ตั้งค่าคือการอนุญาตให้ฟังก์ชั่นด้านนอกของวัตถุในการเปลี่ยนแปลงรูปแบบหน่วยความจำของวัตถุโดยตรง นั่นฟังดูเหมือนประตูเปิดที่จะอนุญาตให้โกง ...
The Edge Case
มีสองสถานการณ์คือประชาชนทะเยอทะยาน / สุนัขจิ้งจอกทำให้รู้สึก
- ส่วนของโครงสร้างข้อมูลภายในวัตถุได้รับการจัดการโดยวัตถุ แต่ไม่ได้ควบคุมโดยวัตถุ
- อินเทอร์เฟซที่อธิบายถึงนามธรรมระดับสูงของโครงสร้างข้อมูลซึ่งองค์ประกอบบางอย่างที่คาดว่าจะไม่สามารถควบคุมวัตถุที่ใช้งาน
คอนเทนเนอร์และอินเตอร์เฟสคอนเทนเนอร์เป็นตัวอย่างที่สมบูรณ์แบบของทั้งสองสถานการณ์ ภาชนะจัดการโครงสร้างข้อมูล (เชื่อมโยงรายการแผนที่ต้นไม้) ภายใน แต่มือควบคุมองค์ประกอบเฉพาะเพื่อทุกคน อินเทอร์เฟซที่เป็นนามธรรมนี้และละเว้นการใช้งานทั้งหมดและอธิบายเพียงแค่ความคาดหวัง
น่าเสียดายที่การใช้งานหลายอย่างผิดพลาดและกำหนดอินเทอร์เฟซของวัตถุประเภทต่าง ๆ เหล่านี้เพื่อให้สามารถเข้าถึงวัตถุจริงได้โดยตรง สิ่งที่ต้องการ:
interface Container<T>
{
typedef ...T... TRef; //<somehow make TRef to be a reference or pointer to the memory location of T
TRef item(int index);
}
นี่มันหัก การใช้งานของคอนเทนเนอร์จะต้องควบคุมอย่างชัดเจนภายในของพวกเขาไปยังคนที่ใช้พวกเขา ฉันยังไม่เห็นภาษาที่มีค่าที่ไม่แน่นอนซึ่งนี่เป็นสิ่งที่ดี (ภาษาที่มีความหมายที่ไม่เปลี่ยนค่ามีความหมายโดยละเอียดจากมุมมองของข้อมูลที่เสียหาย แต่ไม่จำเป็นต้องมาจากมุมมองการสอดแนมข้อมูล)
คุณสามารถปรับปรุง / แก้ไข getters / setter โดยใช้ copy-semantics เท่านั้นหรือใช้ proxy:
interface Proxy<T>
{
operator T(); //<returns a copy
... operator ->(); //<permits a function call to be forwarded to an element
Proxy<T> operator=(T); //< permits the specific element to be replaced/assigned by another T.
}
interface Container<T>
{
Proxy<T> item(int index);
T item(int index); //<When T is a copy of the original value.
void item(int index, T new_value); //<where new_value is used to replace the old value
}
ฟังก์ชั่นอันธพาลอาจยังคงเล่นเพลงประทุษร้ายได้ที่นี่ (ด้วยความพยายามมากที่สุดเท่าที่จะเป็นไปได้) แต่การลอกความหมายและ / หรือพร็อกซีช่วยลดโอกาสในการเกิดข้อผิดพลาดจำนวนมาก
- ล้น
- underflow
- การโต้ตอบกับองค์ประกอบย่อยคือการตรวจสอบประเภท / ประเภทที่ตรวจสอบได้ (ในภาษาที่สูญเสียประเภทนี้เป็นประโยชน์)
- องค์ประกอบที่แท้จริงอาจจะใช่หรือไม่ใช่หน่วยความจำ
Getters ส่วนตัว / Setters
นี่เป็นป้อมปราการสุดท้ายของ getters และ setters ที่ทำงานกับประเภทโดยตรง ในความเป็นจริงฉันจะไม่แม้แต่จะเรียกตัวรับและผู้ตั้งค่าเหล่านี้ แต่เป็นผู้เข้าถึงและจัดการ
ในบริบทนี้บางครั้งการจัดการส่วนที่เฉพาะเจาะจงของโครงสร้างข้อมูลเสมอ / เกือบตลอดเวลา / โดยทั่วไปต้องมีการเก็บหนังสือเฉพาะที่จะเกิดขึ้น พูดเมื่อคุณอัปเดตรูทของทรีแคชที่มองออกไปจะต้องถูกกำจัดหรือเมื่อคุณเข้าถึงองค์ประกอบข้อมูลภายนอกล็อคต้องได้รับ / ปล่อยออกมา ในกรณีเหล่านี้มันสมเหตุสมผลที่จะใช้หลักการของ DRY และห่อการกระทำเหล่านั้นเข้าด้วยกัน
ภายในบริบทส่วนตัวยังมีความเป็นไปได้ที่ฟังก์ชันอื่น ๆ ในตระกูลจะวาง 'getters and setters' และจัดการโครงสร้างข้อมูล ดังนั้นทำไมฉันคิดว่าพวกเขามากขึ้นในฐานะ accessors และ manipulators คุณสามารถเข้าถึงข้อมูลโดยตรงหรือพึ่งพาสมาชิกในครอบครัวคนอื่นเพื่อให้ได้ส่วนที่ถูกต้อง
Getters / Setters ที่ได้รับความคุ้มครอง
ในบริบทที่ได้รับการคุ้มครองไม่แตกต่างอย่างมากกับบริบทสาธารณะ ฟังก์ชั่นโกงอาจต่างประเทศต้องการเข้าถึงโครงสร้างข้อมูล ดังนั้นไม่หากพวกเขาอยู่พวกเขาทำงานเหมือนประชาชน getters / setters
this->variable = x + 5
หรือเรียกใช้UpdateStatistics
ฟังก์ชันในตัวตั้งค่าและในกรณีเหล่านั้นclassinstancea->variable = 5
จะทำให้เกิดปัญหา