Exercicio Caelum - Duvida

17 respostas
evil.hunter

Boa tarde a todos, tenho a seguinte duvida. Eu tenho a classe porta:

public class Porta {
	
	boolean aberta = false;
	String cor;
	double dimensaoX = 0.7;
	double dimensaoY = 2.00;
	double dimensaoZ = 0.15;
	
	void abre(){
		this.aberta = true;
	}
	
	void fecha(){
		this.aberta = false;
	}
	
	void pinta( String s ){
		this.cor = s;
	}
	
	boolean estaAberta(){
		if( this.aberta ==  true ){
			return true;
		} else{
			return false;
		}
	
	}

}

Também tenho a classe casa:

public class Casa {
	
	String cor;
	Porta p1 = new Porta();
	Porta p2 = new Porta();
	Porta p3 = new Porta();
	
	
}

Preciso criar um metodo que some e me retorne quantas portas eu tenho abertas...

17 Respostas

_fs

E qual a dúvida?

T
public int contaPortasAbertas (Porta portas...) {
    return 0; // TODO - Complete com a implementação da contagem. Sugestão: use o método estaAberta.

}
themasta
seria interessante que você guardasse as portas da casa num array de portas.
public class Casa {  
          
       String cor;  
       Porta p1 = new Porta();  
       Porta p2 = new Porta();  
       Porta p3 = new Porta();  
       Porta[] portas = {p1,p2,p3};
         
         
    }
no método de contar portas abertas você recebe o array de portas
public int contaPortasAbertas (Porta[] portas...) {  
//varre o array portas com for e conta, depois retorna o contador       
return 0; // TODO - Complete com a implementação da contagem. Sugestão: use o método estaAberta.  
     
   }
rmarin

Este objeto Casa deveria possuir uma lista de portas, não?

class Casa {
    List<Porta> portas = new ArrayList<Porta>();
}

Ou ainda melhor:

class Casa {
    private List<Comodo> comodos;
    // getters e setters
}

class Comodo {
    private List<Porta> portas;
    private List<Janela> janelas;
    // getters e setters
}

Deste modo seria muito mais fácil efetuar a iteração sobre os elementos da casa, sejam portas ou janelas. Além disso, a quantidade de elementos não é fixa, podemos ter n portas…

evil.hunter

O problema é o seguintes, estou seguindo a apostila da caelum. Nesta parte que estou ainda não me foi apresentado array’s. Então eu pensei que não é pra utilizar. So que nao vi uma maneira de fazer isso sem utilizar array…

gomesrod

Tudo bem, os arrays não são necessários nesse problema. O pessoal só usou array para ficar mais facil de aumentar a casa depois (mania de programador Java :slight_smile: ).

Pense na sua casa… o que você faria para verificar quantas portas estão abertas? Olharia uma por uma, se está aberta você conta, se está fechada não conta. É mais ou menos isso.

D

Ora... se você sabe que a casa tem 3 portas fixas, por quê precisa de um array ou list?!

public int contaPortasAbertas () {
     int contPortasAbertas = 0; 

     if (this.p1.estaAberta()) 
          contPortasAbertas++;

     if (this.p2.estaAberta()) 
          contPortasAbertas++;

     if (this.p3.estaAberta()) 
          contPortasAbertas++;

     return contPortasAbertas;
}

=]

rmarin
dmarcosm:
Ora... se você sabe que a casa tem 3 portas fixas, por quê precisa de um array ou list?!
public int contaPortasAbertas () {
     int contPortasAbertas = 0; 

     if (this.p1.estaAberta()) 
          contPortasAbertas++;

     if (this.p2.estaAberta()) 
          contPortasAbertas++;

     if (this.p3.estaAberta()) 
          contPortasAbertas++;

     return contPortasAbertas;
}

=]

Uau :shock:, ainda bem que não são 1000 portas, né dmarcosm?

Já pensou? :twisted:
public int contaPortasAbertas () {
     int contPortasAbertas = 0; 

     if (this.p1.estaAberta()) 
          contPortasAbertas++;
     
     // 998 copy + pastes + edits depois...
     if (this.p1000.estaAberta()) 
          contPortasAbertas++;

     return contPortasAbertas;
}
Adolfo_Rodrigues

Já aprendeu reflexão? Se sim, poderia pegar todas as Portas da sua Casa e ver se elas estão abertas. É bom que se tiver 1 ou 1000 Portas o seu código vai ser o mesmo (não vai precisar daqueles 1000 ctrl c + ctrl v)

evil.hunter

Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...

public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }
neohacker

Cara usa a solução do Thingol … já usou Varargs ??
É bem simples e fácil …
e outra parte que você poderia mexer e ficar melhor de entender.

boolean estaAberta(){ return this.aberta; }

rmarin
evil.hunter:
Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...
public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }

Cara, a minha sugestão foi exatamente para você não usar isso. Imagine, toda vez que uma casa ganhar uma nova porta você terá que colocar um novo if nesse código, isso não é legal.

