El límite está en tu mente no en el lenguaje

Se que por el título del artículo, más de uno pensará que me voy a poner a filosofar sobre unas cosas u otras, pero nada dista más de mi intención. Lo que pasa es que al igual que no se porque he escrito la porción de código que os traigo hoy, no sabía que título ponerle.

Hoy es uno de esos días donde en una discusión sobre diseño, salta alguien diciendo si tal cosa o tal otra se puede o no se puede hacer, y si Java no lo soporta y ese tipo de discusiones que no llegan a ningún lado. En concreto, era el paso como parámetro de una función (véase que estamos por razones de proyecto usando la versión 1.7 y no la 1.8). Es cierto, que en este punto no te queda más remedio que concederle la razón, sobre todo si entra en comparaciones con JavaScript (salvando las distancias). Pero, he aquí que a uno después de estas discusiones, se le queda un no sé qué que que se yo que tiene que ponerse a escribir algo de código a ver que puede hacer.

La idea, era escribir una operación de CRUD que en ciertas ocasiones necesita crear una transacción y en otras no. Lo más común es duplicar los métodos, en uno la lógica y en otro el manejo de la transacción y la llamada al que tiene la lógica (seguro que habrán métodos mejores, peores y de todo tipo, pero no es el punto de este artículo).

Pues bien, para hacer una aproximación de como pasar funciones como parámetros (sin que el lenguaje lo permita) yo me he decantado por una clase abstracta. A continuación, os pongo el código y luego, lo explicaré un poco, aunque es muy básico.

package com.wordpress.infow.chorradas;

import org.apache.log4j.Logger;

import com.wordpress.infow.db.TransactionManager;

public abstract class GenericExec {

    static Logger logger = Logger.getLogger(GenericExec.class);

    public static final int CREATE = 0;
    public static final int READ = 1;
    public static final int UPDATE = 2;
    public static final int DELETE = 3;

    abstract public String create(Object obj, TransactionManager tr);

    abstract public Object read(Object obj, TransactionManager tr);

    abstract public void update(Object obj, TransactionManager tr);

    abstract public void delete(Object obj, TransactionManager tr);

    public Object withTransaction(GenericExec generic, Object data, int operation) {
        Object obj = null;

        TransactionManager tr = new TransactionManager();

        try {
            tr.initTransaction();

            switch (operation) {
                case CREATE:
                    obj = generic.create(data, tr);
                    break;

                case READ:
                    obj = generic.read(data, tr);
                    break;

                case UPDATE:
                    obj = generic.update(data, tr);
                    break;

                case DELETE:
                    obj = generic.delete(data, tr);
                    break;
            }

            tr.commit();
        } catch (Exception e) {
            GenericExec.logger.error(generic.getClass() + "::" + operation + " " + e.getMessage());
        } finally {
            tr.closeTransaction();
        }

        return obj;
    }
}

Como se puede ver, la clase abstracta obliga a implementar los métodos que deseamos, las operaciones de CRUD, y posee la implementación de la función que nos va a permitir ejecutar estas con una transacción alrededor. Todo muy básico. Además, de esta clase van a extender muchas otras que va a recibir parámetros de tipo diferente y devolver parámetros de tipo diferente para cada una de las clases que heredan.

Yo creo que no necesita más explicación. Tiene algunas pegas, como que hay que tener la precaución de realizar los casting apropiados desde el objeto Object al que deseamos utilizar, pero por lo demás es bastante manejable.

De nuevo, recordados que esto solo es un juguete, una chorrada implementada a partir de un debate sobre algo, y sin más sentido que como reto o idea, y ver que aunque muchas veces un lenguaje no nos provee de algo, siempre podemos implementarnos algo, como reza el título del artículo, los límites muchas veces están en la mente del desarrollado no en el lenguaje. Y no hablo de inteligencia, sino de ganas de jugar un rato con el lenguaje o falta de tiempo, o cosas de este estilo.

Bueno, espero que como curiosidad os haya gustado. Si alguien tiene alguna duda, preguntad sin miedo. Nos vemos.

El límite está en tu mente no en el lenguaje

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.