Duda sobre cómo estructurar un programa con el paradigma POO en java? (Solución)

Iniciado por ralymontes, 28 Agosto 2013, 23:29 PM

0 Miembros y 1 Visitante están viendo este tema.

ralymontes

Hola!

Comencé)a hacer un programa, sencillo, para comrpender  POO con Java, ya me quedaron claras algunas cosas.  pero tengo una duda:

Mi programa requiere que haga un arreglo de objetos y luego sobre el arreglo hacer operaciones (son pasajeros de un vuelo con 3 datos destino, origen y nombre), en donde tengo mi clase pasajero tengo los metodos get/set y el constructor.
Hice otra clase (el main), donde según yo desde ahi invoco a los metodos que trabajaran sobre los objetos.

Pero mi duda es donde vy creando los objetos que agrego al arreglo? En el main o en la clase pasajero?

Aqui el programa:

import java.io.*;
import java.util.*;
public class Control
{
   public static void main(String[] args)
   

   {
       
       pasajero array[] =new pasajero [10];
     
       int it='1';
       Scanner entradaEstandar= new Scanner(System.in);
       int op=0;
       String nombre, destino, origen,hora_llegada;
       System.out.println("Programa de de control de Vuelo");
       do
     {
       //pasajero aux=new pasajero();
       System.out.println("Seleccione una opcion o presione '0' para salir");
       System.out.println("\n\n (1) Agregar Pasajero");
       System.out.println("\n (2) Eliminar Pasajero");
       System.out.println("\n (3) Ver lista de los pasajeros");
       op=entradaEstandar.nextInt();
       switch(op)
               {
               case 1:  
                   
                   agregar();
                   break;
               case 2:  
                 //  eliminar.(nombre);
                   break;
               case 3:  
                   //mostrar_todo();
                   break;
               }
       
     }while(it=='0');
   }

public static void agregar(){
      String nom, des, or, hora;
      Scanner entradaEstandar= new Scanner(System.in);
      System.out.println("Escriba el nombre del pasajero:\n");
      nom=entradaEstandar.nextLine();
      System.out.println("Escriba el origen:\n");
      or=entradaEstandar.nextLine();
      System.out.println("Escriba el destino:\n");
      des=entradaEstandar.nextLine();
      System.out.println("Ingresa la hora de arribo:\n");
      hora=entradaEstandar.nextLine();
      pasajero aux=new pasajero();
      aux = new pasajero();
     
   }
 
}


Clase pasajero:


import java.io.*;
import java.util.*;
public class pasajero
{
   // instance variables - replace the example below with your own
   private String nombre;
   private String hora_llegada;
   private String destino;
   private String origen;

   /**
    * Constructor for objects of class pasajero
    */
   public pasajero()
   {
       // initialise instance variables
       nombre="";
       hora_llegada="";
       destino="";
       origen="";
   }

   public String getNombre()
   {
       return nombre;
   }
   public void setNombre(String nom)
   {
       nombre=nom;
   }
   
    public String getHora_llegada()
   {
       return hora_llegada;
   }
   public void setHora_llegada(String hora)
   {
       hora_llegada=hora;
   }
     public String getDestino()
   {
       return destino;
   }
   public void setDestino(String dest)
   {
       destino=dest;
   }
     public String getOrigen()
   {
       return origen;
   }
   public void setOrigen(String or)
   {
       origen=or;
   }
 
   public String toString() {
       StringBuilder sb = new StringBuilder();
       sb.append("\nNombre: ");
       sb.append(nombre);
       sb.append("\nHora Llegada: ");
       sb.append(hora_llegada);
       sb.append("\nDestino: ");
       sb.append(destino);
       sb.append("\nOrigen: ");
       sb.append(origen);    
       return sb.toString();
   }    
}

Zoik

Bueno no se si te e entendido correctamente pero intentare contestarte.

Bién, cuando tu declaras lo siguiente:

Código (java) [Seleccionar]
pasajero array[] =new pasajero [10];

Has declarado que tendras una array de 10 posiciones, pero aún así, queda todavía inicializar cada una de esas posiciones, por tanto en tu caso a continuación de la declaración deberías hacer lo siguiente:

Código (java) [Seleccionar]
array[0] = new pasajero();

Y así sucesivamente hasta llenar cada una de las posiciones, en las que cada una de esas posiciones, representa un objeto tipo pasajero distinto, cada uno con sus propias variables.

Para acceder a los métodos y variables sería en tu caso por ejemplo:

Código (java) [Seleccionar]
array[0].metodo(); //En el caso de un método
array[0].variable; //En el caso de una variable


