Я понимаю, что SOLID должен выполнять, и регулярно использую его в ситуациях, когда модульность важна и ее цели явно полезны. Однако две вещи мешают мне применять его последовательно в моей кодовой базе:
Я хочу избежать преждевременной абстракции. По моему опыту, рисование линий абстракции без конкретных вариантов использования (типа, существующего сейчас или в обозримом будущем) приводит к тому, что их рисуют в неправильных местах. Когда я пытаюсь изменить такой код, строки абстракции мешают, а не помогают. Поэтому я склонен ошибаться в том, что не рисую никаких линий абстракции, пока у меня нет четкого представления о том, где они будут полезны.
Мне трудно оправдать увеличение модульности ради самого себя, если это делает мой код более многословным, трудным для понимания и т. Д. И не устраняет никакого дублирования. Я считаю, что простой, тесно связанный процедурный или объектный код Бога иногда легче понять, чем очень хорошо продуманный код равиоли, потому что поток простой и линейный. Это также намного легче написать.
С другой стороны, это мышление часто приводит к объектам Бога. Я обычно достаточно осторожно рефакторинг, добавляя четкие линии абстракции только тогда, когда вижу четкие шаблоны. Что, если вообще что-то не так с объектами God и тесно связанным кодом, если вам явно не нужно больше модульности, нет значительного дублирования и код читабелен?
РЕДАКТИРОВАТЬ: Что касается отдельных принципов SOLID, я хотел подчеркнуть, что подстановка Лискова ИМХО является формализацией здравого смысла и должна применяться везде, поскольку абстракции не имеют смысла, если это не так. Кроме того, каждый класс должен нести одну ответственность на некотором уровне абстракции, хотя это может быть очень высокий уровень с деталями реализации, объединенными в один огромный класс из 2000 строк. По сути, ваши абстракции должны иметь смысл там, где вы решите абстрагироваться. Принципы, которые я подвергаю сомнению в случаях, когда модульность явно не полезна, являются открытыми-закрытыми, сегрегацией интерфейса и особенно инверсией зависимостей, поскольку они касаются модульности, а не просто наличия абстракций.