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 - RaGa

Páginas: 1 2 3 [4] 5 6 7 8 9 ... 12
61
Hola!

La convención de cómo nombrar una clase, un campo, un atributo, etc. es más bien simple. Es algo que todo programador pauta respetar para beneficiarnos posteriormente en entendimiento y legibilidad.

La regla nos dice que las clases comienzan con una letra mayúscula. Los atributos, parámetros y nombres de métodos con una letra minúscula.
Ahora bien, si dichos nombres (sea clase, atributo, campo, etc) tuviera una segunda palabra en su composición, o una tercera palabra, etc. ellas comenzarían con mayúscula sin espacios intermedios.

Ejemplifiquemos:

Una clase puede llamarse entonces: 'Persona', 'AlimentoCongelado', 'GestionadorEntradasTeclado', etc.

Un campo de instancia, un atributo, o un parámetro puede llamarse entonces: 'nombre', 'valorApellido", 'valorResultadoFinal', etc.

Un método puede llamarse entonces: 'getApellido', 'calculaDimensionMatriz', 'mostrarPorConsola', etc.

Ahora bien, además de esta convenvención desde el punto de vista semántico, a la hora de bautizar una clase, un método, o un atributo, hay que tener en cuenta qué nombre elegimos.
El hecho de nombrar no es un simple "hecho estético" sino que lleva implícita información útil: de qué se trata tal o cual parámetro por ejemplo, o para qué sirve tal o cuál método.
También la forma en que nombremos las cosas evidencia si tenemos claro el panorama y sabemos qué estamos haciendo. No solo para las correcciones que vayamos a recibir, sino para el desarrollo en sí del código que estamos realizando.
Tengamos en cuenta por otro lado, que para futuros mantenimientos y/o ampliaciones de nuestro trabajo, será muy útil que la lectura del código sea entendible, por eso la buena organización del mismo es una costumbre saludable. También que los nombres que elegimos de alguna manera nos den información de qué es, o para qué sirve aquello a lo cual nos estamos refiriendo.
Recordemos que no siempre seremos nosotros los que debamos entender lo que codificamos, seguramente seremos parte de un grupo de programadores.
Por lo tanto, ya que estamos iniciándonos en la programación, empezar a incorporar estas buenas costumbres desde ahora.

62
Hola!

Estuve analizando tu ejercicio y lo bien, cumple con la consigna. Sin embargo me gustaría hacer unas recomendaciones para mejorar el código.

Respecto de la clase ListaCantantesFamosos la veo muy bien. Pero he de sugerirte seguir las convención de cómo nombrar en este caso los atributos. Por ejemplo:
siguiendo con la convención que ya se ha tratado en otro hilo, el nombre del atributo tipo ArrayList no deberia llamarse 'listadecantantes' sino 'listaDeCantantes'. Y el parámetro 'valor_nombre' debería llamarse 'valorNombre'.
Si bien la forma de nombrar que has elegido no dará ningún error de compilación y el código funcionará correctamente, es bueno acostumbrarse a seguir estas convenciones de programación.

Respecto de la clase testListaCantantesFamosos.
En la línea:

Código: [Seleccionar]
ListaCantantesFamosos listadecantantes = new ListaCantantesFamosos("Nombres introducidos");
se llama al constructor de la clase ListaCantantesFamosos pasando como parámetro la cadena "Nombres introducidos". Esa cadena String es lo que será el nombre de la lista. Podría tener más sentido quizás bautizar la lista como : "Cantantes que me gustan" o "Cantantes de habla inglesa". Si bien cada uno puede elegir el nombre que más desee para su lista, solo quería asegurarme que estabas conciente de que esa cadena "Nombres introducidos" sería el nombre de la lista.

Al bucle:
Código: [Seleccionar]
while(i <5){
        System.out.println ("El cantante "+ (i+1) + " es " + listadecantantes.getNombre(i));
        i++;
           }

no lo veo bien. Si vas a utilizar un contador, sería más lógico usar un bucle for antes que un while, de la siguiente manera:

Código: [Seleccionar]
for (int = 0; i<5;i++){
System.out.println ("El cantante "+ (i+1) + " es " + listadecantantes.getNombre(i));

}

63
Hola Francisco.

Estuve revisando tu ejercicio y lo veo excelente. A seguir adelante!

64
Hola!

Correctas tus dos primeras respuestas.
Respecto a la tercera respuesta verás, el método pop se puede considerar tipo mixto debido a que este método puede realizar tanto modificaciones como consultas en la pila.

Saludos.

65
Hola Adrián !

Es muy interesante la pregunta.
Hay una equivocación de concepto en lo que dices, pero igual está muy bien y celebro esta clase de análisis que estás haciendo.
He de decirte que no se crea dos veces el mismo objeto. Analicemos un poco...

El campo de instancia miScanner (tipo Sacanner) se declara una sola vez, en la línea 1.

En la línea 3 lo que hacemos es inicializarlo.
Y detengámonos un poco a pensar en que consiste esa inicialización: consiste en asignarle la referencia de un objeto nuevo que estamos creando.
La línea:

Código: [Seleccionar]
new Scanner(System.in);
crea un nuevo objeto tipo Scanner, correcto?... Y esa referencia es asignada al atributo miScanner.

En la línea 6 hacemos exactamente lo mismo: creamos un nuevo objeto escribiendo

Código: [Seleccionar]
new Scanner(System.in);
y a la referencia de ese objeto (objeto anónimo, es decir sin nombre) se la asignamos al atributo miScanner.

Conclusión: La línea 1 declara el atributo (el campo de instancia). Y las líneas 3 y 6 son sentencias de asignación. Claro que lo que asignamos son REFERENCIAS de objetos que creamos en la misma línea.

Te agrego unos pasos intermedios (eviatando la utilización de objetos anónimos) para que sea más gráfico el procedimiento, fíjate:

Código: [Seleccionar]
1)  Scanner miScanner;
      2)  System.out.println("\nIngresa un mes");
      2.4) Scanner objetoTeclado 1;
      2.5) objetoTeclado1 = new Scanner(System.in);
      3)  miScanner = objetoTeclado1;
      4)  while (!miScanner.nextLine().equalsIgnoreCase(mesesAnio[mesSecreto])) {
      5)     System.out.println("Incorrecto, intenta de nuevo ingresando otro mes");
      5.4) Scanner objetoTeclado2;
      5.5) objetoTeclado2 = new Scanner (System.in);
      6)    miScanner = objetoTeclado2;
      7)  }

Analízalo con detenimiento y cualquier duda estamos aquí para reveerlo. Saludos!

66
Hola Adrián:

Está muy bien tu ejercicio, felicitaciones! Muy bien usada la clase Random.

Ten en cuenta como creo lo hemos conversado en otro hilo, en programación tratamos de evitar el uso de la letra 'ñ' para nombrar atributos, clases o métodos. Así, palabras como 'año' las escribimos como 'anno' o 'anio'.

Saludos, a seguir adelante!

67
Hola Ronal:

Está muy bien tu ejercicio. A seguir adelante entonces!

68
Hola Adrián:

Veo muy bien tu código, cumple con la consigna del ejercicio.
Quisiera hacerte solamente dos observaciones:

1) En la clase Test, haría una modificación para no dejar el 'else if" vacío.

Código: [Seleccionar]
public class Test {

    static ListaCantantesFamosos lista;

    public static void main (String[] args) {

        lista = new ListaCantantesFamosos();
        lista.addCantante(new CantanteFamoso ("Madonna","All I want is you"));
        lista.addCantante(new CantanteFamoso ("Jorge Negrete","Jalisco"));
        System.out.println("\fMostrando lista actual\n");
        lista.getLista();
        opcionCantante();
    }

