Foros del Web » Programando para Internet » Javascript »

Problema con POO y base de datos

Estas en el tema de Problema con POO y base de datos en el foro de Javascript en Foros del Web. Hola a todos! Estoy trabajando en el código que pongo debajo y estoy encallado. Por favor, a ver si me podéis echar un cable, y ...
  #1 (permalink)  
Antiguo 25/04/2012, 03:31
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Exclamación Problema con POO y base de datos

Hola a todos!

Estoy trabajando en el código que pongo debajo y estoy encallado. Por favor, a ver si me podéis echar un cable, y así poder continuar...

Consiste en ir entrando datos de varios caballos mediante un formulario. Luego, recojo esos datos (caballo a caballo) y los voy guardando en un array (todos los datos de cada caballo), con lo que tengo un array de caballos con sus datos correspondientes.

El caso es que consigo entrar todos los datos de cada caballo en un Array, pero a la hora de listarlos no puedo acceder a un campo concreto de las características del caballo. Me explico:

Por ejemplo, si listo el caballo “ todos_caballos[0] “ me devuelve “ nombre, raza, disciplina ”, pero ¿cómo puedo acceder a cada campo de manera independiente para el caballo “ todos_caballos[0] “ ?

Y por otra parte, ¿cómo puedo relacionar la clase principal con las clases asociadas a “disciplina”?

Un saludo y gracias por adelantado!

Código:
<script type="text/javascript">

var todos_caballos = new Array();	

//clase caballo
function caballo(form) {
	
	var caballos = new Array();	
	
	//recojo todos los valores del formulario incluyendo los de las classes asociadas 
	// -----> no los pongo todos <-----
	nombre = form.nombre.value;
	raza = form.raza.value;

	// tipo de DISCIPLINA (salto, doma, raid)
	disciplina = document.f_caballos.disciplina_OK[document.f_caballos.disciplina_OK.selectedIndex].value;
	
	// DISCIPLINA - salto 
	patas = document.f_caballos.salto[document.f_caballos.salto.selectedIndex].value;
	altura_max = form.altura_max.value;
	
	//FIN recogida datos formulario 
	
	//propiedades
	this.nombre = nombre;
	this.raza = raza;
	this.disciplina = disciplina;
	
	//voy metiendo los datos del caballo actual en un array
	un_caballo = new Array(this.nombre, this.raza, this.disciplina);
	
	//guardo el caballo y todos sus datos en un array de caballos	
	todos_caballos.push(un_caballo);
	
}

//---------------- CLASES ASSOCIADAS ---------------//

function disciplina_salto(disciplina) {	
 this.patas = patas;
 this.altura_max = altura_max;
}

function disciplina_doma(disciplina) {
 this.forma_cuello = forma_cuello;
 this.tipo_movimiento = tipo_movimiento;
}

function disciplina_raid(disciplina) {
 this.resistencia = resistencia;
 this.velocidad = velocidad;
 this.capacidad_carga = capacidad_carga;
}

//---------------- CLASES ASSOCIADAS ---------------//

</script>
  #2 (permalink)  
Antiguo 25/04/2012, 04:42
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Problema con POO y base de datos

Hola:

Parece que no distingues entre un Array cuyo tratamiento es indexado numéricamente, y un objeto (Object()), que se indexa por atributos... en vez de new Array(), sería new Object(); o directamente escribir con sintaxis json...

un_caballo = new Object();
un_caballo["nombre"] = nombre;
un_caballo.raza = raza;//...

ó

un_caballo = {"nombre": nombre, "raza": raza, "disciplina": disciplina};

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 25/04/2012, 08:19
Avatar de Dafonz  
Fecha de Ingreso: octubre-2009
Mensajes: 127
Antigüedad: 14 años, 6 meses
Puntos: 36
Respuesta: Problema con POO y base de datos

No le veo mucho sentido al código, para que haces clase si metes todo en arrays.. como mencionan se me hace que te estas liando.. te recomiendo leer http://www.cristalab.com/tutoriales/programacion-orientada-a-objetos-oop-con-javascript-c232l/ y los métodos no tienen sentido para nada..
  #4 (permalink)  
Antiguo 25/04/2012, 12:31
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Exclamación Respuesta: Problema con POO y base de datos

Sí, la verdad es que hace muy poco que estoy metido en POO en Javascript, pero voy aprendiendo poco a poco.

Dafonz... me ha sido de mucha utilidad el enlace que me has indicado. Mil gracias, ahora lo entiendo algo mejor.

Aquí está el nuevo código (creo que lo tengo mejorado), pero no entiendo porque no funciona la "vinculación" entre la clase principal y las asociadas ( tipo de disciplina ). ¿Me podéis dar alguna pista?

Un saludo y Muchas Gracias por adelantado!


Código:
var lista_caballos = new Array();	

// Clase CABALLO
var Caballo = function (nombre, raza, capa, disciplina) {
	
    this.nombre = nombre;
    this.raza = raza;
    this.capa = capa;
    this.disciplina = disciplina;

				if (this.disciplina == "Salto") {					
						Salto.prototype = new Caballi();
						var Caballi = new Salto();
						alert(Caballi.nombre + ": " + Caballi.patas);
				}
	
				if (this.disciplina == "Doma") {
						Doma.prototype = new Caballi();
						var Caballi = new Doma();
						alert(Caballi.nombre + ": " + Caballi.forma_cuello);
				}
	
				if (this.disciplina == "Raid") {
						Raid.prototype = new Caballi();
						var Caballi = new Raid();
						alert(Caballi.nombre + ": " + Caballi.resistencia);
				}
	

	alert("CABALLO " +  this.nombre +" CREADO");
		
}


