Visiteur par introspection re-visité

Programmation Avancée

Modérateur : douinj

marek_r
Messages : 2
Inscription : 05 oct. 2020 9:10

Visiteur par introspection re-visité

Message par marek_r » 09 déc. 2020 12:15

Bonjour,

Je suis en train de lire le livre Clean Code de "Uncle Bob" Robert C. Martin, je le trouve passionnant et très formateur.

Pour m'entraîner, j'ai repris le code du visiteur par introspection, avec 1 niveau d'abstraction par fonction et un nommage descriptif.
Voici le code si ça en intéresse certains :)

Code : Tout sélectionner

import java.lang.reflect.*;

public abstract class Visiteur<T>{

    private boolean compatibleClassFound;
    private T result;

    private Expression toVisit;
    private Class<?> toVisitActualClass;
    private Class<?> currentVisitorClass;

    /** 
     * @throws UnsupportedOperationException
     *      When there is no visit method for this Expression's actual type
     */
    public T visite(Expression toVisit) throws UnsupportedOperationException{
        clear();                                // to avoid inconsistencies between attributes
        loadExpression(toVisit);
        visitWithCompatibleClass();
        throwExceptionIfVisitNotPossible();
        return result;                          // if no exception were thrown
    }

    private void clear(){
        compatibleClassFound = false;
        result = null;
        this.toVisit = null;
        this.toVisitActualClass = null;
        this.currentVisitorClass =null;
    }

    private void loadExpression(Expression toVisit){
        this.toVisit = toVisit;
        this.toVisitActualClass = this.toVisit.getClass(); // this.toVisit in case of asynchrony
    }

    private void visitWithCompatibleClass(){                                    // MINIMALIST WHILE LOOP
        currentVisitorClass = this.getClass();                                  // init
        while(currentVisitorClass != Object.class && !compatibleClassFound){    // condition
            tryCurrentVisitorClass();                                           // instruction
            nextVisitorClass();                                                 // iteration
        }
    }

    private void tryCurrentVisitorClass(){
        try{
            visitWithCurrentClass();
        } catch(Exception e){
            compatibleClassFound = false;
        }
    }

    private void visitWithCurrentClass() throws Exception{
        Method visitMethod = currentVisitorClass.getMethod("visite", toVisitActualClass);
        result = (T) visitMethod.invoke(this, toVisit);
        compatibleClassFound = true; // if no exception were thrown
    }

    private void nextVisitorClass(){
        currentVisitorClass = currentVisitorClass.getSuperclass();
    }

    private void throwExceptionIfVisitNotPossible() throws UnsupportedOperationException{
        if (result == null)
            throw new UnsupportedOperationException();
    }
}
Bonne journée,
Rémy

douinj
Messages : 258
Inscription : 18 mars 2009 15:46

Re: Visiteur par introspection re-visité

Message par douinj » 09 déc. 2020 12:29

Bonjour et merci pour l'info,

Et la préface est de James O. Coplien qui est cité dans notre unité
but in reading this book you will be challenged to take up good disci-plines that you long ago surrendered to apathy or a desire for spontaneity and just“responding to change.”
https://www.goodreads.com/book/show/797 ... ram_Design

A lire entre deux TP (le pdf semble accessible ...)

Répondre