Eso si, para acceder a estos métodos y variables deberán estar en public o creo recordar que en protected o static, corregidme si me equivoco.

Un saludo.

ralymontes

Gracias por la observación del arreglo.

Pero me gustaria que resolvieran la otra duda de como (static, public, etc) y donde debo (en el pricipal o en la clase del objeto) poner los metodos.

Saludos, Raly.

Zoik

A ver que creo que no me has entendido lo que te quería decir, el arreglo, lo creas en la main y para trabajar con el, lo haces desde la main, esto no quiere decir que en main no tengas un método agregar, un método eliminar, y un método mostrar, de echo esta correctísimo.

Lo que te quiero hacer ver es que, si quiero agregar un pasajero, trabajaré desde la main, pero accediendo a los métodos de la class pasajero, es decir:

Código (java) [Seleccionar]
public static void agregar(){
      String nom, des, or, hora;
      Scanner entradaEstandar= new Scanner(System.in);
      System.out.println("Escriba el nombre del pasajero:\n");
      pasajero[0].setNombre(entradaEstandar.nextLine());
      System.out.println("Escriba el origen:\n");
      pasajero[0].setOrigen(entradaEstandar.nextLine());
      System.out.println("Escriba el destino:\n");
      pasajero[0].setDestino(entradaEstandar.nextLine());
      System.out.println("Ingresa la hora de arribo:\n");
      pasajero[0].setHora_llegada(entradaEstandar.nextLine());
      pasajero aux=new pasajero(); //Estas dos variables no se para que están estaría bien que lo explicases
      aux = new pasajero();
     
   }


Si quieres saber la diferéncia entre los modificadores de las variables y los métodos te recomiendo san google patrón de programadores:
http://mundogeek.net/archivos/2009/03/30/modificadores-en-java/

ralymontes

Hola:

Muchas gracias, de hecho eso lo vi en un sitio de internet (los metodos en el main) pero vi otro codigo en donde están en la clase del objeto. A mi parecer esta última opcion es la mas correcta, no? (para separar metodos y variables del resto del programa). A lo que voy con esto es que es lo mas natural hablando del POO.... o una buena costumbre, si no mal entiendo el paradigma.

¿cómo podría hacer esto?

Gracias por la ayuda, los comentarios son acertadísimos.

Saludos, Raly.

Zoik

Bueno pues deberías hacer lo siguiente:

En la class pasajero, en cada uno de los métodos que son set, no le pasarías nada por parámetro y a la variable nombre, por ejemplo le asignarías un valor recogido por teclado, un ejemplo con tu metodo de la class pasajero:

Código (java) [Seleccionar]
public void setNombre()
   {
Scanner entradaEstandar= new Scanner(System.in);
System.out.println("Escriba el nombre del pasajero:\n");
nombre=entradaEstandar.nextLine();
   }


Entonces teniendo esto así configurado, en tu class Control, para poder asignar un nombre unicamente tendrias que llamar a este metodo así:

Código (java) [Seleccionar]
array[0].setNombre();
array[1].setNombre();
array[2].setNombre();
array[3].setNombre();


Espero lo hayas entendido, un saludo.

Fakedo0r

Yo encuentro mas correcto, a que crees otra clase llamada "GestionPasajero" y desde ahi manejes tus arreglos y todo lo que te haga falta referente al objeto "Pasajero". Así te saldría un código bastante elegante. Imagínate si tienes 2, 3 o 10 clases diferentes, que harás ? Si metes todo en el "Main" tal como tienes ahora, seria un lío, un código muy sucio y ahí la POO perdería toda su gracia.


Saludos.

Zoik

Si lo haces como dice Fakedoor no tendras que crear métodos static, y si ciertamente te quedara bastante mas limpio.

en la main solo tendrías que poner la instancia de la class "GestiónPasajero".

Un saludo.

Zoik

Hay lo llevas, no se si estará totalmente bien, pero espero que almenos te ayude:

Código (java) [Seleccionar]
public class Main {

public static void main(String[] args) {
new Control();
}

}


Código (java) [Seleccionar]
import java.util.Scanner;


