Calculadora "Bem OO"  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
aajjbb
JavaEvangelist
[Avatar]

Membro desde: 23/02/2010 15:58:10
Mensagens: 303
Offline

Para testar um pouco dos meu ainda pouco conhecimento em java, resovi criar essa calculadora, gostaria de saber se minha "logica" esta bem orietanda a objetos ou não, eu acho q poderia usar interfaces na implementação das operações, mas nao soube como fazer em um primeiro momento, se alguem puder opinar, agradeceria.



Operações



OneSr
Entusiasta Java
[Avatar]

Membro desde: 03/10/2010 00:08:07
Mensagens: 22
Localização: Caraguatatuba-SP
Offline

Olha aajjbb, fato seja dito, você realmente está pensando corretamente em POO, más uma coisa poderia ser melhorada nessa sua maneira de pensar, digamos que no seu exemplo, você criou uma classe principal e varias classes com as 4 operações básicas, o mais indicado em relação a POO para você pensar seria a seguinte situação, criar uma classe principal exemplo 'DriverCalulator' e apenas uma unica classe 'Calculadora' com seus métodos, métodos esses que devem fazer as 4 operações básicas, e em relação a fazer isso com um toque gráfico poderia utilizar um JFrame ou em um primeiro momento bem básico a API JOptionPane, só mais uma coisa, não esqueça de criar um construtor para a classe, só para evitar a perda de informações caso a criação do objeto falhe por falta de um inicializador na memória.

Espero ter ajudado na opnião.

This message was edited 1 time. Last update was at 04/10/2010 20:30:30


Estudando ... Estudando ... Desenvolvendo com tecnologias livres, e conhecendo as privadas.
[MSN]
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

Na minha opinião está muito procedural isso. Leia esse tópico que acho que pode te dar uma idéia de como fazer isso de forma mais OO.

[]s

This message was edited 1 time. Last update was at 04/10/2010 20:42:05


Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
OneSr
Entusiasta Java
[Avatar]

Membro desde: 03/10/2010 00:08:07
Mensagens: 22
Localização: Caraguatatuba-SP
Offline

renzonuccitelli wrote:Na minha opinião está muito procesural isso. Leia esse tópico que acho que pode te dar uma idéia de como fazer isso de forma mais OO.

[]s


realmente está muito procesural, mais dito que ele está pensando só como os objetos funcionam...acho isso um bom exercício antes de implementar isso diretamente na realidade do mundo, pelo menos para mim funcionou 'antes de entrar no mundo real' trabalhar com pequenos exemplos fora do mundo real em si, repare na frase que ele colocou logo no começo:
para testar um pouco dos meu ainda pouco conhecimento em java, resovi criar essa calculadora, gostaria de saber se minha "logica" esta bem orietanda a objetos


a lógica esta correta a não ser pelo fato que já esclareci anteriormente.

This message was edited 3 times. Last update was at 04/10/2010 20:44:20


Estudando ... Estudando ... Desenvolvendo com tecnologias livres, e conhecendo as privadas.
[MSN]
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

OneSr wrote:
renzonuccitelli wrote:Na minha opinião está muito procesural isso. Leia esse tópico que acho que pode te dar uma idéia de como fazer isso de forma mais OO.

[]s


realmente está muito procesural, mais dito que ele está pensando só como os objetos funcionam...acho isso um bom exercício antes de implementar isso diretamente na realidade do mundo, pelo menos para mim funcionou 'antes de entrar no mundo real' trabalhar com pequenos exemplos fora do mundo real em si.


É importante tentar aprender os conceitos OO desde o início. Eu tb programava de forma muito procedural no início e estou dando uma dica pro autor como eu gostaria que fizessem comigo. Programar em OO necessita o entendimento da importância da abstração e como implementá-la usando interfaces e classes abstratas. Além de isso te trazer a vantagem de maior reuso e desacoplamento, te ajuda a entender a arquitetura de muitos frameworks que existem.

Vou fazer um esboço de calculadora OO e colocar aqui, baseado no tópico que mandei o link.

Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
Allan Barcelos
JavaChild
[Avatar]

Membro desde: 01/04/2010 21:25:52
Mensagens: 114
Localização: Triunfo - RS
Offline

Olha é melhor colocar tudo em uma classe só, tu pode continuar usando o Scanner para ler os dados

[Email] [MSN]
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

Olá, vou tentar colocar alguns conceitos de Poliforfismo e abstração nessa calculadora.

