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.
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, pois a implementação concreta será decidida somente no momento da passagem do objeto.
Observe (em C#):
//uma Classe qualquer
public void CalcularSalarioFuncionario(Funcionario funcionario)
{
//Gerente ou Vendedor? Só na hora será decidido.
decimal valor = funcionario.CalcularSalario();
//continuacao do método
}
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 robusto, de fácil manutenção e flexível.
Ex: Repositorio (em Java)
Ex: Repositorio (em Java)
//Classe RepositorioDePedidos
public List buscarPedidosPorClienteID(int clienteID) {
List pedidosDoCliente = new ArrayList();
if (pedidos !=null) {
for (Pedido pedido : pedidos) {
Cliente cliente = pedido.getCliente();
//aqui seria melhor usar o método equals() sobrescrito
if (cliente.getClienteID == clienteID) {
pedidosDoCliente.add(pedido);
}
}
}
return pedidosDoCliente;
}
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?
//uma Classe de controle qualquer
public void gerarListaDePedidos(int clienteID)
{
RepositorioDePedidos repositorio = new RepositorioDePedidos();
List pedidos = repositorio.buscarPedidosPorClienteID(clienteID);
//renderizo uma tela, gero um relatorio, etc
}
O consumidor da classe RepositorioDePedidos dispõe de uma API útil para buscar pedidos de um determinado cliente, dado o seu ID. Ele não sabe como o método funciona (encapsulamento), sabe apenas que funciona. A classe é reutilizável (várias instâncias podem ser criadas), fortemente tipada (somente o tipo Pedido) e tem detalhes de implementação 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.
public List
List
if (pedidos !=null) {
for (Pedido pedido : pedidos) {
pedidosDoCliente.add(pedido);
}
}
}
return pedidosDoCliente;
}
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.
public void gerarListaDePedidos(int clienteID)
{
RepositorioDePedidos repositorio = new RepositorioDePedidos();
List
//renderizo uma tela, gero um relatorio, etc
}
O consumidor da classe RepositorioDePedidos dispõe de uma API útil para buscar pedidos de um determinado cliente, dado o seu ID. Ele não sabe como o método funciona (encapsulamento), sabe apenas que funciona. A classe é reutilizável (várias instâncias podem ser criadas), fortemente tipada (somente o tipo Pedido) e tem detalhes de implementação 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.