# Código Limpo

#### **Definição de Clean Code**

<span style="font-weight: 400;">A apresentação de um código claro e organizado não consiste apenas na convenção nomes, constantes, classes, variáveis, espaçamento etc.. Um código limpo (</span>*<span style="font-weight: 400;">clean code</span>*<span style="font-weight: 400;">) deve ser:</span>

- <span style="font-weight: 400;">Simples: fácil entendimento;</span>
- <span style="font-weight: 400;">Eficiente: realizar tudo o que foi proposto;</span>
- <span style="font-weight: 400;">Único: não realizar algo que outro trecho de código já faz;</span>
- <span style="font-weight: 400;">Direto: não dar voltas para chegar no resultado;</span>
- <span style="font-weight: 400;">Feito com atenção: o código deve ser sempre feito com preocupação e revisto depois de pronto;</span>

#### ***Bad Smells***

Em contra partida, também existem as *<span style="font-weight: 400;">Bad Smells</span>*<span style="font-weight: 400;">, que como sua tradução já sugere, é algo com cheiro ruim, e representa o código com práticas que não devem ser utilizadas. Essas práticas se devem aos códigos que fogem das características de um código limpo. Abaixo são demonstrados alguns exemplos de </span>*<span style="font-weight: 400;">bad smells</span>*<span style="font-weight: 400;">.</span>

##### **Encadeamento de If's**

```PASCAL
if (Q_Manut.FieldByName('DiasDireito').AsFloat = 0) then
begin
  if (AnsiSameText(Trim(Q_Manut.FieldByName('DiasDireito').AsString), ''))) then
  begin
    if (MessageDialog.Show('Não foi informado os dias de Direito. Deseja' +
          'Continuar?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
    begin
      Q_Manut.FieldByName('DiasDireito').FocusControl;
      Abort;
    end;
  end;
end;
```

<p class="callout info">Esse tipo de encadeamento pode ser facilmente substituído pela palavra reservada "and".</p>

```PASCAL
if (Q_Manut.FieldByName('DiasDireito').AsFloat = 0) and
   (AnsiSameText(Trim(Q_Manut.FieldByName('DiasDireito').AsString), ''))) and
   (MessageDialog.Show('Não foi informado os dias de Direito. Deseja' +
      'Continuar?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
begin
  Q_Manut.FieldByName('DiasDireito').FocusControl;
  Abort;
end;
```

---

##### **Excesso de if-else**

```PASCAL
if (Q_Manut.FieldByName('DiasDireito').AsFloat = 0) then
  LTipo := 1
else if (Q_Manut.FieldByName('DiasDireito').AsFloat = 1) then
  LTipo := 2
else if (Q_Manut.FieldByName('DiasDireito').AsFloat = 2) then
  LTipo := 3
else if (Q_Manut.FieldByName('DiasDireito').AsFloat = 3) then
  LTipo := 5
else
  LTipo := 9;
```

<p class="callout info">O trecho acima pode ter sua estrutura facilitada com a utilização de um "case".</p>

```PASCAL
case Q_Manut.FieldByName('DiasDireito').AsFloat of 
  0: LTipo := 1;
  1: LTipo := 2;
  2: LTipo := 3;
  3: LTipo := 5;
  else
    LTipo := 9;
end;
```

---

##### **Atribuição Indireta**

<p class="callout danger">Situações com atribuições indiretas aparecem constantemente no código</p>

```PASCAL
if (Q_Manut.FieldByName('DiasDireito').AsFloat = 0) then
  LDeveIncrementar := False
else 
  LDeveIncrementar := True;
```

```PASCAL
if (RG_TipoCliente.ItemIndex = 0) then
  LTipo := 0
else (RG_TipoCliente.ItemIndex = 1) then
  LTipo := 1;
```

<p class="callout success">Basta uma pequena análise por parte do desenvolvedor para perceber que podem ser simplificadas</p>

```PASCAL
 LDeveIncrementar := (Q_Manut.FieldByName('DiasDireito').AsFloat <> 0);
```

```PASCAL
LTipo := RG_TipoCliente.ItemIndex;
```