O que eu quero é que minha calculadora efetue cálculos. Sua responsabilidade vai ser de pegar os dados do usuário e ir imprimindo de acordo, executando operações que lhe são adicionadas. Então vai a interface que representa minha abstração:


Feito isso eu pensei na abstração de minhas operações. Elas devem calcular argumentos, devem informar quantos argumentos espera e devem saber seu símbolo. Então vai minha abstração de Operação:



Com essas abstrações, implementei minha calculadora de forma que as inserções de dados se proceda igual nas calculadoras comuns (informa o primeiro argumento, escolhe operação, insere segundo argumento se for operador binário)


Perceba o meu construtor. É nele que insiro as operações suportadas pela minha calculadora, passando como parametro. Isso vai ser importante daqui a pouco.
Também estou mapeando as operações de acordo com seu símbolo, de forma a acabar com o bloco switch. Blocos if else ou switch grande é mal cheiro. Pra dar manutenção é um saco.

Eu quero que minha calculadora execute uma adição, então vamos implementar a Adição, que é uma Operação:



Agora eu faço minha classe pra rodar a calculadora:


Legal, temos uma calculadora que faz adição. Mas vamos supor que queremos uma mais poderosa. Queremos uma com subtração.

Basta então criar a nova Operação:



E então adicionar na sua Calculadora:


Perceba que eu não mexi no código da calculadora para acrescentar a subtração. Então esse polimorfismo e abstração é um pulo do gato para reusar código. Para adicionar operações, basta seguir os passos iguais aos anteriores:

1) Extenda IOperacao, implementando sua operação.
2) Adicione a Operação na Calculadora, sem ter que mudar nada no código da mesma.

Um bom exércício seria implementar o fatorial, para ter um operador unário.

Espero ter conseguido ajudar, mesmo tendo feito a coisa meio rápido e sem tratar erros. O que importa é o conceito.

[]s














Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

Fiquei curioso pra ver se funcionava com operador unário.

primeiro inseri um código pra informar os simbolos válidos pro usuário:


Aí implementei o Fatorial:


E funcionou a contento.

[]s


Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
aajjbb
JavaEvangelist
[Avatar]

Membro desde: 23/02/2010 15:58:10
Mensagens: 303
Offline

é, estou lendo e relendo varias vezes, percebi que estou pensando muito procedural mesmo, e esse exemplo do renzonuccitelli esta sendo um pouco dificil de assimilar, mas, em um geral, muito mais facil para manuntençao e adição de operações. esse metodo recursivo do fatorial tambem esta sendo um desafio, mas a compreenção ja aumentou.

aajjbb
JavaEvangelist
[Avatar]

Membro desde: 23/02/2010 15:58:10
Mensagens: 303
Offline

mais uma duvida..

a classe calculadora na linha 18 se referencia a Interface IOpercao mesmo sem implementala, como isso nao gera erro?

renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

aajjbb wrote:é, estou lendo e relendo varias vezes, percebi que estou pensando muito procedural mesmo, e esse exemplo do renzonuccitelli esta sendo um pouco dificil de assimilar, mas, em um geral, muito mais facil para manuntençao e adição de operações. esse metodo recursivo do fatorial tambem esta sendo um desafio, mas a compreenção ja aumentou.


É normal ser dificil de entender no início. Procedural para mim tb era muito mais fácil de enxergar, parece mais com a forma que as idéias primeiramente vem à mente, numa passo a passo bem definido de instruções. Com o tempo vc chega lá. Eu dou curso de OO básico na Nuccitec e aprensento esses conceitos. Tentei colocar aqui um resumo, mas confesso que escrever de forma clara o conceito, sem interagir, realmente é mais difícil. Também usei algumas API

Quanto a interface IOperacao da linha 18 o que e interessa é eu saber sua assinatura, não sua implementação. Isso que o polimofismo que ensinam nos cursos básicos, só que muitos professores, principalmente de faculdade, ficam dando voltas e voltas para explicar um conceito razoalvelmente simples. Perceba que a calculadora não sabe quais operações ela faz, ela simplesmente permite a vc adicionar essas operações através do construtor. Essa característica que me permite adicionar novas operações sem alterar o código da calculadora.

