• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

dpereira

pedido de ajuda

21 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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");
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...).   :P:)

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.   :(:P

Porque como estás a fazer estás a alterar só um atributo do objecto, mas de uma "forma estática" por assim dizer.  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tenho isso feito das minhas aulas de programação na univ :D

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 :D 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :D), pode-se kebrar as regras :D adaptando os metodos ao mecanismo do proprio programa.

Em relação ao this pronto fica ai a explicação mais tecnica :) LOL

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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. :P

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

'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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.  :D

Obrigado knitter sempre ajuda ter mais exercicios para referencia. a página está baril :P.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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(), ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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. :P

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa, li "tipo de pagamentos" e não "total de pagamentos", e até foi isso que fiz no código :D. OK agora percebi correctamente, retira o que disse, essa variável está bem com está :P

Esse é um grande defeito do livro, quando aprendes mais sobre java percebes que esse livro foi uma perda de tempo, pelo menos é assim que o vejo. Quando precisei de programar em java esse livro nãosó não respondia

às questões como tive de aprender o que supostamente já tinha aprendido porque no livro as coisas não estão muito bem.

No entanto devo dizer que para quem quer começar e prentede apenas uma base e não quer ler inglês, esse é dos melhores. Mas até agora nada bate o java tutorial, seja de que forma for lá está tudo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora