Мой ответ касается конкретного продукта .NET, заранее извиняюсь, и, возможно, кто-то может предложить его аналоги, не относящиеся к .NET.
Я бы попробовал NDepend и посмотрел бы, может ли это привести меня к нарушениям SRP и ISP, используя такие метрики, как:
- количество методов для типов типов с
- аномально большое количество методов
- афферентная / эфферентная связь на уровне сборки и типа
- другие метрики, полный список метрик здесь
Нарушения DIP и LSP отследить может быть сложнее, поскольку они связаны с намерениями программиста. Инструмент анализа может идентифицировать отношения между типами, но как он может отличить ситуацию, когда один класс действительно расширяет другой от неправильного определения Square из Rectangle? Или, что в правильно разработанной программе A должно зависеть от B, а не наоборот?
OCP представляет собой другую проблему, потому что расширение / модификация, для которой класс должен быть открыт / закрыт, может не обязательно иметь место.
Однако, если мы считаем, что следование SOLID приводит к более удобному для обслуживания продукту (доказательство этого утверждения не является предметом этого вопроса), тогда диаграмма абстрактности-нестабильности NDepend должна дать хорошую совокупную меру насколько хорошо принципы были соблюдены для каждого программного модуля. Если бы они были, модуль должен был избегать нижнего левого угла графика, получившего название «Зона боли». В этой зоне модуль стабилен (не в хорошем смысле - от него зависит слишком много других, поэтому его сложно изменить), но недостаточно абстрактен.