Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Alex Rodríguez

Páginas: 1 ... 69 70 71 72 73 [74] 75 76 77 78 79 ... 93
1461
Hola, igualmente saludos y bienvenido. Lo primero que te recomendaría es que revisaras los conceptos tal y como se explican en el curso Java desde cero que tenemos en esta url: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

En relación a las cuestiones que comentas y tratando de ser breve:

En un esquema de herencia tienes acceso a los métodos de las superclases por ser públicos. A través de los métodos get puedes acceder a los atributos.

En principio no tendrás acceso a los atributos por ser private. Pero si lo deseas, puedes declararlos como protected. Este modificador de acceso permite que las subclases conozcan los atributos de las superclases.

Cuando te refieres a que al aplicar la polimorfia no puedes acceder... : puedes acceder a todo lo que sea común (definido en las superclases). Si quieres acceder a métodos propios de una subclase, necesitarás identificar el tipo exacto con el que estás trabajando usando instance of o de otras maneras.

Para saber cuándo aplicar clases abstractas mira el curso.

Sobre la diferencia entre clases abstractas e interfaces: todo se mueve en niveles de abstracción. El máximo nivel de abstracción viene dado por las interfaces. Una clase abstracta podemos verlo como un nivel intermedio de abstracción. Y una clase concreta es el nivel más bajo de abstracción. El manejo de estos conceptos es un poco confuso sobre todo cuando no se tiene experiencia trabajando con ellos. A medida que vayas realizando el diseño de programas usándolos posiblemente tú mismo irás viendo qué es lo más conveniente.

