Publicado el Deja un comentario

Usando IA para obtener estructura de carpetas

pile of folders

Usando la IA Gemini de Google para estandarizar mi estructura de las carpetas de mis aplicaciones java de acuerdo a los standares generales.

Durante mi carrera he armado mi propia estructura de carpetas AD-HOC usando como ejemplo las diversas aplicaciones que tenido que intervenir, finalmente llegé a una estructura que si bien es cómoda para mí, posiblemente sea algo compleja o poco natural para quien deba modificarla en el futuro, es por eso que me propuse ordenar de una forma más general y standard los archivos de mis futuros trabajos, si bien, era algo que hace tiempo deseaba hacer, por lo que preguntaba a otros colegas la forma en que ordenaban las carpetas.. pero vi que todos tenían sus propias formas de estructurar, ya sea por las características de los frameworks o simplemente por comodidad, finalmente llegé al mismo punto inicial.

Una idea interesante que tuve hoy fue la de consultar a la IA la respuesta a mi problema, esperando que esa voz inparcial me diese una solución sin sesgos y directa y quiero compartir este desarrollo por si alguien tiene esta misma duda y desea usar (o incluso complementar) esta respuesta, sólo por motivos de contextualizar el ejemplo le pedí que usara como base una aplicación SpringBoot Java:

Bash
├── app
   ├── controllers
      ├── HomeController.java
      └── UserController.java
   ├── entities
      ├── User.java
      └── ...
   ├── repositories
      ├── UserRepository.java
      └── ...
   ├── services
      ├── IUserService.java
      ├── UserService.java
      └── ...
   └── utils
       ├── AppConfig.java
       └── ...
└── src
    ├── main
       ├── java
          ├── com
             ├── example
                ├── App.java
                └── ...
          └── ...
    └── resources
        ├── application.properties
        └── ...

Explicación:

  • app: Contiene el código fuente de la aplicación.
  • controllers: Contiene los controladores MVC.
  • entities: Contiene las clases de modelo que representan las entidades del sistema.
  • repositories: Contiene los repositorios que implementan el patrón Repository para abstraer la lógica de acceso a datos.
  • services: Contiene los servicios que encapsulan la lógica de negocio de la aplicación.
  • utils: Contiene archivos de utilidades comunes a toda la aplicación.
  • src/main/java: Contiene el código fuente de la aplicación Java.
  • src/main/resources: Contiene los archivos de configuración y recursos de la aplicación.

Ejemplo de código:

Java

// UserController.java

@RestController
public class UserController {

    @Autowired
    private IUserService userService;

    @GetMapping("/")
    public String index() {
        return "Hola Spring Boot!";
    }

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userService.findAll();
    }

}

// UserService.java

@Service
public class UserService implements IUserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> findAll() {
        return userRepository.findAll();
    }

}

// UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

}
Java

En este ejemplo:

  • La clase UserController es un controlador MVC que expone dos endpoints: / e /users.
  • La clase UserService es un servicio que encapsula la lógica de negocio para la gestión de usuarios.
  • La clase UserRepository es un repositorio que implementa el patrón Repository para acceder a los datos de la entidad User.

Conclusión:

La estructura de carpetas propuesta para una aplicación Spring Boot es similar a la estructura de carpetas para una aplicación MVC con Model DAO Services. La principal diferencia es que la capa de acceso a datos se implementa utilizando la tecnología JPA (Java Persistence API).

Nota: Esta es solo una estructura de ejemplo, y puede ser modificada para adaptarse a las necesidades específicas de cada proyecto.

Publicado el Deja un comentario

Clase simple para convertir String a Fechas

a calendar page on a clipboard

Clase simple que valida la entrada de la cadena con un formato de fecha, si cumple con los formatos esperados, entonces crear el objeto LocalDate, de lo contrario retorna un nulo

Este es un ejemplo simple del uso de expresiones regulares para validar la forma de la cadena de entrada antes de ejecutar la conversión de la información, lo cual da un primer manejo simple de la información al momento de evaluar el dato a convertir, aunque regexp no evalúa la validez de la fecha (por ejemplo si es 32 de enero lo toma como verdadero) evalúa realmente que la forma de la cadena sea correcta.


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.regex.Pattern;

/**
 * Simple class to handle the date objects and
 * parse from string to LocalDate
 */
public final class DateUtil {

    /**
     * Parse a String to DateLocal object in several formats
     * @param inputDate String with in date shape
     * @return LocalDate from the input string, null if is not valid
     */
    public static LocalDate parseFromString (String inputDate) {

        DateTimeFormatter standardFormat;

        LocalDate parsedStringDate = null;

        // Validate date format d/MMM/yyyy ex. 24/Apr/2021
        if (Pattern.compile("^[0-9]{2}\\/(\\w)+\\/[0-9]{4}$").matcher(inputDate).matches()) {
            standardFormat = DateTimeFormatter.ofPattern("d/MMM/yyyy", Locale.ENGLISH);
            parsedStringDate = LocalDate.parse(inputDate, standardFormat);
        }

        // Validate date format d-MMM-yy ex. 24-Apr-21
        if (Pattern.compile("^[0-9]{2}\\-(\\w)+\\-[0-9]{2}$").matcher(inputDate).matches()) {
            standardFormat = DateTimeFormatter.ofPattern("d-MMM-yy", Locale.ENGLISH);
            parsedStringDate = LocalDate.parse(inputDate, standardFormat);
        }

        // Return date object or Null
        return parsedStringDate;
    }
    
}

Acá dejo un ejemplo de uso de esta clase


public class Main {

