Duas perguntas de OO

Olá pessoal.Sou novo por aqui e o principal motivo que estou aqui é porque tenho umas dúvidas de OO, e logo logo vou começar a aprender Java tmb (ja “brinco” com Delphi…)e ai vc’s arrumaram mais uma dor de cabeça comigo. :stuck_out_tongue:

Então, quando se diz que em OO há separação de responsabilidade isso significa que?

E quando se diz em OO que mesmo que dois objetos pertençam a mesma classe eles serão diferentes.Por que? Sei que os valores de seus atributos serão diferentes(ou até podem ser iguais…), mas a estrutura (classe) é igual.Eles são diferentes em que ? Só consigo pensar que são diferentes em posição de memória (isso quando criados separadamente, não um criado e atribuído a outro).Não sei se me entenderam.

Obrigado.

[quote=JAVAhli]Olá pessoal.Sou novo por aqui e o principal motivo que estou aqui é porque tenho umas dúvidas de OO, e logo logo vou começar a aprender Java tmb (ja “brinco” com Delphi…)e ai vc’s arrumaram mais uma dor de cabeça comigo. :stuck_out_tongue:

Então, quando se diz que em OO há separação de responsabilidade isso significa que?

E quando se diz em OO que mesmo que dois objetos pertençam a mesma classe eles serão diferentes.Por que? Sei que os valores de seus atributos serão diferentes(ou até podem ser iguais…), mas a estrutura (classe) é igual.Eles são diferentes em que ? Só consigo pensar que são diferentes em posição de memória (isso quando criados separadamente, não um criado e atribuído a outro).Não sei se me entenderam.

Obrigado.

[/quote]

Na OO, cada objeto possui muito bem definidas suas propriedades ( atributos ) e suas ações ( métodos ); Um objeto acumula para si apenas as responsabilidades que lhe cabem e pode oferecer suas “habilidades” a outros objetos através de troca de mensagens. Assim, tudo tem um papel definido, modelando bem a situação do mundo real.

Quanto à segunda pergunta:
Há duas coisas que identificam um objeto: um identificador único e seus atributos;
A princípio, os objetos diferem entre si pelo valor de suas variáveis de instância ( atributos ). Veja:

public class Pessoa
{
   String nome;
   int idade;
   public pessoa( String nome, int idade )
   {
      this.nome = nome;
      this.idade = idade;
   }
}

...
em outra classe:
Pessoa p1 = new Pessoa( "João", 10 );
Pessoa p2 = new Pessoa( "João", 10 );

Repare que instanciei dois objetos da classe Pessoa, com os mesmos atributos. Todavia, eles NÃO são o mesmo objeto.
Uma mudança em um deles não terá qualquer influência sobre o outro, pois cada um deles possui um identificador diferente. Conforme você mesmo disse, isso ocorre mesmo a nível de memória. Cada um ocupa um espaço distinto dentro dela.

Se eu fizer, por exemplo:

p1 = p2;

Aí sim teremos o mesmo objeto.
p1 referenciará o mesmo objeto que p2 e o objeto que p1 referenciava será marcado para o coletor de lixo, pois não mais possui referências no código.

Obrigado Carnevalli.
Agora entendi aonde esta essa seperação de “responsabilidade”, e vejo em mais um conceito,se pode chamar assim, que OO é mais como você programa, não importa qual linguagem vc use(claro, as linguagens para OO tem facilidade) é o que eu tenho lido em muitos sites…e mais umas coisas.Mas uma coisa é certa, é MUITO melhor OO.

:smiley:

De fato, a orientação a objetos é um paradigma e não uma linguagem de programação.

Há várias linguagens que implementam esse paradigma, cada uma com suas pecualiaridades, mas preservando os conceitos principais da OO.

O grande lance é que a maior ênfase, na OO, está na solução do problema real em alto nível de abstração. Aliás, abstração é uma palavra-chave pra quem modela em OO. Não se preocupe, a princípio, sobre como será feito, mas sim, com o que será feito.

Uma vez sendo definida a parte mais abstrata, fica tranqüila a definição das partes mais específicas…

Por exemplo, a UML é uma grande ferramenta para quem trabalha com OO. Na maioria dos casos, um mesmo diagrama de classes pode ser implementado em Java, C#, Delphi ou qualquer outra linguagem orientada a objetos. Aí é que se pode realmente visualizar o quão focado na solução está o paradigma OO e quanto são minimizados os esforços relativos à implementação.

Nem sempre.
Na computação de alto desempenho ainda se trabalha muito com linguagem estruturada.
E em termos de produtividade, nem sempre a OO é vantajosa. Pergunte a um dono de softhouse que trabalha com Delphi sobre o que ele pensa sobre OO :XD:
Ele está certo? errado? Não sei! Se ele acha que para o tipo de aplicação que desenvolve, programar “orientado a eventos” é mais produtivo, tudo bem…
Tudo depende do problema que se tem a ser resolvido!

