กำลังมองหากรณีการใช้งานเฉพาะที่ทั้งคลาสย่อยและคลาสภายในแพ็คเกจเดียวกันจำเป็นต้องเข้าถึงเขตข้อมูลหรือวิธีการที่ได้รับการป้องกัน ...
สำหรับฉันแล้วกรณีการใช้งานดังกล่าวค่อนข้างทั่วไปกว่าเฉพาะและมันเกิดจากการตั้งค่าของฉันไปที่:
- เริ่มต้นด้วยตัวดัดแปลงการเข้าถึงที่เข้มงวดที่สุดเท่าที่จะเป็นไปได้โดยใช้วิธีที่อ่อนแอกว่าในภายหลังเท่าที่จำเป็น
- มีการทดสอบหน่วยอยู่ในแพ็คเกจเดียวกันกับรหัสทดสอบ
จากด้านบนฉันสามารถเริ่มออกแบบสำหรับวัตถุของฉันด้วยตัวดัดแปลงการเข้าถึงเริ่มต้น (ฉันจะเริ่มต้นด้วยprivate
แต่นั่นจะทำให้การทดสอบหน่วยซับซ้อน):
public class Example {
public static void main(String [] args) {
new UnitTest().testDoSomething(new Unit1(), new Unit2());
}
static class Unit1 {
void doSomething() {} // default access
}
static class Unit2 {
void doSomething() {} // default access
}
static class UnitTest {
void testDoSomething(Unit1 unit1, Unit2 unit2) {
unit1.doSomething();
unit2.doSomething();
}
}
}
บันทึก Side ในตัวอย่างข้างต้นUnit1
, Unit2
และUnitTest
มีการซ้อนกันภายในExample
สำหรับความเรียบง่ายของงานนำเสนอ แต่ในโครงการจริงผมน่าจะมีชั้นเรียนเหล่านี้ในแฟ้มที่แยกต่างหาก (และUnitTest
แม้กระทั่งในไดเรกทอรีที่แยกต่างหาก )
จากนั้นเมื่อมีความจำเป็นเกิดขึ้นฉันจะลดการควบคุมการเข้าถึงจากค่าเริ่มต้นเป็นprotected
:
public class ExampleEvolved {
public static void main(String [] args) {
new UnitTest().testDoSomething(new Unit1(), new Unit2());
}
static class Unit1 {
protected void doSomething() {} // made protected
}
static class Unit2 {
protected void doSomething() {} // made protected
}
static class UnitTest {
// ---> no changes needed although UnitTest doesn't subclass
// ...and, hey, if I'd have to subclass... which one of Unit1, Unit2?
void testDoSomething(Unit1 unit1, Unit2 unit2) {
unit1.doSomething();
unit2.doSomething();
}
}
}
คุณเห็นฉันสามารถให้รหัสการทดสอบหน่วยExampleEvolved
ไม่เปลี่ยนแปลงเนื่องจากวิธีการป้องกันการเข้าถึงจากแพคเกจเดียวกันแม้ว่าการเข้าถึงวัตถุไม่ได้ชั้นย่อย
ต้องการการเปลี่ยนแปลงน้อยลง => การปรับเปลี่ยนที่ปลอดภัยยิ่งขึ้น; หลังจากทั้งหมดที่ฉันเปลี่ยนเพียงแค่ตัวดัดแปลงการเข้าถึงและฉันไม่ได้แก้ไขวิธีการUnit1.doSomething()
และสิ่งที่Unit2.doSomething()
ทำดังนั้นจึงเป็นเรื่องปกติที่จะคาดว่ารหัสการทดสอบหน่วยจะทำงานต่อไปโดยไม่มีการดัดแปลง
protected
นี้หรือไม่ถ้าเป็นคลาสย่อยเท่านั้น สุจริตเป็นเวลานานฉันอยู่ภายใต้ความประทับใจที่เป็นพฤติกรรม