Sure, I'm adding this shitty console based logger, but since it's wrapped in ILogger I'll later come and write a FileBasedLogger, a DBLogger and a KafkaProducerLogger for when we go webscale.
Except, that never happens.
//Names changed slightly to protect the wicked
public interface IProvideBoolean {
Boolean True { get; }
Boolean False { get; }
}
public class BooleanProvider : IProvideBoolean {
public Boolean True => true;
public Boolean False => false;
}
So.... SOLID....
If there's ever a third value for Boolean, I Will Be Ready.But you want to, that's the point. You're making a drastic change to your code base, surely you want to inspect every place where that type is used.
No, it's the opposite. IClass is the norm, for legacy reasons going all the way back to the early COM days (it all started with IUnknown[1]).
[1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms6...
You can also do "pImpl", which is similar, if not worse, in terms of boilerplate, but doesn't allow DI.
Just don't use these techniques unless you can prove they're needed (e.g private members drag new problematic dependencies, #include <some_volatile_header_file.h>).