ใน 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
กับสิ่งที่จะช่วยเราในการให้คำตอบที่ดีสำหรับคำถามนี้