POO X Programação Estruturada - Dúvidas

Pessoal.

Antes de mais nada me perdoa por algumas perguntas ignorantes com relação a esse assunto.

O problema de se aprender uma metodologia como POO e não saber na prática outras como Programação Estruturada torna-se difícil compreender as diferenças reais.

Tenho lido difersas apostilas, artigos, livros mas, são conceitos e por isso me perco.

1- Quando realmente estou programando Estruturado ou OO?
R- Quando estou programando numa linguagem C ou Java, porque elas são consideradas estruturada e orientada objetos ?

2- Uma das coisas que mais ouço é que com Java consigo reutilizar código. Ok! Um programa em C é criado somente num arquivo? Não existe maneira de como criar minhas estruturas em arquivos separados para serem reutilizadas ? E os includes, não são para importar as bibliotecas ?

3- Vejo também que em C é voltado para procedimentos e funções. Mas em java, também não uso métodos que no meu ponto de vista é praticamente o mesmo conceito.

4- Outra: Com orientação objeto podemos chegar mais próximo do mundo real. Por que ? Assim como as classes que modela os objetos não existe as estruturas que modela os dados de uma coisa de mundo real ?

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 ?

Não estou afirmando nada. Apenas tenho dificuldade compreender esses dois paradigmas. Se alguém puder me ajudar, eu agradeço mesmo.

Abraços!

Creio que quando Java foi criado se pensou em utilizar recursos do paradigma de orientação a objetos, que trouxessem mais vantagem para a linguagem.
Assim como java mantem certos aspectos imperativos.

Mas não seria uma referência para conhecer o paradigma, pelo que sei, smalltalk sim é puramente orientada a objetos (procure o porque).

Java entaum é um mix desses dois paradigmas.

Procure por linguagens puramente imperativas, e linguagens puramente orientadas a objetos.

Pode esclarecer sua mente.

PS.: creio que include e import sejam coisas diferentes.

Boa noite efcjunior o que mais diferencia uma linguagem estruturada como C de uma linguagem OO como o JAVA são alguns conceitos de OO contidos em JAVA e não contidos em C, por exemplo:

Reutilização de Código: Herança, um dos conceitos mais usados para o reaproveitamento de código, com esse recurso é possivel escrever Classes Genericas como Pessoa e utilizar a Herança para herdar os atributos de pessoa em PessoaFisica e PessoaJuridica, já em C teria que se escrever 3 estruturas diferentes.

Herança só é um dos conceitos que mostra as vantagens da programação OO sobre a programação Estruturada!

Pesquise mais sobre Encapsulamento, Polimorfismo, Abstração, Herança, Interface, Sobrecarga, Sobreposição etc…

esses recursos são recursos contidos somente em linguagens OO que facilitam o processo de desenvolvimento de softwares comerciais, e facilitando muito a vida do programador.

espero ter ajudado, abraços!

[quote=efcjunior]Pessoal.

Antes de mais nada me perdoa por algumas perguntas ignorantes com relação a esse assunto.

O problema de se aprender uma metodologia como POO e não saber na prática outras como Programação Estruturada torna-se difícil compreender as diferenças reais.

Tenho lido difersas apostilas, artigos, livros mas, são conceitos e por isso me perco.

1- Quando realmente estou programando Estruturado ou OO?
R- Quando estou programando numa linguagem C ou Java, porque elas são consideradas estruturada e orientada objetos ?

2- Uma das coisas que mais ouço é que com Java consigo reutilizar código. Ok! Um programa em C é criado somente num arquivo? Não existe maneira de como criar minhas estruturas em arquivos separados para serem reutilizadas ? E os includes, não são para importar as bibliotecas ?

3- Vejo também que em C é voltado para procedimentos e funções. Mas em java, também não uso métodos que no meu ponto de vista é praticamente o mesmo conceito.

