Autor Tema: Cuestiones de diseño Java y programación orientada a objetos práctica CU00662B  (Leído 2488 veces)

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola a todos !! paso a dejar el codigo del ejercicio CU00662B del curso básico de programación orientada a objetos con Java y BlueJ.

Muchas gracias desde ya por la revisión del mismo

Saludos

Luis


La clase main

Código: [Seleccionar]
// Nuestra clase de prueba aprenderaprogramar.com
public class ComparandoLetraxLetra {
    public static void main (String [ ] args) {
        System.out.println ("Empezamos el programa");     
        System.out.println ("Por favor introduzca la entrada 1:");
        EntradaDeTeclado entrada1 = new EntradaDeTeclado();
        System.out.println ("Por favor introduzca la entrada 2:");
        EntradaDeTeclado entrada2 = new EntradaDeTeclado();
        System.out.println ("Gracias");
        String palabra1 = entrada1.getEntrada();
        String palabra2 = entrada2.getEntrada();
        String valorLetra1="";
        String valorLetra2="";
        String respuesta="";
        String respuesta2="";
        int largo1 = entrada1.getLongitud();
        int largo2 = entrada2.getLongitud();
        ObtenerLetra cadaLetra = new ObtenerLetra();
        int i = 1;
        while (i<=largo1 || i<=largo2){ //Va devolviendo en cada iteración una letra más de la cadenaString letraCadena1 = letra(cadena1,i);//       String letra1 = cadaLetra(cadena1,i);
            respuesta = "¿Letra "+i+" igual en las dos palabras? ";
            cadaLetra.setValorI(i);
           
            if (i<=largo1){
               cadaLetra.setValorCadena(palabra1);     
               String letra1 = cadaLetra.getValorLetra();
               valorLetra1 = letra1;}
               else {respuesta2=" La palabra 1 no tiene letra "+i;}
                                     
            if (i<=largo2){
               cadaLetra.setValorCadena(palabra2);   
               String letra2 = cadaLetra.getValorLetra();
               valorLetra2 = letra2;}
               else {respuesta2=" La palabra 2 no tiene letra "+i;}
           
            if (i<=largo1 && i<=largo2) { 
                if (valorLetra1.equals(valorLetra2)){respuesta2=" true";}
                    else {respuesta2=" false";
                        if (valorLetra1.equals(" ")) {respuesta2=" La palabra 1 no tiene letra "+i;}
                        if (valorLetra2.equals(" ")) {respuesta2=" La palabra 2 no tiene letra "+i;}
                    }
              }
 
            System.out.println(respuesta+respuesta2);   
            if (i>=largo1 && i>=largo2){break;}
            i++;
            }
       } //Cierre del main
} //Cierre de la clase


Clases dependientes

Código: [Seleccionar]
import java.util.Scanner; //Importación del código de la clase Scanner desde la biblioteca Java
// Definimos una clase EntradaDeTeclado aprenderaprogramar.com
public class EntradaDeTeclado {
    private String entradaTeclado; //Variable de instancia (campo) de la clase

    public EntradaDeTeclado ()  { //Constructor
        entradaTeclado="";
        pedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto ejecutamos el método
    } //Cierre del constructor
    public void pedirEntrada ()  {  //Método de la clase         
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine ();     } //Cierre del método pedirEntrada

    public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada

    public String getPrimeraPalabra ()  {
               for (int i=0; i < entradaTeclado.length() - 1; i++) {
            if (entradaTeclado.substring (i, i+1).equals(" ") ) {     //IMPORTANTÍSIMO: COMPARAMOS CON EQUALS
                return entradaTeclado.substring(0, i+1);         }
        }
        return entradaTeclado;  //Caso de que no se detecte ningún espacio devolvemos lo que haya
    } //Cierre del método getPrimeraPalabra

    public int getLongitud ()  {  //Método de la clase
        return entradaTeclado.length();
    } //Cierre del método getLongitud

} //Cierre de la clase

Código: [Seleccionar]
public class ObtenerLetra {
    public String cadena, letra;
    public int posicion;
    public ObtenerLetra(){
    }
   
    public void setValorCadena(String valorCadena) {
        cadena = valorCadena;
    }
   
    public void setValorI(int valorPosicion) {
        posicion = valorPosicion;
    }
   
    public String getValorLetra(){
        letra = cadena.substring(posicion-1,posicion);
        return letra;
    }
}
« Última modificación: 21 de Junio 2017, 18:51 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola LuisM

Por favor, si creas temas en el foro, ponle un título adecuado siguiendo las indicaciones que se dan en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Tu código se ve trabajado y cumple con lo que pedía el ejercicio

Puedo plantearte diversas cosas con vistas a mejorar.

a) Un diseño cuanto más simple sea, mejor. Esto quiere decir que si puedes hacer dos cosas de forma correcta, una de forma más simple y otra de forma más compleja, es preferible la forma simple, siempre que sea correcta.

Introducir una clase ObtenerLetra a mí me parece que complica más que aclara el ejercicio.

b) Las clases deben nombrarse correctamente. Un nombre de clase como ObtenerLetra no es adecuado. El nombre de una clase debe indicar lo que es (lo que representa) o lo que hace. Esta clase no representa un ObtenerLetra. Podrías llamarlo GestorDeLetras o GestorDeCadenasYLetras pero no ObtenerLetra porque eso no encaja en la forma de nombrar clases en programación orientada a objetos. Consulta este hilo https://www.aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698

c) Al nombrar métodos es preferible atenerse a los estándares. Por ejemplo en lugar de public void setValorCadena usaríamos public void setCadena, que es la forma estándar de nombrar este tipo de métodos por los programadores Java. Esto no quiere decir que no puedas hacerlo como lo has hecho, hacerlo puedes hacerlo, la cuestión es que si millones de programadores lo hacen de la misma manera y tú de otra, no vas a lograr entenderte con el resto de personas.

d) No todo lo que se usa en una clase debe ser un atributo. Por ejemplo public String cadena, letra; La letra es una parte de la cadena. Entonces estás almacenando algo (la parte) que ya tienes almacenado (en la cadena). Esto es contraproducente, no aporta nada repetir o tener atributos que se pueden extraer a partir de otros atributos.

Una cuestión interesante para aprender cuestiones de diseño y de fondo en programación Java es ver cómo responden otros usuarios los ejercicios en los foros, y también responder a otros usuarios que van más atrasados que nosotros en el curso, y ver distintos puntos de vista que plantea cada uno, tratando de valorar las ventajas e inconvenientes de lo que se plantea

Saludos

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola Alex !! Muchas gracias por tus consejos. He leído los links que pusiste y son muy útiles tanto sea para dejar un ejercicio o los nombres de las clases de Java. Coincido que todo ayuda y debería tener un lenguaje mas "matématico", o sea, mas preciso y sin posibilidad de ambiguedades en la lectura.
Con respecto a:
"Una cuestión interesante para aprender cuestiones de diseño y de fondo en programación Java es ver cómo responden otros usuarios los ejercicios en los foros, y también responder a otros usuarios que van más atrasados que nosotros en el curso, y ver distintos puntos de vista que plantea cada uno, tratando de valorar las ventajas e inconvenientes de lo que se plantea".
Me gusta la idea de participar y debatir: No participapé en otros mensajes porque 1º) soy novato en Java, obvio 2º) Para no molestar y dejar que las respuestas (yo solo agregaría preguntas, ja) era exclusividad de los expertos.
Muchas gracias
Saludos
Luis

 

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