Se hace quizás un poco complicado hablar sobre conceptos, quizás poniéndote ejemplos o viendo el código creado por otras personas, al ser algo aplicado y práctico, también puede ayudar. Si pegas el código que has creado (para ello pulsa el botón # del foro y al aparecer las etiquetas [ code ] ... [ / code] e indicas dónde tienes los problemas podemos tratar de revisarlo de forma más práctica.

Saludos.

1462
Hola Sniper, te indico las cosas a mejorar (que hay bastantes) en este código:

Clase CantanteFamoso

public void setNombre() { nombre = entrada(); }


La idea está bien y demuestra que tienes cierta soltura en el manejo de código. Sin embargo, aunque como idea pueda entenderse, desde el punto de vista de la programación no es algo adecuado. Oirás a muchos programadores hablar del principio KIS ó Keep it Simple. Otros lo alargar como principio KISS ó Keep it Simple Stupid (esto es más grosero). El asunto es que el código debe mantenerse simple.

El código que has planteado es un método que en realidad no hace otra cosa que llamar a otro método. Hay varias cosas que no son adecuadas en el planteamiento hecho: por un lado, ¿para qué tener un método que únicamente llama a otro? ¿No sería más lógico tener el código directamente sin tener que estar llamándolo?

Por otro lado contraviene otro principio básico de la programación: no inventar de nuevo la rueda. Este principio lo que dice es que hay muchas cosas que los programadores usan y alcanzan el nivel de "convención" entre los programadores, es decir, que todos los programadores trabajan igual porque es algo digamos que todo el mundo acepta.

Un método set, de acuerdo con el convenio tácito entre todos los programadores, es un método que recibe un parámetro para establecer el valor de un atributo. En el método que has planteado no se recibe un parámetro, por tanto va contra el convenio de la comunidad de programadores. No significa que esté mal, pero sí que estás yendo en contra de unos principios básicos de la programación que darían lugar a que cualquier programador que mirara tu código no lo valorara positivamente, es decir, transmitirías que no te atienes al convenio y eso genera rechazo. Tu jefe, o tu profesor, o quien fuera, te dirían... que no, que está bien tratar de innovar cuando se pueda, pero que eso lo corrijas.

En este otro método:

    public void setDiscoConMasVentas()
    {
     discoConMasVentas = entrada();
    }

Tenemos una repetición (también llama al mismo método). En algunas ocasiones, por ser necesario, se repite código. Pero en general también un buen programador mirará con mala cara la repetición de código.

Luego tenemos este método:

    public String entrada()
    {
      Scanner escaner = new Scanner(System.in);
      return escaner.nextLine();
    }

Tampoco encaja bien en la filosofía de la orientación a objetos. En POO cada objeto tiene sus responsabilidades delimitadas. ¿Es lógico que un objeto CantanteFamoso tenga un método que sirva para pedir, de forma genérica, una entrada de teclado? Más bien no, un objeto CantanteFamoso debe limitarse a almacenar la información de un cantante famoso y a tener métodos para gestionar y hacer cosas con dicha información. Pero entre sus responsabilidades no estará, normalmente, el pedir datos al usuario. Esta responsabilidad se debería delegar en otra clase, que podría denominarse EntradaTeclado ó GestorEntradasUsuario ó ... que sería un objeto cuyas responsabilidades, de forma lógica, incluirían el que pida una entrada de teclado.

En programación orientada a objetos tenemos objetos, cada uno con sus tareas... el programa se construye creando objetos y haciendo que interaccionen entre ellos.



Clase ListaCantantesFamosos

Tenemos el constructor:

    public ListaCantantesFamosos(String nombre, String discoConMasVentas)
    {
      listaDeCantantesF = new ArrayList<CantanteFamoso>();
      addObjetoCantante(nombre, discoConMasVentas);
    }

Si esto lo mira un programador no entenderá lo que tratas de hacer, o pensará que estás tratando de inventar la rueda. Un constructor sirve para inicializar los atributos. En este caso la tarea la cumple la primera línea. Si tuviéramos un constructor que recibe parámetros, el parámetro a recibir debería ser un ArrayList, precisamente porque ese es el atributo de la clase. No se atiene a la convención que en esta clase se reciban los datos de un elemento de un ArrayList y se añadan al mismo. Esto no es el objetivo de un constructor. Aquí estás mezclando ideas de un método con ideas de un constructor. La solución es hacer las cosas lo más simples posibles.

      public ListaCantantesFamosos()
    {
      listaDeCantantesF = new ArrayList<CantanteFamoso>();
    }

Con esto resuelto: más sencillo, tenemos que escribir menos, más elegante, y nos atenemos a la convención de la comunidad de programadores.

Aquí hay otra cosa que en cierta manera llama la atención:

      int i = 0; 
      for(CantanteFamoso datos : listaDeCantantesF)
      {
        System.out.println(i + ": " + datos.getNombre() + " - " + datos.getDiscoConMasVentas()); i++;
      }

Un for extendido es un bucle que no usa de índice para su recorrido. Sin embargo estás introduciendo el índice i. De esta manera se mezcla un bucle que no usa índice con un índice: extraño, no es que esté mal, pero llama la atención.

Si queremos usar un índice, lo lógico es usar un bucle con índice, algo así como:

for (int i=0; i<listaDeCantantesF.size(); i++) {
System.out.println(i + ": " + listaDeCantantesF.obtenerObjetoEnPosicion(i).getNombre() + " - " + listaDeCantantesF.obtenerObjetoEnPosicion(i).getDiscoConMasVentas());
}


Aquí otra cosilla a comentar:

      CantanteFamoso objeto;
      objeto = listaDeCantantesF.get(posicion);
      objeto.setNombre();

Podemos escribir:

listaDeCantantesF.get(posicion).setNombre();

Es decir, condensar tres líneas en una.



La clase con el método main no la he revisado, simplemente decirte que debes acortarla y repensarla. El método:

  private static String entradaNombre()//Crea una entrada personalizada para el campo nombre de un objeto tipo Cantante
  {
    System.out.println("Nombre: ");
    return entrada();
  }

¿Es un método para manipular el campo nombre de un objeto Cantante? No debe estar ahí ¿Por qué? Porque la responsabilidad de los campos es de las clases, por tanto la clase con el método main no tiene por qué tener un método para hacer algo que es responsabilidad de un objeto Cantante.

Veo más métodos con el mismo problema ¿están en la clase donde está la responsabilidad?

Ha sido un poco extenso, espero que al menos ayude a sacar algo positivo. Saludos ;)

1463
Ooops! Pues la verdad es que no lo había entendido así, pero tampoco cambia demasiado, es decir, que se puede seguir usando el planteamiento de las cadencias o repeticiones.

Supongamos que quieres tener un ArrayList de Dates con los días de trabajo del año 2014.  Supongamos que el 1 de enero de 2014 tiene el equivalente numérico 204788 y lo hacemos equivalente a día 1.

1-trabajo, libre,3-trabajo,4-trabajo, libre, libre, libre, libre.
9-trabajo, libre,11-trabajo,12-trabajo, libre, libre, libre, libre.
17-trabajo, libre,19-trabajo,20-trabajo, libre, libre, libre, libre.
etc. etc.

Lo que encontramos aquí es que partiendo del día 1 todos los días que resultan de sumar 1+8=9, 1+8+8=17, 1+8+8+8=25, etc. son días de trabajo.

