How many times have you been told to use interfaces/DI and avoid singletons?
I’m lazy and I hate unnecessary boilerplate. Making an interface for one implementation isn’t smart planning, it’s bloat. DI? Do I really need it? If you want to make a small Kotlin service quickly, ditch the cruft.
object BossService { ... } object EmployeeService { fun calculateWage(e: Employee) { val x = BossService.getOpinion(e) ... } }
Cool, we just got rid of any need for interfaces or DI in the main source. Everything’s globally accessible. And did we lose the ability to write meaningful tests? Nope…
@Test fun testEmployeeService() { val employee = createEmployee() mockkObject(BossService) every { BossService.getOpinion(employee) } returns Opinion.GREAT assertEquals(100, EmployeeService.calculateWage(employee)) }
The use of singletons didn’t make the tests any harder.
Obviously for larger services, you’ll make different choices (making everything a global singleton is not such a good idea there). But for the little guys, just be lazy. It’s good for you.
“We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.” - Larry Wall