I think you said it pretty well. Most of this will be stylistic. There are open source projects. I looked where everything has an interface and an implementation, and this is partly disappointing, but it can make iterative development a little easier, since any object implementations can break, but dummies will still work. But honestly, I can fake any class that does not abuse the final keyword by inheritance.
I would add the following to your list: everything that can be considered as a black box should be abstracted. This includes some of the things you mentioned, but also includes hairy algorithms that are likely to have many useful implementations with various advantages for different situations.
In addition, interfaces are very often used with compound objects. This is the only way to get something like a java swing library, but it can also be useful for more mundane objects. (I personally like to have an interface like ValidityChecker , with methods for compiling and / or compiling subordinate ValidityChecker s.)
source share