Partiendo del día 3 todos los días que resultan de sumar 3+8 = 11, 3+8+8 = 19, 3+8+8+8=27 etc. son días de trabajo.

Partiendo del día 4 todos los días que resultan de sumar 4+8=12, 4+8+8=20, etc. son días de trabajo.

Para crear el ArrayList podríamos partir del día 1 y añadir todas las fechas de la sucesión. Luego partir del día 3 y añadir todas las fechas de la sucesión. Luego partir del día 4 y añadir todas las fechas de la sucesión... de esa forma tendrías todas las fechas almacenadas. Hablamos de números como fechas, de este modo puedes usar el número o la fecha (convertir en un sentido u otro según prefieras, cuando quieras).

Aunque pensándolo por otro lado, no parece que tenga demasiado sentido almacenar las fechas, parecería más lógico hacer una gestión dinámica, es decir, los calendarios universales que te permiten ver el calendario de una semana de por ejemplo el año 2584 no almacenan la información, sino que la generan dinámicamente con el algoritmo adecuado cuando se les pide que muestren algo concreto. Si no fuera así, la cantidad de información sería descomunal y la eficiencia muy baja...

Saludos

1464
Tienes que tener en cuenta la versión de java con la que estés trabajando, Si usas Java 8 o superior, se recomienda el uso de las clases incluidas dentro del paquete java.time (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html), en versiones anteriores el trabajo con fechas puede resultar distinto. Según la versión que vayas a emplear tendrás que estudiar qué clases y métodos pueden resultarte útiles. Saludos.

1465
Hola, no parece demasiado complicado, aunque obviamente hay que pensarlo bien. Si te fijas en la idea que planteas y la cadencia es regular (es decir, de cada 8 días, el primero es trabajo, el segundo libre, el tercero trabajo, etc.) tendrías una repetición de un ciclo cada 8 unidades. Esto no es difícil de modelar usando el operador módulo (%).

En principio, podrías obtener un valor numérico que te indique el día de que se trata. Supongamos que el 1 de enero de 2014 tiene el equivalente numérico 204788.

Ahora se podría plantear que el método reciba la fecha, obtenga su equivalente numérico, y le reste 204787. De este modo, al 1 de enero de 2014 le correspondería el valor 1.

Seguidamente hacemos el módulo de 1 % 8 = 7

Para cada valor tendríamos:

si valor % 8 = 7 entonces el tipo de día es trabajo
si valor % 8 = 6 entonces el tipo de día es libre
si valor % 8 = 5 entonces el tipo de día es trabajo
si valor % 8 = 4 entonces el tipo de día es trabajo
si valor % 8 = 3 entonces el tipo de día es libre
si valor % 8 = 2 entonces el tipo de día es libre
si valor % 8 = 1 entonces el tipo de día es libre
si valor % 8 = 0 entonces el tipo de día es libre

Seguramente también se puede plantear de otras maneras, pero esta en principio es la que me ha parecido más simple. Saludos.

1466
Aprender a programar desde cero / Re:Problema en CU00623B
« en: 26 de Julio 2014, 00:53 »
Hola, para pegar código usa por favor el botón # del foro, una vez lo pulses pega el código entre las etiquetas [ code] ... [ / code] y pulsa previsualizar.

El error que comentas parece deberse a que estás introduciendo Strings sin comillas. Para usar un método set y pasarle información tienes que escribir entre comillas.

Por ejemplo "cadena" es correcto pero cadena no porque le faltan las comillas.

Saludos,

1467
Hola, lo planteado por Sniper es correcto. Entre las dos opciones planteadas la que me parece más correcta es comentar o borrar en el constructor de la clase EntradaDeTeclado la invocación del método pedirEntrada();

   public EntradaDeTeclado(){
      entradaTeclado = "";
      //pedirEntrada();
   }

De este modo se corrige el error de existir una duplicidad en la petición.

Saludos.

1468
Hola, el programa está bien. Lo que no estás haciendo bien es pegar el código en el foro, una vez pulsas el botón # tienes que poner el código entre las etiquetas [ code ] ... [ / code]

Por ejemplo [ code ]  Aqui el codigo [ / code ]

Antes de publicar pulsa previsualizar y comprueba que se vea bien.

Saludos.

1469
Sobre el ejercicio CU00666B:

El nombre del método coleccionDeObjetos() no es del todo adecuado pues no dice qué es lo que hace el método. Sería más adecuado un nombre como obtenerColeccionDeObjetos(), esto deja más claro qué es lo que hace el método.