// Recoger/Validar datos formulario
function pre_Caballo(form) {
	nom = form.nom.value;
	rasa = form.rasa.value;
	capa = form.capa.value;
	
	// DISCIPLINA (salto,doma, raid)
	disciplina = document.f_caballos.disciplina_OK[document.f_caballos.disciplina_OK.selectedIndex].value;

	//crear instancia para el caballo X
	var nombre = new Caballo(nombre, raza, capa, disciplina);
	
	//guardo en array caballos
	lista_caballos.push(nom);

}

//---------------- CLASES ASOCIADAS A DISCIPLINA ---------------//


var Salto = function () {
	this.patas = "SALTO - patas";
	this.altura_max = "altura_max";
}

var Doma = function () {
	this.forma_cuello = "DOMA - forma_cuello";
	this.tipo_movimiento = "tipo_movimiento";
}

var Raid = function () {
	this.resistencia = "RAID - resistencia";
	this.velocidad = "velocidad";
	this.carga = "carga";
}
		

//---------------- CLASES ASOCIADAS A DISCIPLINA ---------------//
  #5 (permalink)  
Antiguo 25/04/2012, 12:59
Avatar de Dafonz  
Fecha de Ingreso: octubre-2009
Mensajes: 127
Antigüedad: 14 años, 6 meses
Puntos: 36
Respuesta: Problema con POO y base de datos

Creo que estas entendiendo un poco mal la cosa en relación a eso, veo que lo que quieres es usar herencia entre las clases o al menos eso intentas... pero no le veo mucho sentido para tu ejemplo.

Si lo que quieres es aprender entonces cuando utilizas prototype la desventaja de usar "herencia" de este tipo es que no se pueden pasar parámetros a la constructora de la clase padre. Tendrías que hacer un método para llenarlos y ya. Te pongo un ejemplo a ver si se entiende mejor:

Aquí por ejemplo esta la primera clase que sera Caballo y solo tiene 1 método que hace un alert sencillo.
Código Javascript:
Ver original
  1. var Caballo = function () {
  2.         this.metodo = function() {
  3.             alert("Si");
  4.         }
  5.     }

Ahora tenemos esta otra clase que es salto que en si sera un caballo (es decir tendrá todo lo que tiene caballo)
Código Javascript:
Ver original
  1. var Salto = function () {
  2.         this.patas = "SALTO - patas";
  3.         this.altura_max = "altura_max";
  4.     }
  5.     Salto.prototype = new Caballo();

entonces ya solo queda hacer la instancia
Código Javascript:
Ver original
  1. var prueba = new Salto();
  2.     prueba.metodo();

como vez si tiene la herencia llamando al método de caballo aunque lo que estas instanciando es el salto. Entonces en tu ejemplo aplicaría si hicieras por ejemplo un método de sets y gets o parecidos para llenar los atributos, y no dejarlo en la construcción, igual no entiendo porque hacer clases y en el constructor es donde haces todo en vez de hacer métodos osea que sentido tiene de hacer simplemente una función normal y hacer objetos y todo ahí.
  #6 (permalink)  
Antiguo 26/04/2012, 04:07
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Exclamación Respuesta: Problema con POO y base de datos

Esta parte se me sigo resistiendo... creo también que antes quizás no me expliqué del todo bien.

Lo que quiero hacer, sí, es usar la herencia para que la clase caballo herede los atributos/propiedades de su disciplina correspondiente (hay 3 diferentes con atributos diferentes).

Entonces, por ejemplo ( disciplina - SALTO con 2 atributos: patas y altura máx. )

Código:
function pre_Caballo(form) {

// DISCIPLINA - salto // recojo los valores asociados //
patas = document.f_caballos.salto[document.f_caballos.salto.selectedIndex].value;
altura_max = form.altura_max.value;

//Paso los 2 parámetros a la clase SALTO para que los actualice con los nuevos valores
var d_Salto = new Salto(patas, altura_max);

}
Y la clase SALTO la tengo así (y con prototype pretendo que la clase CABALLO herede esos valores. Pero sólo los de la disciplina elegida, no las 3)

Código:
var Salto = function (patas, altura_max) {
	this.patas = patas;
	this.altura_max = altura_max;
}
Caballo.prototype = new Salto();

¿Qué estoy haciendo mal?


Un saludo y mil gracias!
  #7 (permalink)  
Antiguo 26/04/2012, 08:55
Avatar de Dafonz  
Fecha de Ingreso: octubre-2009
Mensajes: 127
Antigüedad: 14 años, 6 meses
Puntos: 36
Respuesta: Problema con POO y base de datos

Aun y no viéndole mucho sentido, creo que lo que tu quieres es algo así:

Código Javascript:
Ver original
  1. var salto = function(){
  2.         this.patas = "4";
  3.     }
  4.  
  5. var caballo = function(nombre,opcion){
  6.         this.nombre = nombre;
  7.         this.opcion = opcion;
  8.         switch(this.opcion){
  9.             case "salto":
  10.                 this.__proto__ = new salto();
  11.             break;
  12.         }
  13.     }
  14.  
  15. var nuevo = new caballo("juan","salto");
  16. alert(nuevo.nombre+" - "+nuevo.patas);
  #8 (permalink)  
Antiguo 28/04/2012, 11:22
 
Fecha de Ingreso: octubre-2011
Mensajes: 36
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: Problema con POO y base de datos

Muchas Gracias, Dafonz

Etiquetas: formulario, poo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:06.