persistenza e Proxy pattern

Luca | February 23, 2005

Una classica architettura (per me) che ho usato (e che sto usando tuttora) per salvare su database è avere una serie di bean (POJO) con un sacco di begli accessor che mi violano l’incapsulamento che vengono passati ad un oggetto (ultimamente ho implementato un bel DAO-Data Access Object, se non ero-) che si occupa di salvare. L’oggetto è una sorta di Manager del db per QUEL determinato oggetto.

Mi spiego:

Se ho un oggetto Persona:


class Persona {
private String nome;
private int eta;
//accessor dei campi
}

avrò un PersonaManager:

class PersonaManager implements IPersona {
public void salvaPersona(Persona persona){
//CODE CODE CODE
}

public Collection leggiPersoneAnziane(String limiteEta) {
//CODECODECODE< }
[...]
}
insomma: quello che a che fare con la Persona, lui lo gestisce.In questo modo cerco di astrarmi dal basso livello del database: se domani passo da SQL+JDBC (o ADODB o cosa altro si usa in casa MS) ad un layer di persistenza ad oggetti non è un problema...nuovo oggetto che implementa l'interfaccia e a basso livello lui saprà cosa fare per leggere/scrivere sul db; il client che chiede il salva non cambia di una virgola.

Però..c'è un però...

  1. c’è qualcosa che non mi soddisfa
  2. la responsabilità di salvarsi non potrebbe essere della Persona stessa ?(Persona salvati!!) i controller diventato grassottelli (sanno che devono istanziare il DAO,chiamare il tal metodo….ma quante cose!!!)
  3. l’idea al centro della mail è quella di usare il Proxy Pattern per fare questo (credo di averlo letto da qualche parte tempo fa, ma non ritrovo più il documento…)

    l’oggetto Persona ha i suoi metodi scrivePersona(), leggiPersona() e così via…..sono questi metodi che implicitamente istanziano il DAO !

    quindi:

    class Persona {
    public void scriviPersona() throws MiaEccezione{
    IPersona personaManager = new PersonaManager();
    personaManager.scriviPersona();
    [....]
    }

    in questo modo riesco anche a tenere tutti i campi incapsulati, non essendo obbligato a priori a dare accessor a tutto (lo darò solo a quello che mi serve..forse…)
    Ho anche l’impressione che seguendo questa strada si ottenga un design molto più OO che quello che sto attualmente facendo; ora, aldilà di implementare n’interfaccia (WOW!!Cool!!!) ho una serie di oggetti che interagiscono in modo alquanto procedurale (la servlet-il controller- piglia i campi dalla request, li pusha -fa sempre molto cool italianizzare alcuni termini inglesi, vero ?- in Persona, istanzia il DAO, passa persona al DAO e gestisce il risulato/eccezione generica)
    Persona tende a non essere più solo un odiato datastore ma qualcosa di più concreto..o mi sbaglio ?

    il dubbio è ….sto “sopra-ingegnerizzando” il problema ? aggiungo complessità inutile (guai per noi agilisti!! ;-) ) ? l’idea è tutta sbagliata ?

    sto ancora cercando un feedback a proposito….qualcuno mi può aiutare ?

One response

...proprio proprio bello 'sto iPod... ma te l'avranno mica regalato?!?

Roberto | November 28, 2007

…proprio proprio bello ’sto iPod… ma te l’avranno mica regalato?!? …beh, sicuramente persone fantastiche!!!

Leave a comment

You can use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>