Sobre el código: en general está bien trabajado y bien diseñado, además has introducido algunas mejoras y lo has hecho bien, eso además te permite ir cogiendo soltura en la programación.

Hay un detalle que no es adecuado: primero tienes un código para pedir el primer nombre de cantante, y después si se quiere volver a pedir otro cantante vuelves a tener un código muy similar. En general, un código no debe repetirse. Una buena forma de "afinar" y comprender mejor sería que revisaras el código y trataras de eliminar toda repetición. Para ello, aquellos procesos que se repiten los podrías poner en métodos y cuando los necesites, llamar al método. De esta manera, evitas las repeticiones, algo muy importante en programación. Saludos.

1470
Hola, antes de nada comentarte que es preferible que publiques dos temas en el foro, uno para cada ejercicio, en lugar de incluir código comentado ya que hace más difícil el compilarlo y revisarlo.

Sobre el ejercicio CU00665B: está todo correcto, bien trabajado.

Sobre la duda:

lista1.verTodosLosNombresEnLaLista();//que desventajas tendria esta sintaxis: ? System.out.println(lista1.verListadoCompleto());

Ambas sintaxis serían aceptables. Me parece mejor la primera porque un método se encarga de realizar el trabajo y no dependes de una instrucción como System.out.println. Al no depender, es el propio objeto quien se encarga de resolver sus necesidades sin tener que ser ayudado por otras instrucciones auxiliares.

1471
Hola Enrique, como solemos hacer comentarte que para pegar código debes usar el botón # del foro, una vez lo pulsas y aparecen las etiquetas [ code ] ... [ / code] debes pegar el código entre ambas etiquetas y pulsar "Previsualizar".

Si el código es demasiado largo, puede ser preferible adjuntar el archivo con el código en vez de pegarlo directamente. En ese caso, pulsa en "Opciones adicionales" y elige el archivo a adjuntar.

Sobre el código que has puesto, el primer error salta aquí:

procedure reporte(num : longint); (procedimiento para reporte)

No puedes tener ese comentario ahí entre paréntesis. ¿Tu compilador no te informa de dónde se localiza este error? ¿Qué compilador estás usando?

Saludos.

1472
Hola, en el segundo menú parece que el efecto de retrasar la desaparición del menú se logra con este código:

        // A private function for delaying the mouseOut function
        var delay = function(ev,ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            ob.hoverIntent_s = 0;
            return cfg.out.apply(ob,[ev]);
        };

Que tal como indica "introduce un retardo en el evento mouseOut. La idea sería tratar de aplicar esta función al otro menú, pero si te fijas en el código del primer menú, está cargando jQuery desde internet con:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>

Tendrías que tener jQuery en tu servidor para modificar el código y crear el efecto deseado (habría que ver con calma cómo conseguirlo).

Sobre:

** Duda opcional **

En el primer menú se aplica el ID y CLASS a una capa <DIV>, y dentro de ella esta la etiqueta <Ul> que no tiene ningún ID y CLASS, si quiero poner ese ID y CLASS a la etiqueta "<UL>" deja de funcionar el menú.

Respuesta: es posible, depende de cómo esté programado el código. Si el código está programado para buscar un elemento UL dentro del elemento raíz (el dív) y tu cambias haciendo que el elemento raíz sea un UL, intentará buscar un UL dentro del raíz y no lo encontrará, por lo que no funcionará. Pero esto depende de cómo esté programado el código, puede que funcione de forma distinta a esta que te he comentado. Para comprobarlo tendrías que probarlo.

El segundo menú tiene un ID y CLASS en la etiqueta <UL> directamente sin DIVS, si pongo ese código en una etiqueta superior,"<DIV>" el menú no funciona más.

Respuesta: pasa exactamente lo mismo: depende de cómo esté programado el código.

Lo que dices de modificar el menú superfish, habría que estudiarlo con calma.

Saludos.

1473
Aprender a programar desde cero / Re:Ejercicio CU00676B
« en: 21 de Julio 2014, 23:58 »
Hola de nuevo, pocas objeciones habría que ponerle al código. Felicitarte porque se ve que estás trabajando y estás agarrando bien los conceptos. Además de seguir contenidos es muy importante practicar y crear nuestros propios programas de prueba... así que "fetén".

Por comentar algo, en vez de usar desde y hasta yo hubiera usado limiteInferior o numeroDeComienzo y limiteSuperior o numeroDeTerminacion... algo más descriptivo. También teniendo en cuenta que desde y hasta son palabras clave en pseudocódigo y verlo como nombres de variables en código se hace un poco extraño. Pero no es una objeción "seria" al código, es un simple comentario.