4- Outra: Com orientação objeto podemos chegar mais próximo do mundo real. Por que ? Assim como as classes que modela os objetos não existe as estruturas que modela os dados de uma coisa de mundo real ?

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 ?

Não estou afirmando nada. Apenas tenho dificuldade compreender esses dois paradigmas. Se alguém puder me ajudar, eu agradeço mesmo.

Abraços!

[/quote]

Cara…
vamos por partes:

  1. No fundo a programação orientada a objetos é apenas uma abordagem diferente da programação imperativa. Alguns autores definem assim o paradigma orientado a objetos. No C o que chega mais perto de uma classe é a strut…não manjo muito de C, mas é uma analogia valida.
    OO é apenas uma forma diferente de vc arquitetar sua aplicação, que no fundo é bem mais pratica.

  2. Reutilizar código não é apenas include…reuso de código é vc conseguir projetar sua classe de forma que vc não tenha sempre que reinventar a roda…reuso vai muito além de include e arquivo separado.

  3. Métodos são a mesma coisa de funções e funções e procedimentos…pense que como é um paradigma “diferente” logo deve-se criar nomenclatura própria.

  4. Pense que em OO cada classe representa um pedaço do problema, um elemento do mundo real tem ligação com seu sistema…essa abordagem torna mais limpa a visão do sistema.

  5. Em OO cada funcionalidade é imperativa em sua implementação (digo a implementação dos métodos).

Falei pra caramba…mas o que vc tem que tentar entender é:

Programação OO não é apenas a forma de programar, é uma forma de analisar, estruturar e pensar.
Você pensa em objetos e seus relacionamentos não em sequencia.
Quando vc esta programando vc pensa apenas naquele objeto e em quais outros ele se relaciona, apenas com os quais ele se relaciona não em funções.
OO é modo de pensar…apenas isso.

Que livros vc tem lido?
Uma sugestão que eu dou para vc é ler “Use a Cabeça JAVA”, este livros para iniciante em OO é muito bom.

Espero ter ajudado.

[quote=efcjunior]Pessoal.

Antes de mais nada me perdoa por algumas perguntas ignorantes com relação a esse assunto.

O problema de se aprender uma metodologia como POO e não saber na prática outras como Programação Estruturada torna-se difícil compreender as diferenças reais.

Tenho lido difersas apostilas, artigos, livros mas, são conceitos e por isso me perco.

1- Quando realmente estou programando Estruturado ou OO?
R- Quando estou programando numa linguagem C ou Java, porque elas são consideradas estruturada e orientada objetos ?

2- Uma das coisas que mais ouço é que com Java consigo reutilizar código. Ok! Um programa em C é criado somente num arquivo? Não existe maneira de como criar minhas estruturas em arquivos separados para serem reutilizadas ? E os includes, não são para importar as bibliotecas ?

3- Vejo também que em C é voltado para procedimentos e funções. Mas em java, também não uso métodos que no meu ponto de vista é praticamente o mesmo conceito.

4- Outra: Com orientação objeto podemos chegar mais próximo do mundo real. Por que ? Assim como as classes que modela os objetos não existe as estruturas que modela os dados de uma coisa de mundo real ?

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 ?

Não estou afirmando nada. Apenas tenho dificuldade compreender esses dois paradigmas. Se alguém puder me ajudar, eu agradeço mesmo.

Abraços!

[/quote]
são questões e dúvidas muito pertinentes e que ocorrem quando estamos fazendo esta transição.
Vamos lá
1 - É completamente óbvio que OO partiu da programação estruturada. Mas não é por isso que ela é apenas uma sequência de código.
OO segue uma série de “regras” que partiram da observação do mundo, enquanto objeto.
Desta observação, definiu-se que
Um objeto possui qualidades, denominadas atributos.
Aí você diz, ok, mas eu tenho minhas variáveis nas estruturas em C.
E eu digo, objetos possuem comportamentos e ações, chamados métodos.
Aí você não me diz nada. Pois uma struct do C não permite que você crie uma função dentro dela. Você pode guardar coisas, é para isto que ela serve.
Objetos possuem responsabilidades (como dizia o professor Schipiura).
Quais as responsabilidades de uma struct? Guardar um int, um ponteiro e outras structs?

