Como se tornar um bom programador 'orientado a objetos'

Programar em java nao quer dizer que vc esta programando orientado a objetos…
vc pode facilmente programar de forma ‘estruturada’ em Java… o que esta completamente errado… (vcs entenderam :wink: )

Quando vejo essas API’s do JDK fico maravilhado… como são bem feitas, extremamente bem pensadas…
incriveis mesmo…

Como posso me tornar um programador capaz de criar algo parecido?
O que devo estudar?

Livros voltados à OO, Design Patterns, Refactorings.


http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?s=books&ie=UTF8&qid=1340305649&sr=1-1&keywords=design+patterns ou http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/ref=sr_1_2?s=books&ie=UTF8&qid=1340305649&sr=1-2&keywords=design+patterns
http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?s=books&ie=UTF8&qid=1340305675&sr=1-1&keywords=refactoring ou http://www.amazon.com/Refactoring-Patterns-Joshua-Kerievsky/dp/0321213351/ref=sr_1_2?s=books&ie=UTF8&qid=1340305675&sr=1-2&keywords=refactoring

e tem que praticar também né?! :wink:

facil… estude

serio?

serio?[/quote]

e tem outra resposta melhor? :smiley:

Entendo que não basta apenas estudar. Tem pessoas que conhecem profundamente a linguagem mas não fazem programas com um código funcional. Além de conhecer a linguagem e a “filosofia da orientação a objetos”, vale a pena pesquisar sobre as publicações a respeito das melhores práticas de programação. Tem, por exemplo o livro Java Efetivo, que trata de considerações para melhorar a programação.

Agora pra ser mais especifico,pra começar não há material melhor do que as apostilas e cursos da Caelum e os livros da série Head First.

Entendo que mandar um cara estudar sendo que ele veio perguntar “O que estudar, pra que lado ir” não faz sentido, fico pasmo como alguns adoram dar uma de babaca pra aparecer em cima dos outros. (Meu comentário não ajudou em nada, mas não pude deixar de vir aqui falar isso, SE NÃO TEM RESPOSTA BOA PRA DAR, NÃO RESPONDA O TÓPICO, PORRA) Pronto :smiley:

[quote=alex1975]Tem, por exemplo o livro Java Efetivo, que trata de considerações para melhorar a programação.
[/quote]

Também sugiro a leitura do livro Effective Java. É um livro para quem conhece a linguagem e procura aperfeiçoar sua maneira de projetar e escrever código.
O autor (Joshua Bloch) foi um dos líderes do desenvolvimento das APIs do Java. Durante as dicas ele usa exemplos da API e inclusive em vários momentos fala sobre coisas que poderiam ter sido melhores.

Importante também pensar no sistema não como um aglomerado de código, mas sim como objetos e suas respectivas reponsabilidades, pensar qual é a responsabilidade da classe no sistema, e sempre focar em alta coesão e baixo acoplamento, desta forma fica simples modelar o sistema.
Diagramas de UML ajudam a ter uma visão disto, e outra coisa que o pessoal sempre comenta, mas eu ainda não utilizei é o TDD que te ajuda a projetar uma classe que seja coesa, e baixamente acoplada com outras.

[quote=faeldix]Programar em java nao quer dizer que vc esta programando orientado a objetos…
vc pode facilmente programar de forma ‘estruturada’ em Java… o que esta completamente errado… (vcs entenderam :wink: )

Quando vejo essas API’s do JDK fico maravilhado… como são bem feitas, extremamente bem pensadas…
incriveis mesmo…

Como posso me tornar um programador capaz de criar algo parecido?
O que devo estudar? [/quote]

Há alguns dias escrevi um post no meu blog que vai de encontro com sua pergunta, talvez possa ser útil para sua reflexão

http://carloseduardoxp.wordpress.com/2012/06/13/voce-realmente-cria-softwares-no-paradigma-poo/

Para complementar, vou citar dois livros que acho excelentes:

Utilizando UML e Padrões - Craig Larman - esse livro diz que a habilidade mais importante para desenvolver sistemas orientados a objetos é saber atribuir responsabilidades às classes.

