Il modello "exposer (hack)" è uno schema appena identificato o ha un altro nome?

1

MODIFICATO PER CHIARIMENTO

In passato, ho visto un intero tipo di risoluzioni e confusioni. Alcuni spiccano davvero. Una risoluzione particolare che ho inizialmente pensato come un fondente forse merita una categoria a parte.

Potrebbe essere considerato un hack o un pattern, in quanto un modello di design è solo un pezzo di codice riutilizzabile. Quindi, è ancora conforme alla definizione: link

Probabilmente ha già un nome ma non l'ho visto in letteratura. Mi stavo chiedendo se qualcuno conosce un altro nome per quello che ho etichettato come "modello espositore (hack)".

Ne ho incluso un esempio sotto. Questo codice viene utilizzato per esporre i dati che non sono disponibili per un'origine dati. Invece, i risultati non vengono generati finché non viene chiamato un metodo di associazione dati. Sfortunatamente, questi risultati non vengono memorizzati da nessuna parte nell'origine dati dopo l'esecuzione. Ciò è dovuto a una svista (o cattiva progettazione) nell'API di terze parti. Quindi, i risultati vengono passati a un ripetitore da archiviare localmente, prima di restituirli come un PageDataCollection popolato:

public static PageDataCollection Search(this SearchDataSource searchDataSource)
{
            PageDataCollection results = new PageDataCollection();

            //This is a dummy repeater whose only purpose is to provide a way of
            //iterating over the search results
            Repeater dummy = new Repeater();

            dummy.ItemDataBound += delegate(Object sender, RepeaterItemEventArgs e)
            {
                if (e != null && e.Item != null && e.Item.DataItem != null)
                {
                    PageData pageData = e.Item.DataItem as PageData;

                    if (pageData != null)
                    {
                        results.Add(pageData);
                    }
                }
            };

            dummy.DataSource = searchDataSource;

            dummy.DataBind();

            return results;
        }
    
posta CarneyCode 26.12.2011 - 10:18
fonte

3 risposte

6

Dato il tuo riferimento a API di terze parti problematiche da cui non puoi semplicemente liberarti, la tua soluzione alternativa è molto simile a Escape Hatch :

Context: You are in a paradigm (e.g. language, runtime environment, scribble on back of envelope) and you need to express or do some thing which does not fit.

Problem: You are being restricted by your current tool set.

Forces: You may not be able to ditch your current tool for various reasons: technical, legal, political or legacy code...

A proposito, se hai un sacco di problemi di questo tipo, prendi in considerazione la possibilità di organizzare un Anticorruption Layer :

If your application needs to deal with a database or another application whose model is undesirable or inapplicable to the model you want within your own application, use an AnticorruptionLayer to translate to/from that model and yours.

    
risposta data 26.12.2011 - 13:26
fonte
1

Non vorrei che fosse conosciuto come schema perché in realtà non è un modello da consigliare in generale.

Dal tuo commento alla risposta di Tom Squires capisco che è per esporre cose in classi di cui tu non sei l'autore. E hai bisogno di un modo per ottenere cose non esposte dagli autori di quelle classi.

Uso TProtectedSomeClass = class(TSomeClass) (Delphi) per ottenere l'accesso ai membri protetti di una classe in librerie che non controllo (anche se ho la fonte). È noto come "hack protetto".

Quello che stai facendo è come un hacking e penso che se dai il nome al pattern sarebbe bello avere "hack" nel nome di esso. "Hacker" sembra carino e breve. : -)

    
risposta data 26.12.2011 - 11:39
fonte
0

Non conosco un pattern anti applicabile. Vorrei solo dire che è un modo arretrato di codifica. Se stai scrivendo un codice del genere, stai utilizzando le classi sbagliate o non capisci la corretta implementazione di quelle classi.

Modifica dai tuoi commenti (non ho capito dalla domanda), sembra che tu stia codificando in questo modo per aggirare le limitazioni di un'API di terze parti. Il termine più appropriato è un "hack". Gli attacchi dovrebbero essere evitati laddove possibile ma chiaramente documentati quando non possono essere evitati.

    
risposta data 26.12.2011 - 11:08
fonte

Leggi altre domande sui tag