Java é OO por permitir que você crie uma classe e omita tudo o que uma classe possui, que você coloque nela apenas atributos ou apenas métodos. As responsabilidades? Fazem parte do escopo onde ela está inserida.
Uma classe que faz login, possui atributos nome e senha, método verificaLogin e é responsável por permitir ou não o acesso de quem está tentando.

2 - Quando me falavam em reutilização de código eu sempre pensava em copiar a classe X do projeto seilaqual e jogar no novoprojeto.
Isso vai se tornando menos confuso com o tempo.
OO possui duas características bem bacanas, que são os conceitos de herança e polimorfismo.
Herança vem do princípio que alguns tipos de objetos possuem características e comportamentos/ações comuns.
Como carros, ônibus, caminhões, bicicletas, avióes.
Todos possuem rodas, todos possuem quantidade de lugar, todos possuem tipo de propulsão.
Todos se movimentam, todos freiam, aceleram.
Então, podemos dizer que todos são veículos, uns aéreos, outros terrestres de 2 e de 4 rodas.
A herança, como a do Mendell e as ervilhas, diz que podemos criar super classes que encapsulem características genéricas e sub classes que as herdem.
O polimorfismo é a outra grande sacada da OO.
Pense que você tem uma classe figura geometrica plana e dela duas outras, circulo e triangulo.
Ambas possuem, por herança, o método calculaArea. porém, base * altura/2 não é a fórmula de calcular a área do círculo.
Modificar o método calculaArea é uma aplicação do polimorfismo.
Há algo semelhante em C ANSI?

3 - Os métodos da OO são bem mais que apenas simples funções ou procedimentos.
Eles sintetizam, como visto antes, a idéia do polimorfismo, encapsulam as variáveis privadas (garantindo, assim, integridade) e uma série de outras benesses.
Saindo um pouco do java, para falar da OO.
O encapsulamento de variáveis no C# é muito bacana.
Aliás, um método é parte da classe, ele nasce dentro dela, não é incorporado como numa struct.
Até mesmo o método construtor, aquele que chama o super(), ele é dentro da classe.
Enquanto que na struct, é fora…

4 - Esta questão de chegar mais perto do mundo real é bem controversa. Porém, as respostas anteriores já dão a idéia do por quê OO consegue isto.
Pense numa struct pessoa.
O que ela teria de atributos?
O que uma pessoa pode fazer? Uma struct consegue dar suporte à isto?
Uma classe Pessoa sim.

5 - Aí você misturou paradigma de programação com lógica.
Por mais que tentem, para verificar se um valor é nulo e realizar qualquer tarefa, todas as linguagens implementam uma espécie de if.
É uma condição da lógica de desenvolvimento. Não importa se é um objeto ou uma função C, COBOL ou Clipper.
PE possui alguns “gatilhos” que permitem fugir da sequência, como o GOTO.
Mas ele exige que uma nova sequência seja criada.
E está disponível e, linguagens OO, como o Java.

Enfim, linguagens PE não vão morrer tão cedo. C ANSI está vivo, COBOL então, além de vivo, pagando razoavelmente bem. Apenas são diferentes de POO.
Aliás, há rumores que programar em assembler dá mais dinheiro que programar em Java.
Eu programei em C, C++ e PHP estruturado.
E programei em PHP, C# e Java OO.
Posso dizer que, para mim, é muito mais fácil criar um programa com 10 classes, cada uma com 40 linhas, do que um programa PE, com 3 arquivos, de 20 linhas cada.
Mas vai de você, camarada.
O mercado está aí.

As perguntas são pertinentes para quem está aprendendo a programar, ou mudando de paradigma.

Mas COMO você é Sun Certified Java Programmer 98% tendo essas dúvidas?

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.