Назови условие — избавься от хаоса!
Иногда в проект подключают внешнего подрядчика, и вместо читаемой логики прилетает условие на пятнадцать строк: if (isUser && hasSubscription && !isExpired && (!isPromo || promo.isActive) && (plan === 'pro' || plan === 'enterprise') && region !== 'blocked' && !isBannedByMarketing).
Пока разработчик, писавший код, рядом — всё работает. Но как только нужно добавить ещё одно правило или исправить баг, команда тратит часы на разбор «каши» в условии. Решение простое: вынести проверки в говорящие функции или предикаты.
if (
user &&
user.subscription &&
!user.subscription.expired &&
(!campaign || campaign.active) &&
(user.plan === 'pro' || user.plan === 'enterprise') &&
!blockedRegions.includes(user.region) &&
!marketingBanList.includes(user.id)
) {
showStories();
}Выглядит как проверка «показать сторис», но с первого взгляда это не очевидно. Новому разработчику приходится читать каждую ветку, чтобы понять намерение.
const canShowStories = isPremiumSubscriber(user) && isCampaignAllowed(campaign) && isRegionWhitelisted(user.region) && isMarketingApproved(user.id);
if (canShowStories) {
showStories();
}А сами функции прячем рядом:
const isPremiumSubscriber = (user: User) => user.subscription?.isActive && ['pro', 'enterprise'].includes(user.plan);
const isCampaignAllowed = (campaign?: Campaign) => !campaign || campaign.active;
const isRegionWhitelisted = (region: string) => !blockedRegions.includes(region);
const isMarketingApproved = (userId: string) => !marketingBanList.includes(userId);Теперь код читается как бизнес-правило. Любое изменение локализовано в соответствующей функции, а тесты легко покрывают каждый сценарий.
canAccessStoryEditor(plan) избавляет от длинного списка сравнений прямо в условии.if (flagA && !flagB && user.country !== 'DE') используйте предикат isStoryExperimentEnabled(user).shouldSyncAnalytics().isProdEnvironment() читается лучше, чем сравнение env === 'production' && cluster !== 'staging' внутри условия.shouldShowBanner, canTriggerReminder).Сложные выражения в условиях замедляют разработку и прячут намерения команды. Названные предикаты делают код самодокументируемым, упрощают поддержку и снижают входной порог для новых разработчиков. Чем меньше «магии» внутри if, тем быстрее продукт растёт.