OO, eu?
Autor: Vinicius Morgado | Publicado: 2010-07-25T10:07:00-07:00

Mesmo uma linguagem orientada a objetos, como Java ou C#, pode ser utilizada, de forma consciente ou não, para criação de programas com base no paradigma estruturado. Nesse paradigma é grande a quantidade de estruturas de controle (como IF, IF-ELSE e SWITCH) e repetição (FOR, DO/WHILE). A pergunta que fica é: programas escritos utilizando orientação a objetos não precisam de tais estruturas? Como ficariam essas situações no código? Vejamos...

POO é sobre design. É o design da aplicação que determina se ela está aderente à metodologia estruturada ou à metodologia de objetos.
É claro que mesmo nas aplicações OO sempre haverá a necessidade de seleções e decisões. A diferença está na forma e na quantidade que tais elementos aparecem. Utilizando polimorfismo, um método que receba um parâmetro do super-tipo, por exemplo, não precisará de teste condicional,&nbsp;pois a implementação concreta será decidida somente no momento da passagem do objeto.
Observe (em C#): 
&nbsp;&nbsp;&nbsp; //uma Classe qualquer
&nbsp;&nbsp;&nbsp; public void CalcularSalarioFuncionario(Funcionario funcionario)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Gerente ou Vendedor? Só na hora será decidido.
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; decimal valor = funcionario.CalcularSalario();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //continuacao do método
&nbsp;&nbsp;&nbsp; } 

Um bom design OO diminui a necessidade de estruturas condicionais e de controle, porém não a elimina por completo. O fato é que isso (a eliminação) não é necessário para se obter um bom design, que seja&nbsp;robusto, de fácil manutenção&nbsp;e flexível.

Ex: Repositorio (em Java) 
&nbsp;&nbsp;&nbsp; //Classe RepositorioDePedidos
&nbsp;&nbsp;&nbsp; public List buscarPedidosPorClienteID(int clienteID) {

&nbsp;&nbsp;&nbsp;&nbsp; List pedidosDoCliente = new ArrayList();

&nbsp;&nbsp;&nbsp;&nbsp; if (pedidos !=null) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Pedido pedido : pedidos) {&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cliente cliente = pedido.getCliente(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //aqui seria melhor usar o método equals() sobrescrito
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cliente.getClienteID == clienteID) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pedidosDoCliente.add(pedido);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pedidosDoCliente;
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;


Repare que o método buscarPedidosPorClienteID tem elementos de decisão, seleção e controle. Tal situação ocorre a todo momento dentro dos repositórios. 


 E como poderia ser um cliente desse repositório?


&nbsp;&nbsp;&nbsp; //uma Classe de controle qualquer
&nbsp;&nbsp;&nbsp; public void gerarListaDePedidos(int clienteID)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; RepositorioDePedidos repositorio = new RepositorioDePedidos();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List pedidos = repositorio.buscarPedidosPorClienteID(clienteID);

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //renderizo uma tela, gero um relatorio, etc
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; 


O consumidor da classe RepositorioDePedidos&nbsp; dispõe de uma API útil para buscar pedidos de um determinado cliente, dado o seu ID. Ele não sabe como&nbsp;o método&nbsp;funciona (encapsulamento), sabe apenas que funciona. A classe&nbsp;é reutilizável (várias instâncias podem ser criadas), fortemente tipada (somente o tipo Pedido) e tem detalhes de implementação&nbsp;desconhecidos (classe concreta ArrayList).

Com essas características não temos dúvida que o código de exemplo é OO, mesmo com a presença de elementos fundamentais de programação.

Um bom design OO diminui a necessidade de estruturas condicionais e de controle. Patterns, polimorfismo e outras técnicas podem ser utilizadas para tornar o código melhor escrito.

Mais informações sobre sobre estruturas de controle em programas aqui.