desarrollo,

Usando CodeWhisperer para JAVA y SpringBoot

DevOpsGT DevOpsGT Follow Aug 21, 2023 · 5 mins read
Usando CodeWhisperer para JAVA y SpringBoot
Share this

Desarrollar siempre es una tarea que requiere de herramientas que puedan facilitarla tanto como sea posible para poder enfocarse en la complejidad del algoritmo que se está construyendo y no batallar con la tecnología del lenguaje de programación.

Amazon CodeWhisperer es una herramienta de autocompletación(si es que la palabra existe) de código que se apoya en Inteligencia Artificial para poder usar lenguaje natural para describir bloques conocidos de código de una manera mas rápida. El código incluso se adecua al contexto en el que se está escribiendo, como las variables existentes y considerando los imports que se tengan en el archivo. Está disponible dentro de la extensión AWS Tookit para Visual Studio Code y editores mas profesionales como IntelliJ.

Dado que la arquitectura de microservicios tiene muchos adeptos hoy en día, vale la pena explorar como CodeWhisperer nos puede apoyar en la programación con JAVA y SpringBoot.

Instalación

Para poder utilizar CodeWhisperer puedes seguir estos videotutoriales que te ayudarán a instalarlo dependiendo de tu editor

Usando Amazon CodeWhisperer

Una vez instalado, podemos empezar a generar snippets en nuestro código aprovechando la sintaxis y escribiendo nuestra búsqueda en líneas comentadas. Al momento de escribir este post sólo existe el soporte para escribir la búsqueda en inglés, ejemplo:

package com.ejemplo.autogenerated;

//create a Product class with id, name, price, description and rating properties. 

Al finalizar de escribir la línea de comentario y presionando ENTER, Amazon CodeWhisperer iniciará la búsqueda y nos ofrecerá una recomendación del código de lo que necesitamos, en este caso la generación de una clase tipo POJO que podremos utilizar para representar nuestra entidad Product en el código.

public class Product {
    private String id;
    private String name;
    private Double price;
    private String description;
    private Integer rating;
    
    public Product() {
    }
  
    public Product(String id, String name, Double price) {
      this.id = id;
      this.name = name;
      setPrice(this.price = price);
    }
  
    public String getId() {
      return id;
    }
  
    public void setId(String id) {
      this.id = id;
    }
  
    public String getName() {
      return name;
    }
  
    public void setName(String name) {
      this.name = name;
    }
  
    public Double getPrice() {
      return price;
    }
  
    public void setPrice(Double price) {
      this.price = price;
    }
    
    public String getDescription(){
      return description;
    }

    public void setDescription(String description){
      this.description = description;
    }

    public Integer getRating(){
      return rating;
    }
    
    public void setRating(Integer rating){
      this.rating = rating;
    }
}

Vale la pena notar que los atributos de la clase son los que indicamos en el comentario, pero nunca se indicó el tipo en realidad, esa fue una deducción del algoritmo de Inteligencia Artificial. Vamos a elevar un poco mas la apuesta, y ya que tenemos la entidad inicial, usaremos el servicio de DynamoDB para poder almacenar los objetos que nuestro programa vaya creando. Empezaremos entonces pidiendole a CodeWhisperer que nos ayude creando el Bean base, primero agregando los imports necesarios y luego escribiendo la búsqueda en una linea de comentario:

package com.ejemplo.autogenerated;

import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbAttribute;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey;

//create a dynamo db ProductDaoEntity class with partition Key as id, name, price, description, rating attributes using dynamo db enhanced mapper annotations

Luego de escribir ENTER obtendremos la recomendación de una clase base, anotada incluso para poder aprovechar las funcionalidades del AWS SDK para DynamoDB:

@DynamoDbBean
public class ProductDaoEntity {

    private String id;
    private String name;
    private double price;
    private String description;
    private int rating;
    
    public ProductDaoEntity() {
    }

    public ProductDaoEntity(String id, String name, double price, String description, int rating) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.description = description;
        this.rating = rating;
    }

    @DynamoDbPartitionKey
    @DynamoDbAttribute("id")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @DynamoDbSortKey
    @DynamoDbAttribute("name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @DynamoDbAttribute("price")
    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @DynamoDbAttribute("description")
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @DynamoDbAttribute("rating")
    public int getRating() {
        return rating;
    }

    public void setRating(int rating) {
        this.rating = rating;
    }
    
    @Override
    public String toString() {
        return "ProductDaoEntity [id=" + id + ", name=" + name + ", price=" + price + ", description=" + description
                + ", rating=" + rating + "]";
    }

}

Y aunque con eso la verdad ya es bastante ayuda, aún todavía podemos aprovechar CodeWhisperer para poder crear métodos que tengan cierta lógica base de funcionamiento, como el lidear con la excepciones:

//Create the DynamoDB table through enhancedClient object from ProductDaoEntity. If the table already exists, log the error.
    @PostConstruct
    public void createTable() {
        try {
            DynamoDbTable<ProductDaoEntity> productTable = enhancedClient.table(PRODUCT_TABLE_NAME, TableSchema.fromBean(ProductDaoEntity.class));
            productTable.createTable();
        } catch (Exception e) {
            logger.error("Error creating table: ", e);
        }
    }

¿Aún quieres mas?, ¿Que tal poder crear todo un CRUD, un Servicio o incluso un REST Controller de format automática? Genial!!

Resumen

Amazon CodeWhisperer es una tecnología increible para poder recomendar snippets de código que nos ayuda a ganar velocidad para escribirlo. Está aún lejos de quitarte el trabajo, simplemente ayuda a evitarnos esa molestia de tener que buscar la sintaxis correcta, el snippet adecuado o el nombre de esa excepción que no se te queda. Sin embargo, la complejidad de los algoritmos y toda esa funcionalidad que hace que los procesos del negocio funcionen aún dependen 100% del hábil programador detrás del ordenador.

DevOpsGT
Written by DevOpsGT
Aprende sobre ideas, tecnologías y herramientas para tus tareas de devops