Usar reflection na camada de negócios para capturar o tipo dos atributos, perguntar se é uma porta e aí sim verificar se ela está aberta, é uma solução. Porém não acho que seja a melhor saída. Reflection deve ser utilizada somente em casos em que haja realmente necessidade, ou seja, dificilmente você usa reflection na camada de negócios. Geralmente em classes de infra-estrutura, ou coisas do gênero.

Agora com relação a solução do varargs, também é uma saída, entretanto, caso a casa ganhe novas portas, além de termos que inserir novos atributos Porta a classe, teremos que colocar um novo argumento para o método contaPortasAbertas (Porta portas...).

--

Uma casa tem N portas, a não ser que seja uma casa específica, ou seja, CasaDaTiaAvóDoMarquinhos, fora isso, a melhor solução é trabalhar com uma lista. Daí você pode ter o addPorta(Porta porta), e aí sim sua casa vai poder ter quantas portas você quiser, e poderá ser a CasaDaTiaAvóDoMarquinos, CasaDoPaiDoZezão, CasaDosInferno... :lol:

Calzetta
rmarin:
evil.hunter:
Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...
public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }

Cara, a minha sugestão foi exatamente para você não usar isso. Imagine, toda vez que uma casa ganhar uma nova porta você terá que colocar um novo if nesse código, isso não é legal.

Usar reflection na camada de negócios para capturar o tipo dos atributos, perguntar se é uma porta e aí sim verificar se ela está aberta, é uma solução. Porém não acho que seja a melhor saída. Reflection deve ser utilizada somente em casos em que haja realmente necessidade, ou seja, dificilmente você usa reflection na camada de negócios. Geralmente em classes de infra-estrutura, ou coisas do gênero.

Agora com relação a solução do varargs, também é uma saída, entretanto, caso a casa ganhe novas portas, além de termos que inserir novos atributos Porta a classe, teremos que colocar um novo argumento para o método contaPortasAbertas (Porta portas...).

--

Uma casa tem N portas, a não ser que seja uma casa específica, ou seja, CasaDaTiaAvóDoMarquinhos, fora isso, a melhor solução é trabalhar com uma lista. Daí você pode ter o addPorta(Porta porta), e aí sim sua casa vai poder ter quantas portas você quiser, e poderá ser a CasaDaTiaAvóDoMarquinos, CasaDoPaiDoZezão, CasaDosInferno... :lol:

rmarin, não se esqueça que ele está aprendendo a apotila da Caelum ainda.

Calzetta

evil.hunter,

Use a solução abaixo neste momento, as apostilas da Caelum são muito boas e elas têm um objetivo pedagógio, não pule etapas.

Faça do jeito abaixo para vc manjar de lógica e atributos de classe, mais para frente vc aprenderá os modos corretos.

Siga a apostila.

evil.hunter:
Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...
public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }

D

Ao menos uma pessoa aqui entendeu o "porquê" do meu código! Este mundo AINDA não está perdido. Obrigado Calzetta!!!

=]

Calzetta:
evil.hunter,

Use a solução abaixo neste momento, as apostilas da Caelum são muito boas e elas têm um objetivo pedagógio, não pule etapas.

Faça do jeito abaixo para vc manjar de lógica e atributos de classe, mais para frente vc aprenderá os modos corretos.

Siga a apostila.

evil.hunter:
Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...
public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }

D

Ao menos uma pessoa aqui entendeu o "porquê" do meu código! Este mundo AINDA não está perdido. Obrigado Calzetta!!!

=]

Calzetta:
evil.hunter,

Use a solução abaixo neste momento, as apostilas da Caelum são muito boas e elas têm um objetivo pedagógio, não pule etapas.

Faça do jeito abaixo para vc manjar de lógica e atributos de classe, mais para frente vc aprenderá os modos corretos.

Siga a apostila.

evil.hunter:
Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...
public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }

D

Ao menos uma pessoa aqui entendeu o "porquê" do meu código! Este mundo AINDA não está perdido. Obrigado Calzetta!!!

=]

Calzetta:
evil.hunter,

Use a solução abaixo neste momento, as apostilas da Caelum são muito boas e elas têm um objetivo pedagógio, não pule etapas.

Faça do jeito abaixo para vc manjar de lógica e atributos de classe, mais para frente vc aprenderá os modos corretos.

Siga a apostila.

evil.hunter:
Adolfo infelizmente ainda não aprendi reflexão ainda. Rmarin eu vi o que estava fazendo errado, eu tinha feito código idêntico ao que você fez só que não tinha colocado o this. Por isso não estava dando certo. Alias muito obrigado a todos pelas respostas...
public int contaPortasAbertas () {  
      int contPortasAbertas = 0;   
   
      if (this.p1.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p2.estaAberta())   
           contPortasAbertas++;  
   
      if (this.p3.estaAberta())   
           contPortasAbertas++;  
   
      return contPortasAbertas;  
 }

Criado 25 de setembro de 2007
Ultima resposta 26 de set. de 2007
Respostas 17
Participantes 10