Если 9 из 10 возможных наследников захотят иметь такой метод, а 1 из 10 не нуждается, но и не против, то очевидно, что добавление такого метода в базовый интерфейс - это самое просто и быстрое решение, которое не создает проблем.
Именно так и происходит в моей практике, наверное и в практике других тоже. Однако начав расширять базовый класс - остановиться очень трудно. Напр некоторые форматы имеют background color - прозрачные области показываются не черным а этим цветом, его можно менять. Нет, таких явно не большинство, скорее наоборот, пусть 1/10. Но будете ли Вы с этим возиться? Ведь гораздо проще уговорить себя "это никому не мешает" - и слить в базовый класс. В результате в него все льют и льют. В результате раздутый базовый класс "на все случаи жизни" Для этого и существует документ "требования к механизму".
Одну и ту же задачу можно решить десятком различных способов. Какой из них выбрать?
Тут даже думать не нужно: самое простое в плане реализации, которое удовлетворяет требованиям к механизму.
У меня был случай на практике: класс Picture. Содержал в себе весь джентельменский набор для тех самых 95% случаев использования: масштабирование, угол поворота, прозрачность по альфе, и тп вещи.
Моя первая реакция: мне угнетало такое большое количество разных методов в одном классе. Какой-то божественный класс.
Я ещё тогда подумал: а как можно сократить количество паблик-методов, не потеряв удобства использования?
Ну так вот: никак. Как бы вы ни выкручивались, по сути вы просто просто перетаскиваете код из одного места в другое:
Код:
//самый простой и очевидный ОО-способ. Удобно для 95% случаев
//Но не позволяет изменять алгоритм по которому выполняется масштабирование
img.Scale(param);
//процедурный стиль. Увеличивает сложность проекта из-за отрыва данных от их обработчиков.
Scale(img, param);
// паттерн "стратегия".
// Позволяет использовать собственный алгоритм обработки,
//без необходимости знать строение Image
img.Process( Scale(param) );
То есть, если функционал Scale стабильно часто требуется пользователям, то его в любом случае придется реализовать.
Вопрос только: где он будет?
Если пользователям не нужно никакие собственные алгоритмы втюхивать, а нужно только максимально просто взять и сразу использовать: то всякого рода стратегии и процедурщина только усложнят код на ровном месте.
Пускай это будет "божественный объект". Но если при этом, он будет проще в плане изготовления и использования, если такой код в будущем будет проще сопровождать - все равно это лучше, чем на ровном месте из каких то полуфилософских-религиозных соображений городить архитектуру только ради архитектуры. И усложнять код делая фичу ради фичи.
Вот если в ходе развития проекта, вдруг потребовалась возможность заменять алгоритм обработки на свой собственный: вот только тогда, по мере поступления проблемы, можно уже в середине разработки воткнуть метод принимающий стратегию.
Итого:
1. Проблемы нужно решать по мере их наступления. А не пытаться заранее решать ещё не существующие проблемы.
2. Делать нужно так, как можно сделать проще и быстрее.