    public static void opcionCantante () { //metodo que nos pregunta por mas cantantes

        EntradaDeTeclado respuestaUsuario, nuevaEntrada;
        CantanteFamoso cantante;

        do {
            System.out.println("\nDesea ingresar otro cantante? Y/N");
            respuestaUsuario = new EntradaDeTeclado();
            //if que contempla respuesta "Y", respuesta "N" o cualquier otra respuesta
            if(respuestaUsuario.getEntrada().equalsIgnoreCase("y")) {
                cantante = new CantanteFamoso();
                System.out.println("\nIngresa un nuevo cantante");
                nuevaEntrada = new EntradaDeTeclado();
                cantante.setCantante(nuevaEntrada.getEntrada());
                System.out.println("Ingresa el disco mas vendido de "+nuevaEntrada.getEntrada());
                nuevaEntrada = new EntradaDeTeclado();
                cantante.setDisco(nuevaEntrada.getEntrada());
                lista.addCantante(cantante);
                System.out.println("\nMostrando lista actualizada\n");
                lista.getLista();
            } else if (!respuestaUsuario.getEntrada().equalsIgnoreCase("n")) {
                System.out.println("Por favor ingresa Y o N");
              }
        } while (!respuestaUsuario.getEntrada().equalsIgnoreCase("n"));
        System.out.println("\nMostrando lista final\n");
        lista.getLista();
        System.out.println("\nPrograma finalizado");
    }
}

2) En la clase ListaCantantesFamosos renombraría la clase getLista() por un nombre más acorde, como podría ser por ejemplo mostrarLista() ya que lo que el método hace es "mostrar la lista", y no "devolver la lista" que es lo que se interpretaría con getLista().

A seguir adelante!

69
Hola! Bienvenido al foro.

Cuéntanos un poco más sobre lo que buscas así podemos orientarte de una mejor manera. Hay varios cursos que empiezan desde cero.

Saludos!

70
Hola Adrián:

Hago mea culpa: se me pasó por alto que estaba declarado como campo de instancia, en un golpe de vista no lo ví y creí que nunca lo habías hecho. Perdón, creo que necesito cambiar los cristales de mis anteojos jejeje  ;D

Es absolutamente correcto tal como lo hiciste declarándolo como campo de instancia ya que es un atributo utilizado por más de un método. Luego si, inicializarlo en el Construcor.

Código: [Seleccionar]
public class EntradaDeTeclado {
    private String entradaTeclado;

    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        pedirEntrada(); //Llamada al método interno
    } //Cierre del constructor

A seguir adelante entonces!

71
Hola Francisco:

Veo muy bien tu ejercicio. De todos modos hay unas cosas para corregir:

1) Fíjate los métodos get, están mal nombrados.
2) Se debería quitar la doble barra // de la línea:

Código: [Seleccionar]
// if((diametro > 1.4 && grosor < 0.4) || (diametro <= 1.4 && diametro > 0.8 && grosor < 0.25)){System.out.println(" El grosor para esta rueda es inferior al recomendado");}
}

de lo contrario será simpre un comentario y nunca se ejecutará esta comprobación.

3) Deberías usar siempre println (y no print) para que los mensajes por consola queden mejor presentados.

A seguir adelante.

72
Hola Adrián:

1) Cuando pensamos en crear una clase hay que preguntarse "qué es" o "para qué servirá" esa clase. Acto seguido consideraremos qué atributos serán necesarios  (sus propiedades) y con qué métodos se regirá el comportamiento de los objetos que pertenezcan a esta clase.
 
Supongamos la clase Persona con atributos: nombre, apellido, género, edad, altura, peso, y profesión. Y sus métodos: establecer y retornar cada atributos, y mostrar por consola dichos atributos.
No sería correcto establecer un método dentro de la clase Persona que devuelva un índice con fines estadísticos donde se relacione el género, con la edad, el peso, y altura (por más que todos sean atributos del objeto tipo Persona).
No podemos delagar a la clase (Persona) lo que parece ser responsabilidades de otra clase.

Lo que se debería hacer en ese caso -estamos suponiendo- es crear una nueva clase llamada por ejemplo CalculadorEstadisticoDePoblacion que contenga un atributo ArrayList de objetos tipo Persona, y donde uno de sus métodos sea justamente ese método que devuelve un índice que relaciona el género, la edad, el peso, y la altura de cada objeto del ArrayList.

