Я согласен, что программирование на основе интерфейсов является хорошей практикой. В большинстве случаев в Java «интерфейс» в этом смысле означает интерфейс языковой конструкции, так что вы пишете интерфейс и класс реализации и большую часть времени используете интерфейс вместо класса реализации.
Интересно, будет ли это хорошей практикой и для написания моделей предметной области? Так, например, если у вас есть клиент класса домена и у каждого клиента может быть список заказов, вы бы обычно также писали интерфейсы ICustomer и IOrder. А также у Клиента будет список IOrders вместо Orders? Или вы бы использовали интерфейсы в доменной модели, только если она действительно управляется доменом, например у вас есть как минимум два разных типа заказов? Другими словами, будете ли вы использовать интерфейсы только из-за технических потребностей в модели предметной области или только в тех случаях, когда это действительно уместно в отношении фактической предметной области?