รหัสเช่น:
public Thing[] getThings(){
return things;
}
ไม่สมเหตุสมผลนักเนื่องจากวิธีการเข้าถึงของคุณไม่ได้ทำอะไรเลย แต่ส่งคืนโครงสร้างข้อมูลภายในโดยตรง คุณอาจมีเพียงการประกาศให้เป็นThing[] things
public
แนวคิดเบื้องหลังวิธีการเข้าถึงคือการสร้างอินเทอร์เฟซที่ป้องกันลูกค้าจากการเปลี่ยนแปลงภายในและขัดขวางพวกเขาจากการจัดการโครงสร้างข้อมูลจริงยกเว้นในวิธีที่รอบคอบตามที่ได้รับอนุญาตจากอินเตอร์เฟส เมื่อคุณค้นพบเมื่อรหัสลูกค้าทั้งหมดของคุณแตกวิธีการเข้าถึงของคุณไม่ได้ทำเช่นนั้น - มันเป็นเพียงแค่โค้ดที่เสียไป ฉันคิดว่าโปรแกรมเมอร์จำนวนมากมักเขียนโค้ดแบบนี้เพราะพวกเขาได้เรียนรู้ว่าทุกสิ่งจำเป็นต้องห่อหุ้มด้วยวิธีการเข้าถึง - แต่นั่นเป็นเหตุผลที่ฉันอธิบาย ทำเพียงเพื่อ "ติดตามแบบฟอร์ม" เมื่อวิธีการเข้าถึงไม่ได้ให้บริการเพื่อจุดประสงค์ใด ๆ เป็นเพียงจุดรบกวน
ฉันขอแนะนำวิธีแก้ปัญหาที่เสนอของคุณซึ่งบรรลุเป้าหมายที่สำคัญที่สุดของการห่อหุ้ม: ทำให้ลูกค้ามีอินเทอร์เฟซที่แข็งแกร่งและรอบคอบที่ป้องกันพวกเขาจากรายละเอียดการใช้งานภายในห้องเรียนของคุณและไม่อนุญาตให้พวกเขาสัมผัสโครงสร้างข้อมูลภายใน คาดหวังในวิธีที่คุณตัดสินใจว่ามีความเหมาะสม - "กฎหมายของสิทธิพิเศษที่จำเป็นน้อยที่สุด" หากคุณดูกรอบ OOP ยอดนิยมที่มีขนาดใหญ่เช่น CLR, STL, VCL รูปแบบที่คุณเสนอนั้นเป็นที่แพร่หลายด้วยเหตุผลดังกล่าว
คุณควรทำเช่นนั้นเสมอ ไม่จำเป็น. ตัวอย่างเช่นหากคุณมีคลาสผู้ช่วยหรือเพื่อนที่เป็นส่วนประกอบของคลาสคนงานหลักของคุณและไม่ใช่ "การเผชิญหน้ากับด้านหน้า" คุณก็ไม่จำเป็น - มันเป็น overkill ที่จะเพิ่มรหัสที่ไม่จำเป็นจำนวนมาก และในกรณีนี้ฉันจะไม่ใช้วิธีการเข้าถึงเลย - มันไม่มีเหตุผลตามที่อธิบาย เพียงประกาศโครงสร้างข้อมูลในแบบที่กำหนดขอบเขตให้กับคลาสหลักที่ใช้เท่านั้น - ภาษาส่วนใหญ่รองรับวิธีการทำเช่นนั้น - friend
หรือประกาศในไฟล์เดียวกันกับคลาสของผู้ปฏิบัติงานหลักเป็นต้น
ข้อเสียเดียวที่ฉันเห็นในข้อเสนอของคุณคือมันทำงานได้ดีกว่าในการเขียนโค้ด (และตอนนี้คุณจะต้องเขียนรหัสคลาสผู้บริโภคของคุณอีกครั้ง - แต่คุณต้อง / ต้องทำเช่นนั้น) - คุณต้องทำมันให้ถูกต้องและบางครั้งก็ใช้งานได้มากกว่า
หนึ่งในสิ่งที่ทำให้โปรแกรมเมอร์ที่ดีดีคือพวกเขารู้ว่าเมื่อใดที่การทำงานพิเศษนั้นคุ้มค่าและเมื่อมันไม่ใช่ ในระยะยาวการวางเงินพิเศษตอนนี้จะจ่ายด้วยเงินปันผลจำนวนมากในอนาคต - หากไม่ได้อยู่ในโครงการนี้ เรียนรู้การเขียนโค้ดให้ถูกวิธีและใช้หัวของคุณเกี่ยวกับเรื่องนี้
โปรดทราบว่าการรวบรวมที่ซับซ้อนกว่าอาร์เรย์อาจต้องใช้คลาสที่ล้อมรอบเพื่อใช้วิธีการมากกว่าสามวิธีในการเข้าถึงโครงสร้างข้อมูลภายใน
หากคุณเปิดเผยโครงสร้างข้อมูลทั้งหมดผ่านคลาสที่มี IMO คุณต้องคิดว่าเหตุใดคลาสดังกล่าวจึงถูกห่อหุ้มอยู่ทั้งหมดหากไม่ใช่เพียงแค่ให้อินเทอร์เฟซที่ปลอดภัยกว่า - "wrapper class" คุณกำลังบอกว่าคลาสที่มีอยู่นั้นไม่มีอยู่สำหรับจุดประสงค์นั้น - ดังนั้นอาจมีบางอย่างไม่ถูกต้องเกี่ยวกับการออกแบบของคุณ พิจารณาแบ่งชั้นเรียนของคุณออกเป็นโมดูลที่รอบคอบมากขึ้น
คลาสควรมีจุดประสงค์ที่ชัดเจนและรอบคอบและมีอินเทอร์เฟซเพื่อสนับสนุนการทำงานนั้น - ไม่มาก คุณอาจพยายามรวมกลุ่มสิ่งต่าง ๆ เข้าด้วยกันที่ไม่ได้อยู่ด้วยกัน เมื่อคุณทำสิ่งต่าง ๆ จะแตกหักทุกครั้งที่คุณทำการเปลี่ยนแปลง ยิ่งชั้นเรียนของคุณเล็กและสุขุมมากเท่าไหร่การเปลี่ยนสิ่งต่าง ๆ ง่ายขึ้น: คิดว่าเลโก้
get(index)
,add()
,size()
, และremove(index)
remove(Object)
โดยใช้เทคนิคที่เสนอคลาสที่มี ArrayList นี้จะต้องมีห้าวิธีสาธารณะเพียงเพื่อมอบหมายให้คอลเลกชันภายใน และจุดประสงค์ของคลาสนี้ในโปรแกรมนั้นมักจะไม่ห่อหุ้ม ArrayList นี้ แต่เป็นการทำอย่างอื่น ArrayList เป็นเพียงรายละเอียด [... ]