PATTERN DESIGN osservazioni su "Chain of Responsibility"

di il
3 risposte

PATTERN DESIGN osservazioni su "Chain of Responsibility"

Salve a tutti del forum,
attualmente studio i pattern design e mi sono procurato diversi libri sia in PDF che cartacei per meglio approfondire i loro aspetti.

Tuttavia inizio a notare delle stranezze tra ciò che propone il pattern e ciò che viene dato come esempio. I PDF su internet utilizzano quasi tutti lo stesso esempio ma anche due libri che ho non sono di meno.

Osservazione: Negli esempi visti, trovo la classe UserExample contenete sia il codice relativo alla definizione della sequenza di oggetti (creati li) da richiamare (come se l'utente definisse una sorta di Manager del pattern) e sia il codice di utilizzo da parte dell'utente.

OSSERVAZIONE: Il codice relativo alla "gestione delle responsabilità" ossia generazione degli oggetti e relativa definizione della sequenza, non andrebbe messa in una classe separata (ad esempio: ChainManager) al fine di nascondere la sequenza all'utente ?
All'utente rimarrebbe solo il compito di generare una istanza da ChainManager e attraverso l'istanza inviare la sua richiesta.

Il ChainManager e tutte le classi che utilizza verrebbero occultate. All'utente interessa il risultato finale / esecuzione di qualcosa e forse non saprebbe neanche come deve gestire una particolare cosa o sequenza. Oppure per motivi di sicurezza non deve poter decidere lui quale sia la sequenza delle operazioni.

Cosa ne pensate dell'osservazione ?

Grazie per aver letto ancora di più se rispondete.
cnesan

3 Risposte

  • Re: PATTERN DESIGN osservazioni su "Chain of Responsibility"

    La risposta è: sono per lo più cazz..te.
    Il 99% dell' "ingegneria del software" è fatta di sciocchezze, che vengono spacciate come pillole di verità.

    Analogamente un buon 95% dei "design pattern" è, a sua volta, aria fritta.

    Forse 99% nel caso di OO che, tra l'altro, ormai sta (tendenzialmente) sparendo, o comunque ridimensionandosi alla stragrande, vista l'ubiquità di interfacce GUI (mi riferisco all'utilizzatore, non all'interfaccia medesima).

    L'utilizzo di una catena, fichissima in teoria e nei vari paper accademici, è essenzialmente inutile, anzi dannosa, nella pratica.
    Nessuno con un minimo, e dico proprio un minimo, di esperienza di programmi "veri" penserebbe di complicarsi la vita delegando a layer su layer di strati software di non so cosa.

    Purtroppo, sempre più spesso, vedo concentrarsi su come usare strumenti complessi, in situazioni nelle quali non portano benefici, per ottenere risultati incerti.

    ---
    Tornando alla domanda, cosa, di preciso, ti turba?
    Hai almeno un'idea di cosa si sta parlando, e perchè?

    Se non hai le idee chiarissime fin dall'inizio, perdersi nei dettagli implementativi ti porterà fuori strada.
  • Re: PATTERN DESIGN osservazioni su "Chain of Responsibility"

    cnesan ha scritto:


    OSSERVAZIONE: Il codice relativo alla "gestione delle responsabilità" ossia generazione degli oggetti e relativa definizione della sequenza, non andrebbe messa in una classe separata (ad esempio: ChainManager) al fine di nascondere la sequenza all'utente ?
    Il Chain of Responsibility, così come altri pattern, non ha un solo ed unico modo di implementazione. Ci possono essere differenze e varianti più o meno fini. Quello che importa è "intravedere" il pattern.

    Se ti capita di vedere una cosa del tipo:
    public interface Handler {
        void setNextHandler(Handler handler);
        void execute();
    }
    e una classe concreta per uno "step" specifico nella catena del tipo:
    public class MyHandler implements Handler {
        private Handler next;
    
        // ... implementazione metodi
    }
    Vuol dire (già solo osservando la interfaccia) che ciascun handler ha il riferimento diretto al prossimo handler. Ma non è detto che debba per forza essere così.
    Una variante è fare in modo che un handler NON riceva il riferimento diretto al prossimo handler ma riceva un oggetto di tipo X (fornito dal "manager" della catena) che "sa" come invocare il prossimo handler. Il vantaggio di quest'ultima variante è che quell'oggetto X può fare della logica in mezzo (es. logging o altro) prima di invocare il "prossimo" handler. Mentre invece con il Handler detto prima, una volta che sono stati "incatenati" insieme tutti gli handler ... è fatta, in mezzo non si può fare più nulla, per dire.

    Un'altra variante ancora possibile è fare in modo che ciascun handler NON riceva e NON abbia alcuna riferimento da invocare per il successivo. Invece il metodo "execute" (o come lo si chiama) potrebbe restituire un true/false per dire se continuare o no nella catena (o il contrario: true=è stato gestito, non andare oltre).
    La "catena" degli handler ovviamente la avrà un altro oggetto "manager" della catena, che terrà una lista di handler e invocherà ciascuno proseguendo o no a seconda di come risponde ciascun handler. In questo caso, ciascun handler è addirittura assolutamente ignaro della catena.

    Bene, in tutti questi che ho detto è SEMPRE il Chain of Responsibility. Il concetto è lo stesso: avere una catena di responsabilità dove ci possono essere più oggetti che sarebbero in grado di gestire una certa richiesta, dando a ciascuno la possibilità di gestirla oppure no.
    E' questo che deve essere "intravisto".


    Riguardo la questione se questo (e i pattern in generale) sia utile o sia una c....ta, queste cose POSSONO essere utili. Se fatte in modo sensato, possono rendere una architettura più facilmente manutenibile ma anche più comprensibile. Se chi ci mette mano ha le idee chiare su OOP/design-pattern "intravede" sicuramente quel tal pattern per cui riesce subito a farsi innanzitutto una idea generale del progetto.


    Secondo me le c....te nell'informatica sono ben altre. Mi è capitato e mi capita di vedere spesso in progetti "importanti" (di banche, assicurazioni ecc..) delle scemenze totali assolutamente inutili.

    Del tipo: qualcuno è riuscito (pensate!) a fare un catch con logging del tipo:
    try {
        .....
    } catch (Exception e) {
        logger.error(e.getStackTrace().toString());
    }
    getStackTrace() restituisce un array. E il toString() sugli array non è significativo (rimane il toString() di Object). Quindi quel logging non serve a un piffero.
    Non so dire chi l'ha scritto. Fosse solo per me, lo rimanderei a casa a studiare Java ....
  • Re: PATTERN DESIGN osservazioni su "Chain of Responsibility"

    Grazie per le risposte.

    Per la prima risposta e parlo per me, studiando i pattern design mi sono accorto che alcuni già li avevo sviluppati anche se non sapevo il nome (a saperlo prima avrei evitato di svilupparli da zero). Altri, in particolare OBSERVER, era quello che mi serviva e mi serve come il pane. Quindi avere una conoscenza di tali Pattern può essere di aiuto nello sviluppo ma anche nel avere uno schema di come è strutturato il SW.

    Per la seconda risposta (andbin), mi ero accorto che ci sono molte varianti e ognuna comporta pregi e difetti. La mia osservazione era sul concetto del pattern in quanto non vorrei cadere nel tranello di considerare come un pattern ciò che in realtà sono più pattern montati in un certo modo (il lato brutto di essere autodidatta).

    Grazie per le risposte.
    cnesan
Devi accedere o registrarti per scrivere nel forum
3 risposte