Entonces, volviendo a nuestro caso de interés que es la clase EntradaDeTeclado: si el objeto es tipo EntradaDeTeclado, el atributo entradaTeclado debe ser establecido únicamente por lo que tipeamos por teclado. No podemos establecer el atributo entradaTeclado ni con un parámetro recibido, ni tomando un valor leído en un archivo, ni por el valor leído en un puerto, etc etc. Debe existir una correlación entre el nombre de la clase y lo que ella representa, debe existir una coherencia entre qué es, y para qué sirve.
No debemos responsabilizar a esta clase, con responsabilidades que seguramente son atribuibles a otra clase.

Lo de la reutilización del código está perfecto! Esa es la idea: crear clases bien diseñadas que luego las podamos volver a utilizar en otros programas.
Una clase que gestione las entradas por teclado siempre será útil y te ahorrará tiempo de programación.
Por eso quiero que se entienda bien: la observación no está relacionada por el hecho de que no se utilicen todos los métodos de la clase, sino que apuntaba a lo conceptual de qué responsabilidades tiene una clase.
Si tu clase EntradaDeTeclado tuviera también métodos para leer y devolver no solo objetos tipo String, sino otros métodos para leer y devolver objetos tipo Long, tipo Float, tipo Integer, etc, estaría muy bien! por más que no se utilizaran siempre.

2) Codificaste el Constructor de la clase de la siguiente manera:

Código: [Seleccionar]
public EntradaDeTeclado ()  {
        entradaTeclado="";
        pedirEntrada(); //llamada al metodo interno
    }

a la línea :

Código: [Seleccionar]
entradaTeclado="";
sería mas correcto escribirla:

Código: [Seleccionar]
private String entradaTeclado="";
donde queda establecido el ámbito 'private', y establecido el tipo 'String' del atributo entradaTeclado.

73
Hola Adrián!

Ahora si pude probar el código completo.
El ejercicio está muy bien! cumple con la consigna del ejercicio.

También quisiera hacer una observaciones para tener en cuenta:

En la clase TecladoEntrada al método setEntrada tal como está no le encuentro ninguna utilidad, ni para este ejercicio, ni para una posible ampliación futura.
Está muy bien tener métodos set y get para los campos de instancia de las clases, pero en este caso el establecimiento del campo entradaTeclado está dado precisamente por el método que denominaste pedirEntrada().

Otra cosa en esta clase:
Ten en cuenta que puedes declarar e inicializar el campo entradaTeclado como lo hiciste en tu código, pero es más correcto declararlo además con su tipo y con su ámbito.

Código: [Seleccionar]
private String entradaTeclado = "";
A seguir adelante!

74
Hola Adrián:

Te olvidaste de subir la clase EntradaDeTeclado. Publícala así puedo ver el código completo.

75
Respuesta (a) Correcta!

Respuesta (b) Te transcribo lo que escribió el Moderador César Krall al respecto que considero está muy bien analizado.

Citar
Podemos decir que existe una identidad en null (situación especial). Conviene tener cuidado con esta respuesta.

null significa alguna de estas cosas: objeto declarado pero no inicializado, condición de terminación de una serie de objetos, el objeto no existe, el objeto no tiene un contenido definido, el contenido del objeto ha sido eliminado explícitamente estableciéndose a null.

En Java se cumple lo siguiente: null == null (en otros lenguajes no es así).

Por tanto si no se han inicializado piloto == copiloto1 resulta true y copiloto1 == copiloto2 también es true, y si consideramos que toda comparación con == que devuelve true implica una relación de identidad, sí habría relación de identidad. La identidad consistiría en "los tres objetos son el mismo objeto: null".

Hay que considerar null una situación especial de un objeto.

Respuesta (c) no es correcta.
Por lo mismo que comentábamos en la respuesta anterior. Si se crea el objeto pero no se inicializan sus atributos, los atributos contendrán null.

76
Hola Luis:

Veo perfecto tu ejercicio! A seguir adelante!
Saludos.

77
Hola:

Por mi parte haría una observación que sería la siguiente:

Líneas como la siguiente, son válidas ya que el complidor no señala errores

Código: [Seleccionar]
nombre="";
pero lo correcto sería declarar el objeto con su ámbito y con su tipo.
Para este caso lo apropiado sería:

