Diferença entre programação procedural e programação orientada à objetos

Galera, estou com uma dúvida sobre essa diferença entre programação procedural e OO.

Na orientação objetos eu entendi o porquê de os estados e comportamentos estarem juntos, mas não entendi a parte “no paradigma procedural o estado e o comportamento não vivem juntos”, por favor poderiam me explicar melhor?

Resumidamente, porque na programação procedural você não tem uma estrutura que comporta atributos (que são o estado) e funções/métodos (que são comportamentos) que operam sobre estes atributos. Ou seja, você não tem estruturas que fazem o papel de classes (estado+comportamento juntos).

Abraço.

Então acho que a questão poderia ser melhor elaborada o que acha? Por que na programação procedural os atributos e funções podem estar juntos, só não tem uma estrutura organizada que comporta elas (A classe), já na questão diz que os estados e os métodos estão separados. O que acha? Ou estou errado?

Abraços.

Talvez a questão pudesse ser elaborada de outra forma, mas sem saber o que diz o material de apoio desse curso, não tenho como saber. Pode ser que, no contexto desse material, os termos usados sejam coerente.

Mas note que, nesse contexto, juntos significa intrinsecamente ligados, ou seja, atributos e comportamentos não podem existir separadamente. Por exemplo, em OO:

class Conta{
  float saldo;
  
  boolean sacar(float valor){
    if (valor > saldo) {
      return false;
    }
   saldo -= valor;
   return true;
  }
}

Veja que o método (comportamento) sacar() depende da existência de um objeto do tipo conta, e que ele está ligado ao atributo saldo. Não tem como chamar o método sacar sem um objeto Conta associado:

void fazAlgumaCoisa(){
  sacar(10); // não funciona
  Conta c = new Conta();
  c.sacar(10); // agora funciona
}

Já em programação procedural, você pode ter um comportamento isolado que opera sobre uma estrutura, ou mesmo sobre uma variável isolada, mas não há uma relação forte de dependência entre elas:

struct Conta{
  float saldo;
}

boolean sacar(Conta c, float valor){ // note que é preciso passar como parâmetro a estrutura sobre a qual estamos operando
  if (c.saldo < valor){ // porque a função sacar não está ligada à nenhuma estrutura
    return false;
  } 
  c.saldo -= valor;
  return true;
}

void fazAlgumaCoisa(){
  Conta c;
  Conta d;
  sacar(c, 10); // a mesma função sacar() pode ser chamada sob estruturas diferentes
  sacar(d, 20); //
}

Veja que a função sacar agora está independente da existência de uma estrutura Conta, podendo inclusive estar em outro arquivo.

Abraço.

1 curtida