---
title: "Introduzir Asserção"
type: "refactoring-technique"
slug: "introduce-assertion"
url: "http://localhost:3000/pt-br/introduce-assertion.md"
category: "Simplifying Conditional Expressions"
description: "Problema: para que um trecho de código funcione corretamente, certas condições ou valores precisam ser verdadeiros. Solução: substitua essas suposições por verificações de asserção específicas."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Introduzir Asserção

> Problema: para que um trecho de código funcione corretamente, certas condições ou valores precisam ser verdadeiros. Solução: substitua essas suposições por verificações de asserção específicas.

## Problem

Para que um trecho de código funcione corretamente, certas condições ou valores precisam ser verdadeiros.

## Solution

Substitua essas suposições por verificações de asserção específicas.

## Why Refactor

Suponha que um trecho de código presuma algo sobre, por exemplo, a condição atual de um objeto ou o valor de um parâmetro ou variável local. Normalmente, essa suposição sempre será verdadeira, exceto no caso de um erro.

Torne essas suposições óbvias adicionando asserções correspondentes. Assim como a tipagem nos parâmetros de método, essas asserções podem atuar como documentação viva do seu código.

Como guia para descobrir onde seu código precisa de asserções, procure por comentários que descrevam as condições sob as quais um determinado método funcionará.

## Benefits

* Se uma suposição não for verdadeira e o código, por isso, produzir o resultado errado, é melhor interromper a execução antes que isso cause consequências fatais e corrupção de dados. Isso também significa que você deixou de escrever um teste necessário ao planejar as formas de testar o programa.

## How to Refactor

Quando você perceber que uma condição é presumida, adicione uma asserção para essa condição a fim de ter certeza.

Adicionar a asserção não deve alterar o comportamento do programa.

Não exagere no uso de asserções para **tudo** no seu código. Verifique apenas as condições que são necessárias para o funcionamento correto do código. Se o seu código estiver funcionando normalmente mesmo quando uma determinada asserção é falsa, você pode remover a asserção com segurança.
## Relations

**Eliminates smells**

- [Comentários](/pt-br/smells/comments.md)

## Code Examples

### java

```java
// Before
double getExpenseLimit() {
  // Deve ter ou um limite de despesa, ou
  // um projeto principal.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit :
    primaryProject.getMemberExpenseLimit();
}

// After
double getExpenseLimit() {
  Assert.isTrue(expenseLimit != NULL_EXPENSE || primaryProject != null);

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}
```

### csharp

```csharp
// Before
double GetExpenseLimit() 
{
  // Deve ter ou um limite de despesa, ou
  // um projeto principal.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit :
    primaryProject.GetMemberExpenseLimit();
}

// After
double GetExpenseLimit() 
{
  Assert.IsTrue(expenseLimit != NULL_EXPENSE || primaryProject != null);

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.GetMemberExpenseLimit();
}
```

### php

```php
// Before
function getExpenseLimit() {
  // Deve ter ou um limite de despesa, ou
  // um projeto principal.
  return ($this->expenseLimit !== NULL_EXPENSE) ?
    $this->expenseLimit:
    $this->primaryProject->getMemberExpenseLimit();
}

// After
function getExpenseLimit() {
  assert($this->expenseLimit !== NULL_EXPENSE || isset($this->primaryProject));

  return ($this->expenseLimit !== NULL_EXPENSE) ?
    $this->expenseLimit:
    $this->primaryProject->getMemberExpenseLimit();
}
```

### python

```python
// Before
def getExpenseLimit(self):
    # Deve ter ou um limite de despesa, ou
    # um projeto principal.
    return self.expenseLimit if self.expenseLimit != NULL_EXPENSE else \
        self.primaryProject.getMemberExpenseLimit()

// After
def getExpenseLimit(self):
    assert (self.expenseLimit != NULL_EXPENSE) or (self.primaryProject != None)

    return self.expenseLimit if (self.expenseLimit != NULL_EXPENSE) else \
        self.primaryProject.getMemberExpenseLimit()
```

### typescript

```typescript
// Before
getExpenseLimit(): number {
  // Deve ter ou um limite de despesa, ou
  // um projeto principal.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}

// After
getExpenseLimit(): number {
  // TypeScript e JS não têm asserções nativas, então usaremos
  // o bom e velho console.error(). Você sempre pode extrair isso para uma
  // função de asserção dedicada.
  if (!(expenseLimit != NULL_EXPENSE ||
       (typeof primaryProject !== 'undefined' && primaryProject))) {
      console.error("Assertion failed: getExpenseLimit()");
  }

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}
```