Código: [Seleccionar]
private String nombre="";
No quiero dejar de destacar la buena organización de cada una de las clases, y sobre todo el código de la clase main. Veo que utilizas objetos anónimos correctamente (lo cual se verá más adelante en el curso).
Excelente uso de los métodos del objeto tipo Iterator.


Saludos.

78
Hola!


Estuve revisando tu ejercicio y está muy bien. Has usado herramientas que aún no se han visto en el curso como el tema del casting (lección nº89).

Voy hacerte algunas sugerencias para tener en cuenta. Pero insisto, tu ejercicio esta muy bien y cumple con la consigna del ejercicio.

Dentro del bucle do while, utilizas el condicional if con su respectivo else. Dentro del else vuelves a utilizar un condicional if:

Código: [Seleccionar]
do{
            entradaTeclado.setEntrada();
            numeroAux=numeroAux.valueOf(entradaTeclado.getEntrada());
            if((int)numeroAux>numeroAleatorio){
                System.out.print("No has acertado: el número es menor. Prueba otra vez : ");
            }else{
                if((int)numeroAux<numeroAleatorio){
                    System.out.print("No has acertado: el número es mayor. Prueba otra vez : ");
                }
            }
        }while((int)numeroAux!=numeroAleatorio);

Podríamos resolverle directamente con un condicional if y un else if, de la siguiente manera:

Código: [Seleccionar]
do{
            entradaTeclado.setEntrada();
            numeroAux=numeroAux.valueOf(entradaTeclado.getEntrada());
            if((int)numeroAux>numeroAleatorio){
                System.out.print("No has acertado: el número es menor. Prueba otra vez : ");
            }else if((int)numeroAux<numeroAleatorio){
                     System.out.print("No has acertado: el número es mayor. Prueba otra vez : ");
            }
        }while((int)numeroAux!=numeroAleatorio);

Respecto a la clase EntradaTeclado. Hemos conversado un poco sobre ella en una publicación anterior

https://www.aprenderaprogramar.com/foros/index.php?topic=2880.0

y mi sugerencia va nuevamente en esa misma dirección. ¿Y cuál es la nueva razón para sostener esto? Pues que en POO siempre pensamos en la modularidad y la reutilización del código como una de nuestras premisas.
Entonces, esta vez que necesitamos que la entrada por teclado sea un tipo int en vez de un tipo String, bien podríamos agregar un nuevo método a la clase GestionadorEntradasTeclado para que cumpla esa necesidad. Definiríamos un nuevo método en esa clase que se llame recogerInt.
De esta manera con un solo objeto gestionamos todo lo que recibimos por teclado :

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

public class GestionadorEntradasTeclado{

    /**Devuelve un objeto tipo String que corrsponde al valor ingresado por el usuario a través del teclado.
     * @return retorna un objeto tipo String.
     */
     public String recogerString(){
        Scanner scannerTeclado = new Scanner (System.in);
        String valorTeclado = scannerTeclado.nextLine();
        return valorTeclado;
    }
   
    /**Devuelve un valor tipo int que corresponde al valor ingresado por el usuario a través del teclado.
    * @return retorna un valor tipo int.
    */
    public int recogerInt(){
       Scanner scannerTeclado = new Scanner (System.in);
       int valorTeclado = scannerTeclado.nextInt();
       String valorTmp = scannerTeclado.nextLine(); // para vaciar el buffer.
       return valorTeclado;
    }
     
} // Fin de la clase

Igualmente he de decirte que has utilizado muy bien en tu código el método valueOf para convertir el tipo String en tipo Integer.

Saludos.

79
Hola!

Tu código está muy bien, no tengo nada para agregar.
Las respuestas a las preguntas excelentes también. Felicitaciones.
A seguir adelante!

80
Hola Luis:

Esta muy bien tu ejercicio. Tendrías que agregar los métodos set para cada uno de los campos de instancia.
Además en el Constructor faltó recibir el parámetro valorCasado, así al campo casado (tipo boolean) no se le tiene que asignar el valor por defecto false.

Páginas: 1 2 3 [4] 5 6 7 8 9 ... 12

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".