dpereira Posted August 11, 2006 at 03:51 PM Report #43780 Posted August 11, 2006 at 03:51 PM viva, Comecei agora a aprender a programar em java, estou a estudar pelo livro "Programação orientada aos objectos em java 2" do F. Mário Martins. Surgiram me algumas duvidas a nivel do 'desenho' do programa, é um exercicio básico, penso que o tenha feito correctamente, mas a nível das linguagens orientadas aos objectos estará correcto. Nos métodos de instância coloquei a maioria como: public class PortamoedasMBanco { public String setsaldo(float valor){ saldo = .... ... .. return "deposito feito com sucesso"; } } classe teste public class testepm{ PortamoedasMBanco c1; c1= PortamoedasMBanco(); .. .. System.out.println(c1.setsaldo(20)); } ou devia ter feito assim, public class PortamoedasMBanco { public void setsaldo(float valor){ saldo=... ... ... } } e na classe teste então colocar, public class testepm{ PortamoedasMBanco c1; c1= PortamoedasMBanco(); .. .. c1.setsaldo(20); System.out.println("Deposito feito com sucesso"); } Não sei se me fiz entender, obrigado pelo tempo dispensado. cumprimentos, Dinis
Triton Posted August 11, 2006 at 03:57 PM Report #43782 Posted August 11, 2006 at 03:57 PM Para a próxima usa uma ferramenta chamada GeSHi que existe no fórum para postar o código. public class PortamoedasMBanco { public String setsaldo(float valor){ saldo = .... ... .. return "deposito feito com sucesso"; } } classe teste public class testepm{ PortamoedasMBanco c1; c1= PortamoedasMBanco(); .. .. System.out.println(c1.setsaldo(20)); } ou devia ter feito assim, public class PortamoedasMBanco { public void setsaldo(float valor){ saldo=... ... ... } } e na classe teste então colocar, public class testepm{ PortamoedasMBanco c1; c1= PortamoedasMBanco(); .. .. c1.setsaldo(20); System.out.println("Deposito feito com sucesso"); } <3 life
Anjo Posted August 11, 2006 at 04:00 PM Report #43783 Posted August 11, 2006 at 04:00 PM Gosto mais da segunda opção. Apesar de achar o saldo devia ser 1 coisa calculada, e não algo que se atribua. Mas se calhar o exercício é simples, e o que escreveste, deve bastar.
benny Posted August 11, 2006 at 04:11 PM Report #43785 Posted August 11, 2006 at 04:11 PM eu também sou da opinião do Anjo, a 2ª solução seria uma melhor implementação do código, porque geralmente os métodos modificadores (set...) não têm retorno, os métodos selectores é que irão ter (get...). 😛🙂 Para ser uma implementação mais completa porque não teres um método que incremente ou decremente o saldo, tendo aí um if que faça a validação da operação primeiro (para assim te impedir o saldo negativo). Seria uma aplicação mais real do problema. 😞😛 Porque como estás a fazer estás a alterar só um atributo do objecto, mas de uma "forma estática" por assim dizer. ?
M6 Posted August 11, 2006 at 04:46 PM Report #43790 Posted August 11, 2006 at 04:46 PM Creio que isso não é importante neste caso. Essa decisão teria de ser alinhada com a especificação dos requisitos, creio que o que se pretende nesse caso é ilustrar um conceito e nada mais. Num sistema real, o mais provavel era esse método devolver um boolean com o sucesso da operação. Um pequeno à parte, qual é a editora desse livro? 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
Hipnoted Posted August 11, 2006 at 07:12 PM Report #43810 Posted August 11, 2006 at 07:12 PM Eu usaria mais a segunda opção, mas cada qual tem o seu próprio modo. O que eu acho que não está muito bem é o nome do método, poi como devolve uma string devia ser "getSaldo()", se fosse um método modificador usarias o setSaldo... JAVA é assim, temos de tentar programar +- de modo análogo, ao principio é um pouco chato mas quando te habituares vais gostar... "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"
magician Posted August 11, 2006 at 07:39 PM Report #43813 Posted August 11, 2006 at 07:39 PM Eu tenho isso feito das minhas aulas de programação na univ 😄 Tambem usei esse livro para aprender o basico é muito bom. Em realção aos setSaldo deves usar o void como retorna para esse tipo de metodos, visto eles apenas atribuirem um valor, e mesmo que esse valor nao seja atribuido esse println nao vai ter qualquer funcionalidade visto que vai sempre ser executado, para alem disso não se devem fazer prints na class não main, em todos o caso se queres retornar algo pode fazer algo do genero public boolean setSaldo(float valor){ this.valor = valor; if(this.valor == valor){ return true; } else{ return false; } } Não é a forma mais correcta mas assim podes verificar se o valor foi atribuido e no caso afirmativo ele vai retornar true. PS : Para o caso de nao saberes 😄 o this é para dizer que aquele valor que tá pegado a ele é o definido na class e não o dado como argumento no metodo. I haven’t lost my mind; it’s backed up on DVD somewhere!
Knitter Posted August 11, 2006 at 07:47 PM Report #43815 Posted August 11, 2006 at 07:47 PM Vamos distinguir algumas coisas. Estamos a falar de conceito, de forma de programar OO, logo o facto de um método 'set' devolver um valor, seja ele qual for é um erro de concepção. Por definição um método 'set' recebe um valor, atribui esse valor e não faz mais operação nenhuma, qualquer validação e mensagem ao utilizador deve ser colocada num método próprio. Dito isto a primeira opção que apresentaste está errada. Esta será a opção certa: (...) private float valor = 0.0; (...) public void setSaldo(float valor) { this.valor = valor; } (...) É desta forma que deves de aprender, sempre considerando das regras, e neste caso são claras. Agora outra coisa é a programação pratica, e aqui é como se diz, "as regras existem para se quebrar", se já conheces as regras então podes quebra-las, mas apenas se já as conheces. Quando aprenderes bem os conceitos e souberes o que estás a perder/ganhar com o facto de estares a quebrar determinada regra então, e desde que sintas que as vantagens vencem as desvantagens, podes quebra-la. Quero também acrescentar que esse livro não é grande coisa, não explica bem os conceitos de POO e alguns exemplos, pelo que me lembro, deixam dúvidas e até estão um pouco errados, mesmo assim é um dos livros da editora é a FCA que melhor ensina Java. Um ponto de informação que recomendo é o Java Tutorial, que podes fazer download em http://java.sun.com/docs/books/tutorialNB/download/tutorial.zip. Tem bons exemplos e explica muito bem as funcionalidades mais avançadas que não vais aprender nesse livro. Bom estudo e se tiveres mais dúvidas pergunta. EDIT: PS : Para o caso de nao saberes Cheesy o this é para dizer que aquele valor que tá pegado a ele é o definido na class e não o dado como argumento no metodo. Não é bem assim, esse é o resultado mas o 'this' é uma referência para a classe. Nada mais nada menos. Quando fazes: public class testepm { PortamoedasMBanco c1; c1= PortamoedasMBanco(); .. .. System.out.println(c1.setsaldo(20)); } 'c1' é uma referência para uma instância da classe PortamoedasMBanco, no caso do 'this' é uma referência para a classe onde estás a "trabalhar".
magician Posted August 11, 2006 at 08:13 PM Report #43820 Posted August 11, 2006 at 08:13 PM Vamos distinguir algumas coisas. Estamos a falar de conceito, de forma de programar OO, logo o facto de um método 'set' devolver um valor, seja ele qual for é um erro de concepção. Por definição um método 'set' recebe um valor, atribui esse valor e não faz mais operação nenhuma, qualquer validação e mensagem ao utilizador deve ser colocada num método próprio. Dito isto a primeira opção que apresentaste está errada. Exacto os metodos "set" por definição devem sempre ser usados com void, mas tal como disse em casos mais avançados (que não é o caso 😄 ), pode-se kebrar as regras 😄 adaptando os metodos ao mecanismo do proprio programa. Em relação ao this pronto fica ai a explicação mais tecnica 🙂 LOL I haven’t lost my mind; it’s backed up on DVD somewhere!
dpereira Posted August 15, 2006 at 06:38 PM Author Report #44429 Posted August 15, 2006 at 06:38 PM Pessoal, obrigado pelas respostas. trinton: peço desculpa, não se volta a repetir :-) M6: a editora do livro é a FCA resumindo: Qualquer tratamento dos dados deverá ser sempre na main não só para se poder reutilizar o codigo o maximo possivel mas tb para seguir o conceito da linguagem orientada aos objectos. A dica da quebra das regras é importante neste caso não faria sentido, mas em outros mais complicados é capaz de dar jeito, como o magician referiu. mais uma vez obrigado pelas opiniões. Dinis
Knitter Posted August 15, 2006 at 06:43 PM Report #44433 Posted August 15, 2006 at 06:43 PM Qualquer tratamento dos dados deverá ser sempre na main não só para se poder reutilizar o codigo o maximo possivel mas tb para seguir o conceito da linguagem orientada aos objectos. Não sei se percebi o que queres dizer com isto mas desde já discordo. 😛 No conceito de POO não se fala em qualquer 'main'. E o método 'main' serve apenas como ponto de entrada do programa, nada mais. Os meus métodos 'main' normalmente até têm 1/2 dúzia de linhas de código.
dpereira Posted August 15, 2006 at 06:54 PM Author Report #44442 Posted August 15, 2006 at 06:54 PM Foi o que percebi dos topicos respondidos, o main (penso eu) é o ficheiro teste onde vou criar as instancias da class principal, e onde penso que seja para fazer o tratamento dos dados. Para a class ficar totalmente independente. Ou estou a ver a coisa do ponto de vista errado?
Knitter Posted August 15, 2006 at 07:02 PM Report #44449 Posted August 15, 2006 at 07:02 PM 'main' é o nome do método estático usado para iniciar aplicações. Nada mais nada menos. Que tratamento de dados pretendes fazer? Se pretenderes ver algum código simples podes ir a http://www.student.estg.ipleiria.pt/~ei10635, na secção de downloads encontras trabalhos meus que podes analizar.
Hipnoted Posted August 15, 2006 at 08:05 PM Report #44488 Posted August 15, 2006 at 08:05 PM Foi o que percebi dos topicos respondidos, o main (penso eu) é o ficheiro teste onde vou criar as instancias da class principal, e onde penso que seja para fazer o tratamento dos dados. Para a class ficar totalmente independente. Ou estou a ver a coisa do ponto de vista errado? Nada disso, o main na programação orientada a objectos não tem essa função! Aliás até nem é obrigatório um metodo main num projecto de JAVA... Aconselho-te a pesquisar mauis informação de como proramar em JAVA, pois para quem nunca teve POO pode ser algo complicado... "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"
dpereira Posted August 15, 2006 at 08:38 PM Author Report #44491 Posted August 15, 2006 at 08:38 PM vou "postar" o que fiz para ver se segui o raciocinio certo. A class principal public class PortaMoedasMBanco{ //variaveis de instancia private String titular; private float saldo; private float mpagamentos; private int tpagamentos; //construtores public PortaMoedasMBanco(String tit,float val){ titular = tit; saldo = val; tpagamentos = 0; mpagamentos = 0; } public PortaMoedasMBanco(){ titular = "Anonimo"; saldo = 0; mpagamentos = 0; tpagamentos = 0; } //metodos de instancia // para controlar o se a operação se poderá efectuar. public boolean prepagamento(float val){ return ((saldo-val) >= 0); } // public void setpagamento(float val){ // if ((saldo-val) >= 0) { // saldo=saldo-val; // tpagamentos++; // mpagamentos=mpagamentos+val; // } // } // alteração para que fique no main a decisão public void setpagamento(float val){ saldo=saldo-val; tpagamentos++; mpagamentos=mpagamentos+val; } public float getsaldo(){ return saldo; } public void setsaldo(float val){ saldo=saldo+val; } public int getnpagamentos(){ return tpagamentos; } public float getmpagamentos(){ return (mpagamentos / getnpagamentos()); } //poderia fazer outro metodo só para fazer o get do titular, para dar maior indepencia para reutilização public String getdados(){ return (titular + " " + getsaldo() + " " + getmpagamentos() + " " + getnpagamentos()); } } a classe de teste a tal que eu chamo de "main" import java.lang.*; public class testepm{ public static void main (String args[]){ //crição de instancias PortaMoedasMBanco c1, c2, c3; c1 = new PortaMoedasMBanco("titular 1",100); c2 = new PortaMoedasMBanco("titular 2",70); c3 = new PortaMoedasMBanco(); if (c1.prepagamento(20)) { c1.setpagamento(20); System.out.println("O pagamento foi efectuado com sucesso");} else{ System.out.println("Lamentamos mas não têm saldo sufeciente para efectuar este pagamento..."); } System.out.println("O seu saldo é de: " + c1.getsaldo() ); c1.setsaldo(70); System.out.println("Efectuou " + c1.getnpagamentos() + " pagamento(s)"); if (c1.prepagamento(150)) { c1.setpagamento(150); System.out.println("O pagamento foi efectuado com sucesso");} else{ System.out.println("Lamentamos mas não têm saldo sufeciente para efectuar este pagamento..."); } System.out.println("A média do valor gasto nos seus pagamentos é de: " + c1.getmpagamentos()); System.out.println("O seu saldo é de: " + c1.getsaldo() ); } } por exemplo o if que ali tenho tem mais logica ser feito na classe teste ou na principal, penso que seja melhor na classe teste pois tenho controle sobre o output. São exercicios iniciais e simples do livro, mas ainda trabalhosos para mim. 😄 Obrigado knitter sempre ajuda ter mais exercicios para referencia. a página está baril 😛 .
Hipnoted Posted August 15, 2006 at 09:01 PM Report #44498 Posted August 15, 2006 at 09:01 PM Também dá assim, mas podias ter feito o código que puseste no main() num outro método... Mas é questão de escolha. Já vi que estás a seguir o estilo de escrita em JAVA, é assim que deves fazer, mas encontrei um pequeno senão: em vez de pores getsaldo() poem getSaldo() ou em vez de setpagamento() poem setPagamento... etc etc... Deve-se pôr a primeiro letra da paravra sempre em Maiúscula: ex: getNumeroDeHoras(), setDinheiro(), ... "Nunca discutas com um idiota. Eles arrastam-te até ao seu nível e depois ganham-te em experiência"
Knitter Posted August 15, 2006 at 09:07 PM Report #44499 Posted August 15, 2006 at 09:07 PM Vou tentar alterar o teu código e explicar... Vou colocar uns comentários de forma a que fique código pronto a usar. Vou considerar que existiu trabalho de modelação antes de começares a programar, por isso sempre que algo faça mais sentido a nível teórico vou indicar, não quer dizer que esteja mal, quer apenas dizer que não está correcto a níve de POO. public class PortaMoedasMBanco{ //variaveis de instancia private String titular; private float saldo; //------ Podes iniciar logo os valores aqui, evitas usa-los no construtor, mas não é importante private float mPagamentos; //------ Esta variável deveria ser um objecto. [Erro de POO] Ex.: private TipoPagamento tipoPagamento; private int tPagamentos; //construtores public PortaMoedasMBanco(String tit,float val) { titular = tit; saldo = val; //----- tendo em conta a iniciação na declaração das variáveis removi as linhas que aqui estávam } public PortaMoedasMBanco() { titular = "Anonimo"; saldo = 0; mPagamentos = 0; tPagamentos = 0; } //metodos de instancia // para controlar o se a operação se poderá efectuar. public boolean prePagamento(float val) { return ((saldo-val) >= 0); } //----- Removi o método comentado. // alteração para que fique no main a decisão public void setPagamento(float val){ saldo=saldo-val; tpagamentos++; mpagamentos=mpagamentos+val; } public float getsaldo(){ return saldo; } //----- ERRO! um método set atribui um valor. // public void setsaldo(float val){ // saldo=saldo+val; // } //------ Método correcto public incrementarSaldo(float incremento) { saldo += val; } //------ atenção à regra de nomenclatura. public int getNPagamentos(){ return tpagamentos; } //---- Mais uma vez o nome do método não está correcto // public float getmpagamentos(){ // return (mpagamentos / getnpagamentos()); // } public float obterMPagamentos(){ //---- não precisas de sobrecarregar com mais uma chamada a um método quando tens acesso directo à variável return mpagamentos / tPagamentos; } //poderia fazer outro metodo só para fazer o get do titular, para dar maior indepencia para reutilização //Este método é desnecessário, pelo menos com este nome. Se um programador quiser obtém os dados usando os métodos get para cada variável // public String getdados(){ // return (titular + " " + getsaldo() + " " + getmpagamentos() + " " + getnpagamentos()); // } //---- O que queres fazer é conseguido ao redefinires o método toString que todos os objectos têm public String toString() { //----- Repara que apenas copiei a tua linha de código, neste caso tal como anteriormente não seria necessário acederes às variáveis pelos métodos. Só vais sobrecarregar a aplicação. return ("" + titular + " " + getsaldo() + " " + getmpagamentos() + " " + getnpagamentos()); } } Estes são os erros mais básicos que estou a ver. Entretanto alguém respondeu ao tópico e já vejo se é preciso acrescentar alguma coisa. Tens de ter atenção às normas de codificação do java que não estás a seguir e ao facto de que no método main não estás a fazer qualquer tratamento de dados, só estás a dar algum feedback utilizador que nem é muito útil.
Knitter Posted August 15, 2006 at 09:25 PM Report #44501 Posted August 15, 2006 at 09:25 PM public class PortaMoedasMB { private String titular; private float saldo = 0.0; private float mPagamento = 0.0; //Continuo a cosiderar esta opção errada mas para o exemplo serve. Tem é em mente que não é o mais correcto. private int tipoPagamento = 0; public PortaMoedasMB() { titular = "Anónimo"; //todas as outras variáveis já têm valores por defeito. } public PortaMoedasMB(String titular, float saldo, float mPagamento, int tipoPagamento) { this.titular = titular; this.saldo = saldo; this.mPagamento = mPagamento; this.tipoPagamento = tipoPagamento; } public void setTitular(String titular) { this.titular = titular; } public void setSaldo(float saldo) { this.saldo = saldo; } public void setMPagamento(float mPagamento) { this.mPagamento = mPagamento; } public void setTipoPagamento(int tipoPagamento) { this.tipoPagamento = tipoPagamento; } public String getTitular(String titular) { return titular; } public float getSaldo() { return saldo; } public float getMPagamento() { return mPagamento; } public int getTipoPagamento() { return tipoPagamento; } public void incremetarSaldo(float incremento) { saldo += incremento; } public String toString() { return "Titular: " + titular + "\nSaldo: " + saldo + "\nMPagamento: " + mPagamento + "\nTipoPagamento: " + tipoPagamento; } public boolean autorizarPrePagamento(float pagamento) { return ((saldo-pagamento) >= 0); } } Isto é uma codificação geral do que percebi do problema, como podes ver a classe não tem grandes funcionalidades mas estes são os métodos mais básicos. Quanto à classe de teste nã há grande coisa a dizer, uma vez que a está a usar para testar podes fazer nela o que quiseres. Espero não ter maçado muito.
dpereira Posted August 15, 2006 at 09:36 PM Author Report #44506 Posted August 15, 2006 at 09:36 PM Sim se os iniciar logo evito estar a inicialos como a repetilos tantas vezes quanto o número de construtores. //------ Esta variável deveria ser um objecto. [Erro de POO] Ex.: private TipoPagamento tipoPagamento; private int tPagamentos; não estou a perceber esta parte, esta variavel serve para dar o número total dos pagamentos efectuados com aquele cartão. Mesmo se te estás a referir ao mPagamentos essa variavel é a media dos pagamentos efectuados pelo cartão em causa. As nome dos metodos é habito do haskell foi a ultima que tive a estudar. :-/ mas isto vai ao lugar. O tratamento dos dados na verdade o que queria dizer era dár feedback ao utilizador. Ainda não estava concluido nem haverá muita necessidade de o fazer, foi mais para ver se estaria correcto e se estava a devolver os valores correctos. obrigado pelas ajudas que me estás a dar, vai dar para corrigir os erros. Estive a ver alguns dos teus trabalhos, ainda é muito a frente para mim, tens alguns mais basicos? 😛
Rui Carlos Posted August 15, 2006 at 09:38 PM Report #44507 Posted August 15, 2006 at 09:38 PM Qualquer tratamento dos dados deverá ser sempre na main não só para se poder reutilizar o codigo o maximo possivel mas tb para seguir o conceito da linguagem orientada aos objectos. Não sei se percebi o que queres dizer com isto mas desde já discordo. 😛 No conceito de POO não se fala em qualquer 'main'. E o método 'main' serve apenas como ponto de entrada do programa, nada mais. Os meus métodos 'main' normalmente até têm 1/2 dúzia de linhas de código. pois eu não discordo. devemos dividir o programa em duas partes: a parte computacional e a parte de interface com o utilizador, pois isto possibilita uma melhor reutilização do código (tal como já foi referido). aliás, parece-me que as classes do JAVA funcionam assim. não quer isto de modo nenhum dizer que a parte não computacional do programa tenha que estar toda na função main ou na classe onde esta está definida, deve sim estar em classes/ficheiros separados. Quero também acrescentar que esse livro não é grande coisa, não explica bem os conceitos de POO e alguns exemplos, pelo que me lembro, deixam dúvidas e até estão um pouco errados, mesmo assim é um dos livros da editora é a FCA que melhor ensina Java. acho que o livro é bastante bom para quem está a aprender JAVA (sobretudo se o estiver a fazer sozinho). posso dizer que já li muito tutoriais de JAVA e sobretudo de C++ com muito falhas na parte de POO, mas este não me parece que seja o caso. acho que o único defeito do livro é ser muito básico. Rui Carlos Gonçalves
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now