Você está programando estruturado se o foco do seu programa estiver nos dados, e na forma com que esses dados são processados.
Geralmente, em programas assim, pensamos em entrada/processamento/saída.
Por exemplo, para o processamento de um boletim escolar, você organizaria seu sistema assim:
PROCEDIMENTO: Imprimir boletim
ENTRADA: Nome do aluno
SAIDA: Nada (boletim é impresso).
FORMADO POR TRÊS SUBROTINAS:
Passo 1:
Entrada: Nome do aluno
Rotina: Buscar aluno
Saída: Notas do aluno
Passo 2:
Entrada: Notas do aluno
Rotina: Processar notas
Saída: Média do aluno
Passo 3:
Entrada: Média do aluno
Rotina: Imprimir notas
Saída: Nenhuma (a média é impressa).
Você está programando orientado à objetos se o foco do seu programa está nas entidades, no relacionamento entre essas entidades, e nas mensagens que trocam.
No mesmo programa do boletim, você se preocuparia em ter uma classe chamada “Aluno”, com coisas como nome, descrição, sexo, etc. Em outro local, você teria uma estrutura que representa um boletim. Com o ano do boletim, notas já lançadas, etc. Quem teria a responsabilidade de calcular a média? O boletim, já que ele é o agregador de notas. Você também teria uma classe “Impressora”, que representa uma impressora física, e é capaz de manter o que quer que peçam para ela para o pool de impressão. Só depois pensariamos numa outra classe, maior, que chamaria métodos dessas outras e imprimiriam o boletim de fato.
Note que não estamos preocupados aqui tanto em entradas e saídas, mas sim, em quem faz o que.
Essa diferença pode parecer sutil agora, mas muda completamente a forma de pensar no problema e de agrupar os dados.
Uma linguagem é chamada de “orientada a objetos” se ela dá suporte a conceitos de OO de maneira fácil e intituiva. Os conceitos principalmente levados em conta são:
a) Herança;
b) Polimorfismo;
c) Abstração (métodos virtuais);
e) Encapsulamento;
f) Possibilidade de combinar dados e métodos num mesmo local.
Note que a OO é mais rica do que esses cinco conceitos, mas muitas das coisas adicionais vem do correto uso desses quatro princípios. Além disso, também que é possível implementar um sistema OO numa linguagem não OO (como o C). Só que dá um trabalhão dos infernos… por isso só chamaremos de linguagem OO aquela que dá um suporte amigável, não aquela em que conseguimos “fazer funcionar na marra”.
Uma linguagem é chamada de estruturada se permite a construção de um conjunto de funções, rotinas e módulos para processar dados.
Sim, existe. E de fato isso é feito até hoje. OpenGL, opencv, SDL, API do Windows, são exemplos de bibliotecas criadas dessa forma. Aliás, uma biblioteca em ANSI C será infinitamente mais portável que qualquer aplicação em Java que você venha a fazer.
O que você ouve por aí é que em Java é mais fácil reutilizar código. Isso decorre do fato da orientação à objetos isolar naturalmente entidades e, consequentemente, manter seu código isolado em um canto só. Assim, fica mais fácil separar trechos de códigos em partes reutilizáveis. O java tem outros princípios que facilitam esse compartilhamento, como o suporte a reflexão, e o fato dos arquivos também .jar serem multiplataforma e independentes de compilador (no C, uma dll só funciona no Windows. Um lib pode só funcionar no compilador que o lib foi gerado, para o SO que ele foi gerado).
Cuidado, jovem padawan. Você está confundido aqui o mecanismo com o conceito.
Quando você diz que o C é voltado à “procedimentos e funções” você quer dizer exatamente isso. Que todo o sistema estará organizado em torno desses procedimentos e funções.
Você jamais vai ouvir alguém dizer que o Java é “voltado a métodos”. O foco do sistema está no relacionamento entre classes e objetos, como um todo. Funções são apenas a maneira de transmitirmos mensagens a essas classes e objetos.
Existem duas coisas do mundo real que não são possíveis, ou são muito difíceis, de modelar em código estruturado.
a) A relação de generalização/especialização. Por exemplo, você tem um dado que representa um telefone. E outro que representa um telefone móvel. Em orientação à objetos, é possível dizer que um telefone móvel é um tipo mais específico de telefone.
b) Tipos abstratos: Você sabe que tanto o telefone móvel, quanto o telefone fixo, quanto o skype tem algo em comum. Que é a capacidade de discar. Ou seja, todos são “AparelhosDeTelefonia”. Uma pessoa pode te dizer que usou um aparelho de telefonia para falar com um parente, e você saberá do que a pessoa está falando. Agora, se ela te perguntar qual é a qualidade de um aparelho de telefonia, você fatidicamente perguntará “qual”. O fato é que o conceito “Aparelho de telefonia” existe, mas é abstrato. Sabemos o que ele faz, mas não existe um “Aparelho de telefonia” que não seja algum tipo de telefone mais concreto no mundo. Em orientação à objetos, podemos definir entidades abstratas assim:
public interface AparelhoDeTelefonia {
void ligar(String numero); //Faz uma ligação
void desligar(); //Desliga a ligação
void transmitir(Voz fala); //Transmite a voz
}
Note que não há implementações aqui. De nenhum tipo. Uma vez definido esse conceito, você pode até mesmo escrever métodos que o utilizem.
Por exemplo, como seria o método para fazer uma ligação e cronometrar seu tempo?
[code]public long fazerLigacaoComTempo(String numero, AparelhoDeTelefonia aparelho) {
aparelho.ligar(numero);
long antes = System.currentTimeMillis();
while (usuario.isFalando()) {
aparelho.transmitirVoz(usuario.getVoz());
}
aparelho.desligar();
//Calcula o tempo da ligação
return System.currentTimeMillis() - antes;
}[/code]
E como vc faria para usar uma coisa dessas? Obviamente, não existe um AparelhoDeTelefonia genérico. Então, vc deve passar para o método um concreto:
fazerLigacaoComTempo("3982381", new TelefoneCelular()); //Funciona pq um TelefoneCelular "é um" Aparelho de telefone
fazerLigacaoComTempo("9982381", new SkypeOut()); //Também funciona, pq o skype "é um" Aparelho de telefone diferente, mas ainda é
A implementação dos métodos na classe Skype e Telefone celular pode ser completamente diferente e, desde que o significado do método se mantenha o mesmo, o código funcionará.
5- Programação estrutura baseia-se em sequência, seleção e repetição. Em Java, não ? Não Meus métodos não compostos por estruturas decisão e repetição, etc ?
Se você realmente quiser entender porque a OO é diferente da linguagem estruturada, procure olhar para o que o Java tem de diferente, não de igual. Depois que você entender bem o conceito de polimorfismo e entender a diferença na forma de pensar no problema, você vai descobrir porque dizemos que uma linguagem estruturada e uma OO seguem paradigmas diferentes.