Я думаю, вы сказали это довольно хорошо. Многое из этого будет стилистическим. Я видел проекты с открытым исходным кодом, в которых у всех есть интерфейс и реализация, и это немного расстраивает, но это может немного упростить итеративную разработку, поскольку любая реализация объектов может сломаться, но пустышки все равно будут работать. Но, честно говоря, я могу подставить любой класс, который не использует ключевое слово final
по наследству.
Я бы добавил к вашему списку следующее: все, что можно представить как черный ящик, должно быть абстрагировано. Это включает в себя некоторые из вещей, которые вы упомянули, но также включает в себя сложные алгоритмы, которые могут иметь несколько полезных реализаций с различными преимуществами для разных ситуаций.
Кроме того, интерфейсы очень часто оказываются полезными для составных объектов. Это единственный способ, как что-то вроде библиотеки свингов в java, но это также может быть полезно для более обыденных объектов. (Лично мне нравится иметь такой интерфейс, как ValidityChecker
, с возможностью и-или-или-или-или-либо подчинять подчиненных ValidityChecker
s.)