Padrões de Projeto - Gangue dos Quatro - é o primeiro livro de design patterns. Além disso fala sobre os princípios para um bom projeto de software. Um ponto interessante é que as a API’s do Java aplicam diversos padrões de projeto apresentados nesse livro, como por exemplo Adapter, Iterator e Observer.

Respondendo à pergunta, acho que o primeiro passo para programar orientado a objetos é entender a teoria e os princípios. Você pode aprender numa boa faculdade ou curso, ou com um bom livro. Em particular o livro do Craig Larman traz a teoria. Ensina sobre acoplamento, coesão, princípios para atribuir responsabilidades. Traz também bons exemplos.
O segundo passo é colocar em prática, fazer sistemas tentando aplicar os princípios. Fazer diagramas de classes e de sequência ou colaboração para avaliar as questões de acoplamento, coesão, controladores e responsabilidade por criar objetos, coisas assim. Esses diagramas podem até serem feitos à mão, mas acho que ajudam nessas questões. Depois de um tempo você percebe que os seus sistemas estão ficando mais orientados a objetos, que as classes têm responsabilidades bem claras e definidas, são coesas, não têm acoplamentos desnecessários ou em excesso. Que o seu sistema é fácil de entender e manter.
Aplicar padrões de projeto também é bom, porque são soluções já testadas e com eficiência comprovada. A questão é saber quando o padrão se aplica e se compensa utilizar.

Abaixo links para os livros:

http://www.submarino.com.br/produto/177684/livros/informatica/informatica/livro–padroes-de-projeto

http://www.submarino.com.br/produto/5638283/livros/informatica/metodologiadeanalisesdesistemas/livro-utilizando-uml-e-padroes-uma-introducao-a-analise-e-ao-projeto-orientados

Link para o livro Utilizando UML e Padrões on-line, no trecho onde fala da habilidade crucial no desenvolvimento OO:
http://books.google.com.br/books?id=ZHtcynS03DIC&pg=PA34&lpg=PA34&dq=habilidade+mais+importante+responsabilidades+craig+larman+utilizando+uml+e+padr%C3%B5es&source=bl&ots=JAa3rHW2ch&sig=DARIxQdi-_UPkgmznD8GIsfJS6w&hl=pt-BR&sa=X&ei=7a22T5uvKZSi8ATnsLmyCg&ved=0CFAQ6AEwAA#v=onepage&q&f=false

Mais uma coisa, quando me refiro a projeto do sistema, não estou querendo dizer que o projeto tem que ser feito somente antes de programar. Acho que as ideias principais devem ser definidas antes de programar, mas boa parte do projeto pode ser feito enquanto se programa, ou de forma iterativa. Também quando se refatora. Por isso falei de design patterns, que é padrões de projeto, mas é importante também para um programador que pensa orientado a objetos.

Falando sobre refatoração, tem o livro importantíssimo Refatoração, do Martin Fowler:

http://books.google.com.br/books/about/Refatora%C3%A7%C3%A3o.html?hl=pt-BR&id=zPdb4QJKBtkC

Aproveitando que já foi citado UML, há um livro muito bom que utilizei em meu TCC sobre análise e projeto orientados a objetos.

http://www.fnac.pt/Uml-2-3-teoria-e-pratica-SBROCCO-JOSE-HENRIQUE-TEIXEIR/a346480

Este livro aborda não somente os diagramas UML, mas sim como analisar uma situação e representar isso de forma orientada a objetos, como por exemplo identificação e eliminação de classes.

Outro livro muito bom é do Eric Evans, Domain-Driven Design

Tá certo que muitos consideram este livro com conceitos para mais experientes, mas tem um conteúdo muito bom para desenvolvimento de sistemas.

Deixo estudos (para download) que fiz de alguns livros da série Head First:

http://pedroabs.wordpress.com/2009/03/11/estudo-do-livro-head-first/

Para se programar orientado a objetos dois livros bem legais para se iniciar são

  • Head First Design Patterns
  • Head First Object Oriented Analysis and Design