A sim claro, OO é um paradgma, é que eu cada vez mais vejo que OO depender mais da abstração, modelagem, como vc disse.

E quanto ao que vc disse sobre nem sempre ser melhor OO eu li hoje mesmo um artigo sobre isso mesmo, e era para Delphi mesmo.Mas quando se tem algo um pouco grande, Oo ajuda muito.Como vc disse, depende do caso mesmo.Como eu li tmb, acho que o que acaba sendo melhor é uma mistura dos dois.Mas ainda estou engatinhando em OO.

Obrigado mais uma vez. :smiley:

Olá JAVAhli, seja bem vindo.

também trabalhava com o Delphi antes de iniciar no Java e quando comecei também tinha esse tipo de dúvidas:

No Delphi colocamos no formulario o acesso aos dados (TClientDataSet, TQuery, TTable), os componentes para visualização das informações e tambem as regras para manipulação destes dados, tudo misturado.
Mais as boas praticas de programação OO dizem se que devemos dividir as responsabilidades entre vários objetos assim cada uma faz uma parte da tarefa e nenhum deles fica sobrecarregado, isto ajuda também na manutenção do sistema, porque objetos mais simples são mais fáceis de modificalar (Isto é verdade em termos) . Então no java teríamos uma estrutura da seguinte forma:

A responsabilidade de gravação das informações em um banco de dados seria tarefa de uma classe do tipo DAO (Data Access Object), sendo assim a classe Pessoa (do exemplo do Carnevalli), não precisa se preocupar onde estas informações irão ser armazenadas (Banco de Dados, arquivo XML, se esta em um servidor local, remoto, etc). Ex:

PessoaDao pessoaDao = new PessoaDao(Pessoa);
pessoaDao.Salvar();

Neste exemplo estou criando uma classe DAO para o armazenamento das informações da classe pessoa, passando como parâmetro a própria classe pessoa, então peço ao DAO para salvar estas informações.

A tarefa de exibição dos dados poderia ser delegada para uma outra classe que utilizaria paginas JSP (no caso de uma aplicação web), para exibir as informações;

Um dos principais padrões de projetos utilizados no java é o Model View Controler, e se você não ouviu falar com certeza ouvirá, porque é muito utilizado no desenvolvimento hoje em dia.

As regras e padronizações de boas práticas de programação podem ser aplicadas a qualquer linguagem OOP (inclusive no Delphi), só que o paradigma orientado ao objeto muitas vezes é uma mudança muito radical na forma como modelamos nossas aplicações, sendo assim muitos profissionais acostumados a escreverem codigo espaguete relutam de todas as formas a mudarem seus hábitos. Ha casos como citado pelo Carnevalli em que a OOP não atende, mais não creio que seja o caso das aplicações feitas em Delphi que em sua grande maioria são aplicações comerciais e que se beneficiariam muito com a OOP, o que vi até hoje são muitos profissionais acomodados e com preguiça de aprenderem uma nova forma de programação.

Espero ter ajudado,

Um grande abraço.

[quote=JAVAhli]Olá pessoal.Sou novo por aqui e o principal motivo que estou aqui é porque tenho umas dúvidas de OO, e logo logo vou começar a aprender Java tmb (ja “brinco” com Delphi…)e ai vc’s arrumaram mais uma dor de cabeça comigo. :stuck_out_tongue:

Então, quando se diz que em OO há separação de responsabilidade isso significa que?
[/quote]

Se OO tivesse DNA a separação de responsabilidade seriam as leis da quimica que governam o DNA.
A separação de responsabilidade é um conceito muito além de OO ou de informática. Significa: preocupe-se com o seu e deixe trabalhar os outros. Traduzida para informática ela dá origem à prioria OO e todas as suas propriedades como o proprio conceito de classe, herança etc…
Para mais explicações leia isto

O que os faz diferentes é a sua identidade. Este é conceito abstracto, matemático, tlv um pouco dificil de alcançar. Pense assim: dois gemeos são iguais, mas não são o mesmo. São duas pessoas e não uma pessoa só.
O mundo é feito de biliões de pessoas. Todas são pessoas, mas todas são únicas.
Classe é um conceito de molde. Quando vc cria uma classe vc está escrevendo como os objetos serão criados, destruidos e como eles se comportam “em vida”. Vários objetos são seguir as mesmas regras , mas o seu estado (o conjunto dos valores dos seus atributos ) será diferente.
A diferença é baseada no conceito de identidade. Estude esse conceito e vc vai entender.

pense assimm vc é um objeto e seu colega de trabalho tb é outro objeto e cada um com suas responsabilidades e trabalham na mesma class, ou seja, empresa…

:smiley:

Entendi pessoal.Agora é programar e ir aprendendo, pq só com um contato com uma linguagem que use bem OO (como Java) é que irei fixar bem o aprendizado.

Obrigado pessoal… :smiley: