duda al hacer un programa

Iniciado por andrromeda, 30 Abril 2017, 12:52 PM

0 Miembros y 2 Visitantes están viendo este tema.

andrromeda

Buenas tardes,

Estoy haciendo un trabajo (ejercicio) en Java de una tienda, que debe tener clientes, música (vinilo, cd, casete) y ventas.
En cada uno tiene que crear, listar y eliminar objetos.
los de clientes y música los tengo terminados (pasé horas en ello pero por fin lo logré), pero al llegar a la parte de ventas, me pide que cada venta tenga asociado un cliente y una música, y he ahí mi problema.. no sé como enlazar en la clase venta un cliente y una música, sabría buscarla, pero ¿¿cómo hago para que almacene en venta la información??
he probado a heredar de las dos clases, pero no me deja, sólo puedo heredar de una, y me hacen falta las dos..

muchas gracias de antemano por la ayuda..

Serapis

Clientes y Música deben ser únicas instancias y compartidas en el proyecto. Además ambas deben alojar una colección (colección cientes, colección música),... por l otanto ambas clases podrían ser instancias de una misma interfaz, que contenga métodos: Añadir, eliminar, modificar, Existe, buscar, listar y propiedades como 'Count'

La clase Ventas, teniendo acceso a las clases compartidas (en el proyecto), es también una colección (si una instancia d ela misma interfaz), solo que aquí los datos que se guardan son básicamente 3. El Id (hash, ítem) música y el Id (hash, ítem Cliente), porque cada venta se vende a un cliente y se vende música, y finalmente el resto de datos del pedido: Fecha de venta, precio, unidades, descuento,  etc... de hecho, más qu música debería ser 'Lista de artículos', donde solo mantienes los IDs de los artículos.

Indirectamente una lista de artículos es una colección, y el ítem básico es artículo: Articulo tendrá campos como: Id_Artículo, precioUnitario... Es decir la lista de artículos tendría al menos estos campos: Cantidad de artículos y Articulo (uno por cada uno en cantidad).

Para que las búsquedas fueran rápidas, las colecciones deberían ser una tabla hash, aunque como el ejercicio es didáctico, realmente no importa el tipo de colección que implementes, basta que te funcione...

En Resumen, las 3 clases podrían ser implementaciones de una misma interfaz. Diferenciándose cada clase, sólo en los datos específicos que cada una contenga.

La interfaz de usuario, podría luego tener 3 fichas, una para manejar cada colección, presentar datos (Listar todos ó n ítems desde el Xº), añadir, eliminar... (las operaciones básicas que se han implementado).

La idea es que cuando tengas varios datos interrelacionados entre sí, antes de escribir código, hagas un simple diagrama (dibuja cajas que representen las clases, y en ella escribe los nombres de los métodos que necesitará para manejarla (lo mínimo imprescindible, ya cuando vayas al código, verás la necesidad deincluir alguno más, quizás p`rivados, no públicos), luego toma flechitas y llévalas de una caja a otra, para indicar la dependencia entre ellas... así tiene smás claro, el camino a seguir con el código... sino procedes así, es fácil que se te cuelen ideas distintas decomo hacerlo, pero incompatibles entre sí... es decir que parte del código, pinta bien, pero no coincide con otra parte del código que también pintaba muy bien, pero que seguía otra idea. Cuando hay datos más o menos complejos y que están muy relacionados entre sí, sin un esquema es fácil perderse y perder mucho tiempo dando vueltas, porque parecerá una madeja de lana: desde cerca vez bien el hilo, pero cuando te alejas es un lío impresionante.

Un esquema divide y separa el proyecto en  clases, así sabes cuantas clases debes elaborar y qué deben hacer cada una. Las flechas indican luego como se conectan las claes entre sí, y que visibilidad deben tener entre ellas dentro y fuera del proyecto (de cara a la interfaz).

andrromeda

gracias por la respuesta.

La verdad que llevo poco estudiando java y el tema de las interfaces aún no lo termino de entender bien...

Por ahora lo que he hecho es crear una clase cliente, en la que he metido los métodos de añadir, listar y eliminar, otra de música, de la que heredan otras 3 clases (cd, casete y vinilo) que también tienen sus métodos de añadir, listar y eliminar, y he empezado otra clase ventas.
Si he entendido bien debería crear una interface de la que luego se implementarán clientes y música.

Pero, qué debería poner en ella?? quizás los códigos de música, clientes y ventas para que puedan acceder de uno a otro?? o mejor las clases para que pueda acceder a los datos??

Había pensado en colgar aquí el código, pero es muy largo..

muchas gracias por la ayuda!!! y siento no haberme enterado bien aún  :-\


3n31ch

#3
Hola, no tengo la suficiente información para poder ayudarte mejor, pero quizás esto sea suficiente:

Estas serian tus clases:


NombreAtributosFunciones
Cliente -id, -nombre, ...constructor(name), getId(): id, getNombre(): nombre, .... (Pones el resto)
Musica-id, -nombre, -genero, -precioconstructor(name, genero, precio), getId(): id, getNombre(): nombre, reproducir() : void, .... (Pones el resto)
Venta-id, -cliente, -musicas, -totalconstructor(-cliente, -musicas), getId(): id, getMusicas(): musicas, .... (Pones el resto)

Ok, lo primero que tienes que entender es que la clase Musica es una clase abstracta. Esto pasa ya que no puedes comprar "Musica" asi como así, tienes que comprarla en un formato ya sea CD, Casete o Vinilo.

Portanto, dicha clase abstracta al ser heredada (por ejemplo por cd) le pedira que esta implemente su constructor y sus metodos abstractos:

Código (java) [Seleccionar]
public Contructor(String nombre, String genero, int Precio) {
   /* ... */
}
public void Reproducir() { /* . PON LO QUE QUIERAS, LA GRACIA ES QUE SE NOTE QUE CADA UNO SE REPRODUCE DE FORMA DISTINTA . */}


(Si necesitas mas código de ejemplo dime)

Bien, ahora, no se si realmente te piden que esto sea "eficiente, gastar pocos recursos o algo así" en dicho caso te la tendrás que ingeniar mas, pero si no te lo exigen... es facil.

(En la siguiente parte supongo que crear cada producto unitariamente, y cada producto osea: CD, Vinilo, Disquete. Tiene su stock, su genero, nombre etc.)

Bueno, probablemente te pidan hacer algo similar a una base de datos, es por esto que puse el campo "id" en todas las clases. Una forma efectiva (probablemente no la mas eficiente) de simular una base de datos con dicho campo es la siguiente:

Código (java) [Seleccionar]

public class Cliente {
   public static int IDENTIFICATOR = 0;
   private final int id;
   private String name;
   public Cliente(String name) {
       this.id = Cliente.IDENTIFICATOR++;
       this.name = name;
   }
}


De esta forma, la variable IDENTIFICATOR que al ser static no depende de la instancia sino que es global siempre asignara su valor a la id del cliente y luego aumentara su propio valor en 1, de esta forma el siguiente cliente tendrá una id mas.. Y ya esta, con eso empleaste las IDs autoincrementales.

Bien, ahora como guardamos todos los clientes (para poder hacer una búsqueda, por ejemplo por su id).

Aca podrías usar un Diccionario con la clase Map, pero entiendo que posiblemente este sea un ejercicio basico, (y al menos a mi nunca me mencionaron eso en la universidad... realmente no me enseñaron nada (asco de universidad) ).

Así que usaremos un ArrayList. Que es como un Array cualquiera, solo que no tiene fin, puedes poner todos los elementos que quieras!! (prácticamente hablando).

Entonces en nuestra clase Cliente hacemos agregamos lo siguiente:

Código (java) [Seleccionar]
public static ArrayList<Cliente> CLIENTES = new ArrayList<>();

Y en el constructor agregamos el add:
Código (java) [Seleccionar]
CLIENTES.add(this); // justo al  final

De esta forma tenemos una "base de datos de clientes". Puedes hacer esto mismo con el resto. Pero recuerda, no lo hagas en binilo, CD, o Disquete... puesto que esto tiene que estar implementado en la clase Musica (De esta forma tendras una "Base de Datos" o mas bien "Tabla" única para toda la música sin importar que sea!)

...

Bueno, ahora para obtener los valores puedes recorrer el arreglo en busca de la ID, o si quieres por el nombre, etc.. eso te lo ingenias. Por ahora te dejo el código de la ID:

Código (java) [Seleccionar]

public int getId() {
        return this.id;
    }
    public static Cliente findClient(int id) {
        for(Cliente cliente : CLIENTES) if(id == cliente.getId()) return cliente;
        return null;
    }


Si la id es igual al cliente que estamos iterando entonces lo retorna. Y si después de todas las iteraciones no se encuentra... regresa un valor nulo (luego tu validas que si es null imprima un mensaje diciendo que no existe).

Y ahora, recuerdas que en la venta tenias "cliente" y "musicas", pues dichos atributos se verían así:

Código (java) [Seleccionar]

    private Cliente cliente;
    private ArrayList<Musica> musicas;


Entonces es facil, al concretar una venta generas un ArrayList con todas las canciones que quiere el cliente y junto a los datos del cliente lo pasas por el constructor. Para que este se almacene en nuestro ArrayList de Ventas, con una id unica... bla bla bla.

Si no te queda claro dime. Y mas tarde te respondo (que tengo que salir).






andrromeda

Gracias!!!!!!!

Me ha funcionado poner los private cliente y los de música para poder enlazar..

Muchisimas gracias!!!!!!!!!!!

En el ejercicio me han pedido que las clases cd, vinilo y casete hereden de música, por lo tanto he creado una clase con cada una y variables diferentes, cada una con sus métodos.

Por ahora ya va casi todo, al menos en crear una venta, jajaja ..ahora a seguir para poder listarlas y eliminarlas, pero con estas variables, creo que no voy a tener ningún problema para que funcione..

De nuevo muchísimas gracias!!!!

3n31ch

Cualquier cosa dinos!. Suerte con tu trabajo.  :P