Help us improve
Share bugs, ideas, or general feedback.
From dex-skill-solid
SOLID принципы — ловушки SRP, OCP, LSP, ISP, DIP. Активируется при SOLID, god class, слишком много зависимостей, большой конструктор, рефакторинг класса, декомпозиция, fat interface, feature envy, YAGNI, проектирование
How this skill is triggered — by the user, by Claude, or both
Slash command
/dex-skill-solid:solidThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Плохо: `UserService` содержит `CreateUser`, `SendWelcomeEmail`, `GenerateReport` — три разные причины изменения
Share bugs, ideas, or general feedback.
Плохо: UserService содержит CreateUser, SendWelcomeEmail, GenerateReport — три разные причины изменения
Правильно: отдельные сервисы UserRegistrationService, UserNotificationService, UserReportService
Почему: при смене email-провайдера меняется класс с бизнес-логикой регистрации. Тесты требуют моков всего и сразу
Плохо: один метод с 5 if/else, вложенными циклами, try/catch и SQL — всё в одном Правильно: декомпозиция на private методы по одному действию, или отдельные классы Почему: невозможно протестировать частично, cyclomatic complexity > 10 = гарантированные баги при рефакторинге
Плохо: метод обращается к 5+ полям чужого класса — order.Customer.Address.City, order.Customer.Email, order.Customer.Phone
Правильно: метод переносится в класс, чьи данные использует, или добавляется делегат
Почему: изменение Customer ломает OrderService. Нарушение инкапсуляции через длинные цепочки вызовов
Плохо: каждый новый тип оплаты = else if (payment.Type == "Crypto") в существующем методе
Правильно: Dictionary<PaymentType, IPaymentStrategy> или DI-регистрация, resolve по ключу
Почему: правка работающего кода при добавлении фичи. Риск регрессий, ни один старый тест не проверяет новую ветку
Плохо: ReadOnlyRepo : Repository { override Save() => throw new NotSupportedException(); }
Правильно: IReadRepository<T> и IWriteRepository<T> — разделить интерфейсы по контракту
Почему: код принимает Repository и ожидает рабочий Save. Нарушение контракта базового класса = runtime вместо compile-time
Плохо: базовый метод принимает amount >= 0, наследник требует amount > 0 && amount < 1000
Правильно: наследник не должен ужесточать проверки входных данных базового класса
Почему: код, написанный против базового типа, падает с неожиданными ArgumentException при подстановке наследника
Плохо: IUserService содержит Create, Update, Delete, SendEmail, GenerateReport, GetStats, ...
Правильно: IUserCommands, IUserQueries, IUserNotifications — разделить по SRP
Почему: реализующий класс вынужден реализовывать ненужные методы через throw или пустые тела. Клиент зависит от методов, которые не использует
Плохо: IAdminUserService с 20 методами — весь CRUD + отчёты + аудит в одном интерфейсе
Правильно: узкие интерфейсы по use-case — IUserReader, IUserWriter, IUserAudit
Почему: любое изменение IAdminUserService затрагивает все реализации, даже те, что используют 2 из 20 методов
Плохо: OrderService(SqlConnection conn) — сервис знает о конкретной БД
Правильно: OrderService(IOrderRepository repo) — сервис зависит от абстракции
Почему: смена БД, добавление кеша или мок в тестах требует изменения бизнес-кода. Зависимость направлена не туда
Плохо: orderService.AddItem(orderId, productId, qty) — entity Order без методов, только поля
Правильно: order.AddItem(product, qty) — логика, инварианты и валидация внутри агрегата
Почему: бизнес-правила размазаны по сервисам, инварианты не защищены. Та же логика дублируется в нескольких местах
if/else if по типу → заменить на полиморфизм / Strategythrow NotSupportedException в наследнике → разделить интерфейсы (LSP)npx claudepluginhub dex-it/claude-code-marketplace --plugin dex-skill-solidProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.