Antes de conseguir abstrair interfaces, eu fazia um procedimento diferente. Eu criava a interface IOperacao sem nenhum método. Aí colocava a interface na calculadora e ia escrevendo o código. Durante a escrita da calculadora, as necessidades de métodos da Interface IOperacao vão nascendo junto com a implementação do código. Então pensar em OO acaba sendo responder a seguinte pergunta: Que informações minha interface deve me fornecer para eu completar minha tarefa? Inclusive é comum no início vc mudar várias vezes sua interface. E inclusive é isso que muitos frameworks fazem, mudando suas vesões quando alteram demais suas interfaces de forma que se tornam incompatíveis com versões anteriores.

Espero ter conseguido explicar um pouco minha visão de OO.

[]s

Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
aajjbb
JavaEvangelist
[Avatar]

Membro desde: 23/02/2010 15:58:10
Mensagens: 303
Offline

é, na verdade ainda esta sendo dificil digerir este codigo por completo, na verdade, ja tenho uma certa experiencia com java e outros frameworks da plataforma a um tempo, mas acho q minha mente ainda esta procedura, como voce disse, é sempra a primeira logica que vem a cabeça, estou usando os java tutorials para refrescar um pouco a memoria, mas, como sou muito pouco criativo, se você pudesse me dar outra ideia de "sistema" para testas e aprimorar meus conhecimentos em "java/OO" seria de uma grande ajuda.... desde já, obrigado pela atenção.

renzonuccitelli
GUJ Master

Membro desde: 17/09/2008 12:58:32
Mensagens: 1133
Offline

aajjbb wrote:é, na verdade ainda esta sendo dificil digerir este codigo por completo, na verdade, ja tenho uma certa experiencia com java e outros frameworks da plataforma a um tempo, mas acho q minha mente ainda esta procedura, como voce disse, é sempra a primeira logica que vem a cabeça, estou usando os java tutorials para refrescar um pouco a memoria, mas, como sou muito pouco criativo, se você pudesse me dar outra ideia de "sistema" para testas e aprimorar meus conhecimentos em "java/OO" seria de uma grande ajuda.... desde já, obrigado pela atenção.


Eu programava há uns dois anos de forma procedural em Java. Só fui realmente abrir a mente quando desenvolvi o JColtrane junto com o Eduardo Guerra, editor chefe da MundoJ (antiga Mundo Java). Por mais que tenha muito material na net, trocar idéias com pessoas mais experientes é a melhor forma. Recomendaria para vc fazer um curso básico de OO com alguma pessoa que manje. Ver esse código pronto realmente é dificil de digerir, mas vc vendo a pessoa fazer, vendo o passo a passo, fica mais fácil. E não existe isso de ser criativo. Depois que vc entendo os conceitos básicos, vc passa a pensar nessa forma de programar naturalmente.

Perceba a semelhança nesse código que fiz da calculadora com o outro, do outro tópico onde fiz um cara que calculava área.

E se estiver na região do Vale, recomendo a www.nuccitec.com.br, onde dou aula.

Exercícios para colocar esse tipo de solução existem alguns até famosos:

Contrua um Zoologico que permita a vc adicionar animais. O zoologico deve ter um método fazer barulho onde cada animal faz o seu barulho especifico.

Construa uma pista de corrida onde vc pode adicionar veiculos, e ao executar a largada, cada veiculo acelera de acordo com seu motor.

Contrua um carro e troque o seu motor pra ele ficar mais pontente, acelerando mais rápido.

Em todos esses casos, vc pode usar o mesmo jeitão de solução que coloquei aki.

[]s

This message was edited 2 times. Last update was at 05/10/2010 20:45:18


Renzo Nuccitelli

Engenheiro de Computação - ITA

http://nuccitec.com.br/
http://blog.nuccitec.com.br/
http://jcoltrane.sf.net
http://jfera.nuccitec.com.br/
http://code.google.com/p/webapp-ce/
aajjbb
JavaEvangelist
[Avatar]

Membro desde: 23/02/2010 15:58:10
Mensagens: 303
Offline

ok, otimos exemplos, ja estou começando a implementar agora, engraçado, como sou de pindamonhangaba, acho q é menos de 40 min de de SJC, alias, vou ai com frequencia rsrs.

aajjbb
JavaEvangelist
[Avatar]

Membro desde: 23/02/2010 15:58:10
Mensagens: 303
Offline

alias, achei estranho o nome desse seu projeto, ja ia perguntar se havia alguma coisa haver com o saxofonista john coltrane, mas, ao entrar no site, respondeu minha pergunta...

 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team