À medida que os programas crescem — como o nosso Flappy Geek Bird —, o código pode se tornar longo, repetitivo e difícil de ler. O conceito de Funções (ou Métodos, em linguagens orientadas a objetos) resolve esse problema ao permitir que você organize seu código em blocos lógicos e reutilizáveis.

Funções são a espinha dorsal da Modularidade, o princípio de dividir um programa complexo em partes menores e independentes.


1. ⚙️ O que é uma Função?

Uma função é um bloco de código que executa uma tarefa específica. Ela tem três propósitos principais:

  1. Reutilização: Executar o mesmo conjunto de instruções muitas vezes, sem reescrevê-lo (Princípio DRY: Don’t Repeat Yourself).
  2. Organização: Nomear um bloco de código de forma descritiva, tornando o programa mais legível.
  3. Abstração: Esconder detalhes complexos. Quando você chama print(), você não precisa saber como o computador escreve na tela, apenas que ele o fará.

Estrutura Básica de uma Função (JavaScript):

JavaScript

// 1. Definição da Função
function calcularArea(largura, altura) { // <- Parâmetros (Entrada)
    // 2. Bloco de Código (Tarefa)
    const area = largura * altura;
    
    // 3. Retorno (Saída)
    return area; 
}

// 4. Chamada (Execução) da Função
let resultado = calcularArea(10, 5); // O resultado será 50
console.log(resultado);

2. 🔀 Parâmetros e Retorno (return)

  • Parâmetros (Entrada): São variáveis que você define na criação da função, que a função espera receber quando é chamada. Eles permitem que a função trabalhe com dados diferentes a cada execução.
  • Valor de Retorno (return): É o resultado final que a função deve passar de volta para o código que a chamou. Uma função pode executar código sem retornar nada (como uma função que apenas imprime algo na tela), mas geralmente ela retorna um valor (número, string, objeto, etc.).

3. 📦 Modularidade e Escopo

A modularidade está diretamente ligada ao Escopo, que define onde uma variável é acessível no seu código.

  • Escopo Global: Variáveis declaradas fora de qualquer função são acessíveis em qualquer lugar do programa. (Evitar o máximo possível, pois pode causar confusão).
  • Escopo Local (da Função): Variáveis declaradas dentro de uma função só existem enquanto a função está sendo executada.

A modularidade incentiva a criação de funções com alto encapsulamento (cada função faz uma única coisa bem feita) e baixo acoplamento (as funções dependem o mínimo possível umas das outras).

Exemplo de Modularidade (Flappy Geek Bird):

Em vez de ter um código gigante, usamos funções modulares:

  • calcularArea(pipe): Calcula se o pássaro está na área X/Y do tubo.
  • aplicarGravidade(): Executa apenas a matemática da queda.
  • criarTubo(): Executa apenas a criação de dois elementos div e seu posicionamento.

Se você precisar mudar o cálculo da colisão, você só mexe na função calcularArea(), sem quebrar a função criarTubo().

4. 🗂️ O Próximo Nível: Bibliotecas e Módulos

Em projetos maiores, a modularidade evolui para o uso de Módulos ou Bibliotecas.

  • Você agrupa várias funções relacionadas em um arquivo (.js, .py, etc.).
  • Você “importa” essas funções em outros arquivos, conforme necessário (como importamos o ERC-20 no projeto de criptomoeda).

Essa é a base para o desenvolvimento em equipe e para a construção de projetos escaláveis.