    public static void main(String[] args) {
        String stringDate = "24-Apr-21";
        System.out.println( DateUtil.parseFromString(stringDate).toString() );
    }

}
Publicado el Deja un comentario

Número Factorial En Java

Implementación del cálculo del número factorial en lenguaje Java

Esta es una implementación del cálculo del número factorial extremadamente sencilla, que tiene como propósito el de responder a una necesidad programática basado en la simpleza, sólo con un par de lineas de código y recursividad he llegado a una solución que es posible desarrollarla en cualquier lenguaje. Para este caso he usado JAVA que es el leguaje en el cual estoy profundizando actualmente. el nivel del problema es muy básico pero es importante realizar el ejercicio de forma personal con el fin de ir habilitando la mente para solucionar problemas mas complejos. Sin más acá el desarrollo de la solución.

/**
 *  Clase para el cálculo del valor Factoral (n!) 
 *  de un número entero usando recursividad
 */
class Factorial {
  
  /**
   *  Cálculo el valor factorial (n!)
   *  llamada al método
   *
   *  int retorno = Factorial.calculo(3)
   *
   *  retorno asumirá el valor: 6
   */
	public static int calculo (int numero) {
		if (numero <= 1) return 1;
		return numero * Factorial.calculo(numero - 1);
	}
  
}

La manera de usar este código es la siguiente:

int retorno = Factorial.calculo(3);
System.out.println(retorno);

El texto de salida por pantalla sería

6
Publicado el Deja un comentario

Lista doblemente enlazada con Java

chain a serial assembly connected pieces

Implementación de ejemplo de una lista doblemente enlazada en lenguaje JAVA 8+

Continuando con la implementación de estructuras de datos acá presento una lista doblemente enlazada y el recorrido de sus valores hacia adelante y atrás, su implementación es solo una variación de la lista simple, pero con la particularidad que cada nodo no solo tiene un puntero al siguiente sino también un puntero al anterior, acá el código con la implementación y un link a repl.it para la revisión de la ejecución del siguiente código.

Tabla de desempeño basado en Big O

AlgoritmoTiempo promedioPeor caso
BúsquedaO(n)O(n)
InserciónO(1)O(1)
EliminaciónO(1)O(1)

El ejemplo de ejecución en Repl.it https://repl.it/@donpandix/Estructura-Datos
El objeto nativo de java se llama LinkedList y su documentación oficial está en https://bit.ly/2Z1FNO1

Publicado el Deja un comentario

Lista Enlazada con Java

selective focus photoraphy of chains during golden hour

Con el propósito de profundizar y/o recordar conocimientos escenciales en lo que refiere a codificación, comenzaré nuevamente a publicar algunas implementaciones de los conceptos estructura de datos y algoritmos, en esta oportunidad presento la implementación de una lista enlazada simple en lenguaje JAVA, ya tenía una implementación de esta estructura de datos realizado con Swift, pero quise realizarla en este JAVA porque es un lenguaje que en lo particular me gusta mucho. sin más les dejo el código.

Acá les dejo un link al proyecto en repl.it si desean analizarlo y ejecutarlo con más detalle https://repl.it/@donpandix/Estructura-Datos

Un dato relevante para quienes les gusta conocer más en profundidad las implementaciones, es su desempeño definido por su Big O:

Algoritmo Tiempo promedio Peor caso
Búsqueda O(n) O(n)
Inserción O(1) O(1)
Eliminación O(1) O(1)

El objeto nativo de java se llama LinkedList y su documentación oficial está en https://bit.ly/2Z1FNO1

Publicado el 2 comentarios

Valida el RUT chileno con Java

photo of cryptic character codes

Valida Rut Chileno con expresiones regulares

Después de bastante tiempo, me di cuenta que no había subido ninguna validación de RUT chileno con Java. Es por esto que hoy comparto este código basado en una que está desarrollada con PHP y JavaScript . Espero que les sea de bastante utilidad.

Publicado el Deja un comentario

Validación de la forma de un email implementado con Java

email blocks on gray surface

Validación de la forma de un email, por medio de expresiones regulares implementado en Java.

Esta es una función de validación de email que ya he implementado con PHP y JavaScript, hasta ahora me han funcionado bastante bien, esta misma funcionalidad la he tenido que implementar en lenguaje Java y hoy la pongo a disposición para todo aquel que le interese hacer uso de ella de forma libre, ahora, si además deseas mejorarla haciéndola más eficiente, te lo agradeceré un montón, finalmente acá les va el código que tengo alojado en GIST:

 

Para hacer uso de esta clase, es de manera muy sencilla, se debe invocar la clase estática y su método validaEmail la cual retorna un booleano, evidentemente si la cadena con el valor del email a validar está correcto, retornará un TRUE, en caso contrario retornará un FALSE.

Espero que les sea de muchísima utilidad, hasta la próxima.

Publicado el Deja un comentario

String Pad Left función relleno de caracteres en JAVA

person using macbook pro on person s lap

String Pad Left es una función sencilla que llena de caracteres específicos el lado izquierda de la cadena

String Pad Left es una implementación extremadamente sencilla de una función que llena con un carácter específico el lado izquierdo de una cadena para que tenga un largo final específico, por ejemplo, si tengo una cadena de texto «ZZZ» puedo modificar esta cadena para que tenga un largo de 10 caracteres siendo llenada por la izquierda con el carácter «Y» dando como resultado la cadena «YYYYYYYZZZ».  Esta implementación la use para una aplicación en particular que estoy desarrollando y como se ajustó bien al problema que tenía que resolver, la verdad, es que no la he tocado más, pero probablemente tendré que mejorarla en un futuro muy cercano. De todas formas la dejo por si te sirve, al menos, como base de una solución.