Aula 4 - Criando funções.

Esta aula será mais teórica, mas o que vamos aprender hoje é fundamental para entender todo o resto que está por vir. Então, bora entender o que é uma função?

O que você irá aprender nesta aula?

  1. O que é uma funcão?
    1.1 Funções matemáticas
    1.2 Funções na programação
  2. Como criar nossas próprias funções?
  3. Vantagens de criar funções

1- O que é uma função?

Conforme nosso código cresce, vai ficando cada vez mais difícil identificar o que significa cada uma de suas partes.
Por exemplo: no código que desenhamos um ônibus no desafio da aula 2, quanto mais detalhes colocávamos no desenho, maior ficava o main.
Mas afinal, o que é esse main? Ela é uma função.
Na linguagem de programação Elm, quase tudo que escrevemos são funcões! Isso por que ela é uma linguagem que segue o paradigma funcional. Existem vários tipos (paradigmas) de linguagens: Orientadas à Objetos, Imperativas, Lógicas e também as Funcionais.

1.1- Funções matemáticas

Provavelmente você já deve ter ouvindo falar em funções nas aulas de matemáticas na escola. Coisas como:

x = y + 2

Mas o que significa x = y + 2? Essencialmente significa que em qualquer lugar que tiver o simbolo x, podemos substitui-lo por y + 2, e vice versa. Por exemplo, se tivermos o seguinte conjunto de equações:

x = 5
y = 10
z = x + y

Para descobrirmos o valor de z, substituímos o valor de y e em seguida o de x.

Sendo a função z original:

z = x + y

Podemos primeiro substituir o valor de y:

z = x + 10

E em seguida o valor de x:

z = 5 + 10

Assim chegamos a conclusão que 15 é o único valor possíve de z.

1.2 Funções na programação

Em programação (em especial em linguagens funcionais, como Elm ou Haskell), o conceito de funcão é muito parecido.
No nosso exemplo anterior, o valor de z dependia de y e de x.
Podemos fazer algo similar com nossa função main, tornando-a dependente de outras funções menores e mais simples. Isso deixa o código muito mais fácil de compreender e alterar.

Achou confuso? Vai ficar mais fácil de entender com o exemplo a seguir.

2- Como criar nossas próprias funções?

Vamos partir de uma função que desenha uma árvore para então decompô-la em várias funções menores.

Função main original:

import Playground exposing (..)

main =
  picture
    [ rectangle darkBrown 60 250
        |> move 0 -150
    , circle green 150
        |> move 0 50
    ]

Podemos decompor nossa árvore colocando a definição de suas folhas em uma outra função:

import Playground exposing (..)

main =
  picture
      [ rectangle darkBrown 60 250
        |> move 0 -150
    , folhas
    ]

folhas =
  circle green 150
    |> move 0 50

Este novo código é equivalente ao anterior. Apenas extraí parte dela para outra funcão.

Para definirmos uma nova função, basta darmos um nome para ela (uma palavra qualquer, neste caso, folhas) seguida do simbolo =, da mesma forma que na matemática.
Tudo que estiver depois do símbolo de igual fará parte da nossa nova função.
Mas isso apenas define a função. Precisamos em seguida utilizá-la em um ou mais lugares do código.

Para utilizar uma função, assim como na matemática, basta escrever seu nome. No exemplo anterior a função folhas é utilizada como parte da função main.

É muito importante enteder este conceito. Analise com calma o código acima para ter certeza que compreendeu.

Dica: em Elm, a ordem em que as funções são definidas é irrelevante. Você pode definir primeiro a função main e depois a função folhas ou primeiro a função folhas e depois a main.

Agora vamos separar o tronco da árvore em uma outra função:

import Playground exposing (..)

main =
  picture
    [ tronco
    , folhas
    ]

tronco =
  rectangle darkBrown 60 250
    |> move 0 -150

folhas =
  circle green 150
    |> move 0 50

Tente imaginar que a palavra folhas, dentro da função main, será substituida pelo conteúdo definido logo abaixo na função folhas. E o mesmo para a palavra tronco.

E podemos dar um passo além, se quisermos, e criar a função arvore:

import Playground exposing (..)

main =
  picture
    arvore

arvore =
  [ tronco
  , folhas
  ]

tronco =
  rectangle darkBrown 60 250
    |> move 0 -150

folhas =
  circle green 150
    |> move 0 50

Neste último exemplo a função arvore retorna uma lista de formas geométricas contendo um tronco e uma folha.

3- Vantagens de criar funções

Existem duas grandes vantagens em dividir os códigos em várias funções.
A primeira é que torna mais fácil de expressar nossas intenções. Observe e compare a função main definida no primeiro e últimos exemplos. Desta última forma ficou muito mais explícito o que estamos tentando desenhar.

Outra grande vantagem de programar assim é que agora o tronco e folhas estão desacoplados.
Posso, por exemplo, reutilizar a função tronco para desenhar outros tipos de árvores ou criar um novo tipo de tronco e reaproveitar as folhas.
Em programação este é outro conceito muito importante: reaproveitamento de códigos.

E agora?

Agora chegou a hora de você colocar as mãos na massa e praticar um pouco!

Siga para os desafios da Aula 4 e bons estudos.