ใน codebase Java ของเราฉันเห็นรูปแบบต่อไปนี้:
/**
This is a stateless utility class
that groups useful foo-related operations, often with side effects.
*/
public class FooUtil {
public int foo(...) {...}
public void bar(...) {...}
}
/**
This class does applied foo-related things.
*/
class FooSomething {
int DoBusinessWithFoo(FooUtil fooUtil, ...) {
if (fooUtil.foo(...)) fooUtil.bar(...);
}
}
สิ่งที่รบกวนจิตใจฉันคือฉันต้องส่งตัวอย่างของFooUtilทุกที่เพราะการทดสอบ
- ฉันไม่สามารถทำให้
FooUtilวิธีการคงที่เพราะฉันจะไม่สามารถเยาะเย้ยพวกเขาสำหรับการทดสอบทั้งFooUtilชั้นเรียนและลูกค้า - ฉันไม่สามารถสร้างอินสแตนซ์ของ
FooUtilสถานที่บริโภคด้วยnewอีกครั้งเพราะฉันจะไม่สามารถเยาะเย้ยมันสำหรับการทดสอบ
ฉันคิดว่าทางออกที่ดีที่สุดของฉันคือการใช้การฉีด (และฉันทำ) แต่มันเพิ่มชุดยุ่งยากของตัวเอง นอกจากนี้การใช้อินสแตนซ์หลายตัวจะขยายขนาดของรายการพารามิเตอร์เมธอด
มีวิธีจัดการกับสิ่งที่ดีกว่าที่ฉันไม่เห็นหรือไม่?
อัปเดต:เนื่องจากคลาสยูทิลิตี้ไร้สัญชาติฉันอาจเพิ่มINSTANCEสมาชิกแบบสแตติกตันหรือgetInstance()วิธีแบบคงที่ในขณะที่ยังคงความสามารถในการอัปเดตฟิลด์สแตติกพื้นฐานของคลาสสำหรับการทดสอบ ดูไม่สะอาดเกินไปเช่นกัน
FooUtilวิธีการที่ควรจะใส่ลงไปFooSomethingอาจมีคุณสมบัติFooSomethingที่ควรจะเปลี่ยน / ขยายเพื่อให้FooUtilวิธีการนั้นไม่จำเป็นอีกต่อไป โปรดยกตัวอย่างที่เป็นรูปธรรมเกี่ยวFooSomethingกับสิ่งที่จะช่วยเราในการให้คำตอบที่ดีสำหรับคำถามนี้