---
title: "Разбиение условного оператора"
type: "refactoring-technique"
slug: "decompose-conditional"
url: "http://localhost:3000/ru/decompose-conditional.md"
category: "Упрощение условных выражений"
description: "Проблема: У вас есть сложный условный оператор (if-then/else или switch). Решение: Выделите в отдельные методы все сложные части оператора: условие, then и else."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Разбиение условного оператора

> Проблема: У вас есть сложный условный оператор (if-then/else или switch). Решение: Выделите в отдельные методы все сложные части оператора: условие, then и else.

## Problem

У вас есть сложный условный оператор (`if-then`/`else` или `switch`).

## Solution

Выделите в отдельные методы все сложные части оператора: условие, `then` и `else`.

## Why Refactor

Чем длиннее кусок кода, тем сложнее понять, что он делает. Все усложняется ещё больше, когда код щедро приправлен условными операторами:

* пока вы разберётесь в том, что делает код в `then`, вы забываете, какое условие стояло в операторе;
* пока вы разбираетесь с `else`, вы забываете, что делал код в `then`.

## Benefits

* Извлекая код условного оператора в методы с понятным названием, вы упрощаете жизнь тому, кто впоследствии будет этот код поддерживать (зачастую вам самим через месяц или два).
* Кстати, этот рефакторинг применим и для коротких выражений в условиях оператора. Строка `isSalaryDay()` куда наглядней опишет то, что она делает, чем код сравнения дат.

## How to Refactor

1. Выделите условие в отдельный метод с помощью [выделения метода](/ru/extract-method).
2. Повторите выделение для `then` и `else` части оператора.
## Relations

**Eliminates smells**

- [Длинный метод](/ru/smells/long-method.md)

## Code Examples

### java

```java
// Before
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}

// After
if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}
```

### csharp

```csharp
// Before
if (date < SUMMER_START || date > SUMMER_END) 
{
  charge = quantity * winterRate + winterServiceCharge;
}
else 
{
  charge = quantity * summerRate;
}

// After
if (isSummer(date))
{
  charge = SummerCharge(quantity);
}
else 
{
  charge = WinterCharge(quantity);
}
```

### php

```php
// Before
if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) {
  $charge = $quantity * $winterRate + $winterServiceCharge;
} else {
  $charge = $quantity * $summerRate;
}

// After
if (isSummer($date)) {
  $charge = summerCharge($quantity);
} else {
  $charge = winterCharge($quantity);
}
```

### python

```python
// Before
if date.before(SUMMER_START) or date.after(SUMMER_END):
    charge = quantity * winterRate + winterServiceCharge
else:
    charge = quantity * summerRate

// After
if isSummer(date):
    charge = summerCharge(quantity)
else:
    charge = winterCharge(quantity)
```

### typescript

```typescript
// Before
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}

// After
if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}
```

