Интерфейсы следует использовать, когда вы хотите четко определить взаимодействие между двумя различными разделами вашего программного обеспечения. Особенно, когда возможно, что вы хотите разорвать любой конец соединения и заменить его чем-то другим.
Например, в моем приложении CAM у меня есть CuttingPath, связанный с набором точек. Нет смысла иметь интерфейс IPointList, так как CuttingPath всегда будут состоять из точек в моем приложении.
Однако я использую интерфейс IMotionController для связи с машиной, потому что мы поддерживаем много разных типов режущих машин, каждый со своим собственным набором рекомендаций и методом связи. Поэтому в этом случае имеет смысл поместить его за интерфейс, поскольку одна установка может использовать другой компьютер, а не другой.
Наши приложения поддерживались с середины 80-х годов и перешли к объектно-ориентированному дизайну в конце 90-х годов. Я обнаружил, что то, что может измениться, значительно превзошло то, что я первоначально думал, и использование интерфейсов возросло. Например, когда-то наш DrawingPath состоял из точек. Но теперь он состоит из сущностей (сплайнов, дуг и т. Д.). Таким образом, он указывает на EntityList, который является коллекцией Object, реализующей интерфейс IEntity.
Но это изменение было продиктовано осознанием того, что DrawingPath может быть нарисован с использованием множества различных методов. После того, как стало понятно, что необходимо множество методов рисования, была указана необходимость в интерфейсе, а не в фиксированном отношении к объекту сущности.
Обратите внимание, что в нашей системе DrawingPaths отображаются на низкоуровневой траектории резки, которая всегда является последовательностью точечных сегментов.