public class Control {

int arraySize = 10;
pasajero array[] = new pasajero[arraySize];
Scanner entradaEstandar= new Scanner(System.in);

public Control(){
menu();
}

public void menu(){
int op=0;

System.out.println("Programa de de control de Vuelo");
do
      {
        System.out.println("Seleccione una opcion o presione '0' para salir");
        System.out.println("\n\n (1) Agregar Pasajero");
        System.out.println("\n (2) Eliminar Pasajero");
        System.out.println("\n (3) Ver lista de los pasajeros");
        op=entradaEstandar.nextInt();
        switch(op)
            {
            case 1:                       
                agregar();
                break;
            case 2: 
            eliminar();
                break;
            case 3:   
                mostrarTodo();
                break;
            }
      }while(op!=0);
}

public void agregar(){
int index = checkPassenger();
boolean dniDoubled;
array[index] = new pasajero();
do {
dniDoubled = false;
array[index].setDni();
for(int i = 0; i < arraySize; i++){
if(array[i] != null)
if(array[index].getDni().equals(array[i].getDni()) && i!=index){
System.out.println("El DNI introducido ya existe, vuelva a intentarlo");
dniDoubled = true;
}
}
} while(dniDoubled != false);
array[index].setNombre();
array[index].setOrigen();
array[index].setDestino();
array[index].setHora_llegada();
System.out.println("Pasajero agregado");
}

public int checkPassenger(){
int i = 0;
for(i = 0; i < arraySize; i++){
if(array[i]==null)
return i;
}
if(i == arraySize){
System.out.println("Array llena, no se pueden dar de alta mas pasajeros");
menu();
}
return i;
}

public void eliminar(){
boolean noResultsFound = true;
String dni;
System.out.println("Escriba el DNI del pasajero:\n");
dni = entradaEstandar.next();
for(int i = 0; i < arraySize-1; i++){
System.out.println(i);
if(array[i] != null)
if(array[i].getDni().equals(dni)){
array[i] = null;
noResultsFound = false;
}
}
if(noResultsFound){
System.out.println("No se encontraron coincidencias");
} else if(!noResultsFound){
System.out.println("Pasajero borrado");
}
}

public void mostrarTodo(){
boolean noResultsFound = true;
for(int i = 0; i < arraySize; i++){
if(array[i]!=null){
System.out.println("----------------------");
System.out.println("-- Pasajero "+i+1+" --");
System.out.println(array[i].getDni());
System.out.println(array[i].getNombre());
System.out.println(array[i].getOrigen());
System.out.println(array[i].getDestino());
System.out.println(array[i].getHora_llegada());
noResultsFound = false;
}
}
if(noResultsFound == true){
System.out.println("No se han encontrado pasajeros");
}
}

}


Código (java) [Seleccionar]
import java.io.*;
import java.util.*;
public class pasajero
{
    // instance variables - replace the example below with your own
    private String dni;
private String nombre;
    private String hora_llegada;
    private String destino;
    private String origen;
    private Scanner entradaEstandar= new Scanner(System.in);

    /**
     * Constructor for objects of class pasajero
     */
    public pasajero()
    {
        // initialise instance variables
    dni="";
        nombre="";
        hora_llegada="";
        destino="";
        origen="";
    }

    public String getDni()
    {
        return dni;
    }
    public void setDni()
    {
    System.out.println("Escriba el DNI del pasajero:\n");
        dni = entradaEstandar.nextLine();
    }
   
    public String getNombre()
    {
        return nombre;
    }
    public void setNombre()
    {
    System.out.println("Escriba el nombre del pasajero:\n");
        nombre = entradaEstandar.nextLine();
    }
   
     public String getHora_llegada()
    {
        return hora_llegada;
    }
    public void setHora_llegada()
    {
    System.out.println("Ingresa la hora de arribo:\n");
        hora_llegada = entradaEstandar.nextLine();
    }
      public String getDestino()
    {
        return destino;
    }
    public void setDestino()
    {
    System.out.println("Escriba el destino:\n");
        destino = entradaEstandar.nextLine();
    }
      public String getOrigen()
    {
        return origen;
    }
    public void setOrigen()
    {
    System.out.println("Escriba el origen:\n");
        origen = entradaEstandar.nextLine();
    }
   
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("\nNombre: ");
        sb.append(nombre);
        sb.append("\nHora Llegada: ");
        sb.append(hora_llegada);
        sb.append("\nDestino: ");
        sb.append(destino);
        sb.append("\nOrigen: ");
        sb.append(origen);   
        return sb.toString();
    }   
}


Te recomiendo que siempre que trabajes con registros asignes una variable que sepas que siempre será única para cada registro como por ejemplo el DNI o un código númerico, a la hora de hacer algoritmos de busqueda sobretodo te resultara más fácil.

ralymontes

Hola, Gracias por echarme una mano con esto, ha sido de graaan ayuda.

Con respecto al DNI eso lo sé, pero en este caso por ser un ejemplo sencillo de 10 pasajeros (es una aereolinea con una avioneta XD) no hay problema, sólo queria aclarar mis dudas con respecto a la POO.

Gracias a Todos!

Saludos, Raly.