แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้สาธารณะการป้องกันส่วนตัวหรือไม่


12

มันยุติธรรมที่จะบอกว่ามันเป็นวิธีที่ดีในการเริ่มต้นทุกอย่างให้privateล่วงหน้าเมื่อเขียนโค้ดบางอย่าง?

จากนั้นอัปเกรดprotectedเป็นคลาสย่อยเท่านั้นpublicหากต้องการคลาสอื่นหรือไม่


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

คำตอบ:


10

คำตอบสั้น ๆ : ใช่

คำตอบอีกต่อไป:

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

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

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

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


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

1
@ArukaJ แนวทางที่ดีคือการเขียนโค้ดที่จะใช้คลาสของคุณก่อนที่คุณจะสร้างการใช้งาน นี่อาจเป็นปัญหาไก่หรือไข่จนกว่าคุณจะเริ่มเขียนบททดสอบก่อน
JimmyJames

1
@ArukaJ วงกว้างใช่; ซึ่งในตอนแรกอาจดูเหมือนยากกว่าที่จะทำแม้ว่าจิมมี่เจมส์จะกล่าวถึงมันรู้สึกได้ง่ายขึ้นเมื่อคุณเขียนบททดสอบ มันอาจเกี่ยวข้องกับความคิดที่แตกต่างออกไปเล็กน้อย แต่เป้าหมายคือการคิดให้รอบคอบมากขึ้นว่าคลาสของคุณเป็นอย่างไรและสิ่งที่อินพุต / เอาท์พุตของคุณมีลักษณะอย่างไร - โดยรวมแล้วเป็นเพียงวิธีคิดแบบ "OO" ที่มากขึ้น มีแนวโน้มที่จะส่งผลให้คลาสห่อหุ้มอย่างเรียบร้อยด้วยการทำงานร่วมกันสูง
Ben Cottrell

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

8

"จากนั้นอัปเกรดเป็นแบบป้องกันหากคลาสย่อยต้องการหรือเป็นแบบสาธารณะถ้าคลาสอื่นต้องการหรือไม่"

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

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


สมมติว่าคุณได้เรียนว่าคุณไม่ได้ตั้งใจที่จะ subclass ในขณะนี้ (และอาจจะไม่จำเป็นต้อง) และวิธีการที่ว่าถ้าคุณเป็นประเภทรองชั้นเรียนของคุณจะมีประโยชน์ / จำเป็นต้อง / โดยประเภทรอง คุณจะทำให้วิธีการที่privateหรือprotected?
lfk

ควรเป็นคำตอบที่ยอมรับทำให้ทุกอย่างเป็นส่วนตัวในตอนแรกเหมือนว่าฉันไม่ต้องการคิด / ออกแบบ
Niing

1

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

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

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

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