Autor Tema: Ejercicio CU00650B extraer subcadenas con substring java  (Leído 4610 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Clase Encadenador -parecida a la clase Combinador-
Propósito: Encadenar las tres primeras letras de los dos parámetros introducidos, usando dos métodos distintos.

Código: [Seleccionar]
/**
 * Detalles de la clase.
 * Encadenar las tres primeras letras de los dos parámetros introducidos, usando dos métodos distintos.
 * @author (Toni)
 * @version (0)
 */
public class Encadenador {

    // Atributos de la clase Encadenador
    private String texto1;
    private String texto2;

    /**
     * Constructor para objetos de la clase Encadenador
     */
    public Encadenador() {
        // Inicializa atributos
        texto1 = "";
        texto2 = "";
    } // Fin del constructor Encadenador

    // Siguen los setters para los atributos de la clase Encadenador
    public void setTexto1 ( String valorTexto1 ) { texto1 = valorTexto1; }

    public void setTexto2 ( String valorTexto2 ) { texto2 = valorTexto2; }

    // Ahora los getters para los atributos de la clase Encadenador
    public String getTexto1 () { return texto1; }

    public String getTexto2 () { return texto2; }

    // Y seguidamente, procedimientos y funciones varios.
    // encadena las 2 cadenas cogiendo 3 letras del principio de cada una, o protesta si no puede.
    public String encadenaDosCadenas ( String valorTexto1, String valorTexto2 ) {
        String cadena = "";
       
        if ( valorTexto1.length() < 3 || valorTexto2.length() <3 ) {
            cadena = "Los parámetros no tienen la longitud mínima.";
        } else {
            cadena = valorTexto1.substring (0,3) + " " + valorTexto2.substring (0,3);
        }

        return cadena;
    } // fin del método

    // encadena las dos cadenas aunque no tengan los tres caracteres.
    public String encadenaDosCadenasSioSi ( String valorTexto1, String valorTexto2 ) {
        // <cadena> guardará el resultado
        String cadena = "";
        // longitud máxima de caracteres a devolver para cada parámetro
        int largoTexto1 = 3;
        int largoTexto2 = 3;
        // actualización de la longitud disponible para las dos cadenas.
        largoTexto1 = actualizaLongitud ( largoTexto1, valorTexto1 );
        largoTexto2 = actualizaLongitud ( largoTexto2, valorTexto2 );
        // encadenar resultado
        cadena = valorTexto1.substring(0,largoTexto1) + " " + valorTexto2.substring(0,largoTexto2);

        // devolver resultado
        return cadena;
    } // fin del método

    //
    private int actualizaLongitud ( int largoMax, String valorTexto ) {
        int largoFinal =  largoMax;
        int largoActual = valorTexto.length();
       
        if ( largoActual < largoFinal ) {
            largoFinal = largoActual;
        }
        return largoFinal;
    }
} // Fin de la clase Encadenador

Citar
Fíjate en el resultado que ofrece el método CombinadoSiempre
cuando se le pasan como parámetros dos cadenas vacías. ¿Te parece lógico el resultado?
En la clase tenemos definidos dos atributos o campos. ¿Tienen utilidad conocida a la vista del código de la clase? ¿Se usan en los métodos que tenemos definidos?
-----------------------
Respuesta a la cita anterior.

Si, es lógico.
Al introducir dos cadenas vacías como parámetros, el método devuelve un espacio en blanco " ", el espacio que encadenaba las dos cadenas.

Los dos atributos de la clase, declarados e inicializados, no se utilizan para nada. Se podrían omitir.

Saludos
« Última modificación: 31 de Agosto 2014, 19:21 por Alex Rodríguez »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Ejercicio CU00650B para revisar
« Respuesta #1 en: 22 de Junio 2014, 21:04 »
Hola, el código funciona bien pero te indico algunas cosas que son de interés.

La primera es que la clase tiene como atributos texto1 y texto2, pero estos atributos luego no participan de los métodos (excepto los getters y los setters). No se ve muy lógico: o bien puedes prescindir de los atributos si no se van a usar, o bien los métodos deberían manipular los atributos en lugar de parámetros. Esa sería la forma de hacer coherente que la clase tenga atributos: o los tiene para algo, o se los quitamos.

El método encadenaDosCadenas diría que va perfecto.

El método encadenaDosCadenasSioSi:

Utiliza el método auxiliar actualizaLongitud. Como ejercicio lo veo bien, pero si hubiera que plantearlo en la práctica me hubiera resultado más sencillo no usar ese método auxiliar sino escribir:
Código: [Seleccionar]
    // encadena las dos cadenas aunque no tengan los tres caracteres.
    public String encadenaDosCadenasSioSi ( String valorTexto1, String valorTexto2 ) {
        // <cadena> guardará el resultado
        String cadena = "";
        // longitud máxima de caracteres a devolver para cada parámetro
        int largoTexto1 = 3;
        int largoTexto2 = 3;
       
        if (valorTexto1.length() <3 ) { largoTexto1 = valorTexto1.length(); } else {largoTexto1 = 3;}
        if (valorTexto2.length() <3 ) { largoTexto2 = valorTexto2.length(); } else {largoTexto2 = 3;}
       
        // encadenar resultado
        cadena = valorTexto1.substring(0,largoTexto1) + " " + valorTexto2.substring(0,largoTexto2);

        // devolver resultado
        return cadena;
    } // fin del método

¿Por qué? Porque cuanto más sencillo sea el código mejor. De todas formas es un buen ejemplo de uso de un método auxiliar. Saludos

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00650B para revisar
« Respuesta #2 en: 24 de Junio 2014, 10:22 »
Hola Ogramar gracias por tus apuntes.

Si, si y si.
Si a los atributos declarados e iniciados, pero olvidados en el trabajo de la clase. Es
superfluo.
Si a usar los atributos en lugar de los parámetros en los métodos. Es práctico.
Si a agrupar el código dentro del método. Es compacto.

Son todas observaciones que meto en la saca para usar a conveniencia según la ocasión.

He de decirte que lees el pensamiento.
Empecé la clase sin atributos. Funcionaba. Ahí me pregunté el porqué de unos atributos
que no se usan.
Luego me dije, ¿y si los métodos trabajan con los atributos de la clase?. Empecé a hacer
los cambios, pero al final, me decidí por el código que incluía atributos superfluos.

Leyendo el texto del ejercicio, se hacían preguntas respecto de esos atributos, así que
para que la pregunta y la respuesta tuvieran un motivo de discusión, incluí esos
atributos, como un ejercicio de lo que no debe hacerse.

Finalmente, gracias por darme aire con lo del uso del método auxiliar.
 <actualizaLongitud>.

Aquí quiero preguntarte. ¿Cómo se gestiona la frontera entre: código sencillo/compacto y código con funciones separadas, independientes (cada una haciendo solo lo suyo)?


Saludos.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Ejercicio CU00650B para revisar
« Respuesta #3 en: 24 de Junio 2014, 11:16 »
Me has hecho sonreir con eso de que adivino el pensamiento  ;D, ya me gustaría a mí!
Citar
Aquí quiero preguntarte. ¿Cómo se gestiona la frontera entre: código sencillo/compacto y código con funciones separadas, independientes (cada una haciendo solo lo suyo)?

Esta pregunta que planteas es una pregunta muy interesante. Quizás una respuesta pueda ser que la experiencia te irá indicando, pero para no decir sólo eso (que es verdad), te voy a dar algunas ideas.

Si la tarea a realizar se puede condensar en unas cuantas líneas (5, 10, 15 ó 20) en general será preferible mantenerla "compacta". Si la tarea a realizar requiere más de 20 líneas posiblemente es preferible delegarla en un método independiente. Estos es orientativo y depende del proyecto en el que se esté trabajando. Quizás el límite en algunos proyectos sea más grande, en vez de en torno a 20 en torno a 40, pero como idea inicial puede valer. Otro criterio a tener en cuenta es la complejidad. Si la tarea es de 15 líneas pero son muy muy complejas, posiblemente sea adecuado ponerla de forma independiente. Saludos

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00650B para revisar
« Respuesta #4 en: 25 de Junio 2014, 07:38 »
Gracias Ogramar por tu visión sobre los métodos compactos y los independientes.
Para mí es un buen punto de partida. ::)

Saludos y gracias.

 

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