Nota para quienes intenten compilar con BlueJ: al estar declarados packages, salta un error (para compilar sin problemas eliminar estas declaraciones, o bien crear los packages).

Igual hay alguna manera de que BlueJ cree los packages automáticamente pero ahora mismo no lo recuerdo  ???

Si alguien sabe cómo crearlos automáticamente que avise  :D

1474
Aprender a programar desde cero / Re:Ejercicio CU00674B
« en: 21 de Julio 2014, 23:38 »
Hola Toni, todo correcto. A modo de curiosidad, para las personas que intenten compilar el código, cuando intentamos hacerlo con BlueJ se obtiene el siguiente mensaje (error package-name-invalid):
 
You have changed the package statement to a package which does not exist in this project. If you wish to move this class to another package you must create the destination package first. The package statement has been reverted back to its original form.

Que lo que viene a decir es que antes de incluir código declarando packages, hemos de crearlos previamente en BlueJ. Si no los creamos, BlueJ anula la declaración de packages o emite errores. A veces (sobre todo si se trata de una única clase) es irrelevante que BlueJ anule el package. En cambio, si se trata de distintos packages con clases interrelacionadas sí puede resultar relevante.

Para solucionar esto con BlueJ, hay que crear previamente la estructura de packages.

Saludos.

1475
Hola, la respuesta es correcta con las siguientes cosas a mejorar:

- Los nombres de métodos es preferible que comiencen con una letra minúscula. Por ejemplo public float duracionCancion en vez de public float DuracionCancion. No es obligatorio pero así es como lo hace la mayor parte de los programadores.

- Los nombres de parámetros (así como de atributos de clases) igual, mejor int numeroCancion que int NumeroCancion

Comenzar con mayúscula se reserva para nombres de clases, así resulta fácil distinguir qué es una clase de otra cosa.

Aquí hay una cosa mal planteada:

4)PROCEDIMIENTO - public void AñadirCancionDisco (int NumeroCancion, String TituloCancion, float DuracionCancion)

El objeto (instancia de la clase) sabrá cuántas canciones tiene, porque es información "interna" al objeto. Si el objeto lo sabe y la canción se va a poner en último lugar (como dice el enunciado), no debemos pasarle como parámetro int NumeroCancion porque el objeto ya sabe el número de canción que será. Es decir, sólo hemos de pasar como parámetros aquellas cosas que el objeto no es capaz de determinar.

Saludos.

1476
Sí, por eso, es que los sockets se usan para la comunicación cliente - servidor...

1477
¿Pero esa parte (comunicación cliente - servidor) no decías que ya la tenías resuelta?

1478
Hola, son atributos de clase tanto los tipos primitivos como los objetos. Y normalmente se establecen métodos get y set tanto para los tipos primitivos como para los objetos. En el caso de trabajar con objetos, los set reciben un objeto e igualan el atributo al objeto recibido. En el caso de los get, devuelven un objeto (el atributo).

Hay distitas variantes pero la idea general es esta, y esto sería lo que le falta a tu código.

Saludos.

1479
Hola, sobre lo que comentas:

Al terminar el curso tendrás las bases de la programación Java. Para crear programas tipo punto de venta, juegos o aplicaciones para móvil tendrás las bases pero todavía tendrás que trabajar, estudiar y programar mucho antes de ser un programador profesional. Ser programador de buen nivel es algo que requiere normalmente varios años.

Para realizar donaciones efectivamente la vía es a través de una tarjeta bancaria de crédito o débito, no tenemos otra alternativa.

Saludos.

1480
Aprender a programar desde cero / Re:Ejercicio CU00630B
« en: 21 de Julio 2014, 17:36 »
Hola, el código no está bien planteado. Te recomiendo que vuelvas a leer las entregas del curso anteriores.

En una clase se almacena información en sus campos o atributos, y por otro lado se realizan operaciones con sus métodos. Tú estás mezclando indebidamente ambos conceptos, por ejemplo float HolaIntroduceDuracionDeCancion; estás diciendo que la clase almacena un número decimal que se llama HolaIntroduceDuracionDeCancion, pero esto no es información, esto será una operación que realice la clase, por lo tanto no debe ir declarada como atributo sino como método.

Por otro lado el ejercicio no te pide que generes el código de los métodos, sino tan solo la signatura e indicar si son procedimientos o funciones.

Revisa el concepto de signatura y revisa los conceptos previos.

Saludos.


Páginas: 1 ... 69 70 71 72 73 [74] 75 76 77 78 79 ... 93

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".