Delega pattern per il recupero dei dati v.s. usando semplici setter

2

Sto prendendo in considerazione l'utilizzo del Delegate Pattern per ottenere alcuni dati necessari per un'operazione. Ci sono alcune diverse parti di dati che l'algoritmo deve eseguire, ma hanno tutti valori predefiniti che possono essere utilizzati se non sono impostati in modo esplicito.

Se dovessi usare lo schema delegato, definirei un'interfaccia che definisca una funzione per ogni informazione che l'algoritmo dovrebbe utilizzare per recuperare i dati quando necessario.

L'altra opzione che vedo è di avere setter sull'oggetto dell'algoritmo in modo tale che tali proprietà possano essere impostate esplicitamente invece di aspettare che venga richiesta tramite il pattern delegato.

Ci sono molti vantaggi nell'usare il modello delegato, ma sento che molti di loro non si applicano realmente alla mia situazione. Una delle cose più importanti è che elimina la necessità di creare sottoclassi specializzate dell'oggetto, ma nel mio caso, l'uso dei setter rimuove anche questa necessità.

Inoltre, il modello delegato consente il riutilizzo di delegati come "configurazioni". Se utilizzo i setter, tutto dovrà essere impostato in modo esplicito ogni volta che si riconfigura (invece di cambiare semplicemente delegati in giro).

Mi piacerebbe decisamente orientarmi verso l'utilizzo del modello delegato, il mio unico problema è che questa è un'interfaccia pubblica che verrà utilizzata da persone che non hanno necessariamente familiarità con lo schema. Sento che usare i setter sarebbe un modo più naturale per qualcuno di farlo senza conoscere i modelli di design.

Un esempio molto semplice di ciò che sto cercando di fare sarebbe il seguente:

Ho un algoritmo che determinerà se un certo intervallo di caratteri esce da una stringa. Le opzioni configurabili dell'algoritmo sono:

  • Primo carattere (ad esempio "k")
  • Ultimo carattere (ad es. "p" farà in modo che cerchi k, l, m, n, o e p)
  • numero di caratteri fuori intervallo che devono corrispondere

Quindi, se ho la stringa "overflow dello stack" che cerca con un intervallo di caratteri "kp" che richiede la corrispondenza di almeno 4 caratteri, dovrebbe restituire true perché contiene "k", "o", "l" e "o".

Usando il pattern delegato questo sembrerebbe questo (non necessariamente il più efficiente):

char startRange = delegate.startChar();
char endRange = delegate.endChar();
int targetCount = delegate.charCount();
int currentCount = 0;
for( char c in targetString )
{
   if( c >= startRange && c <= endRange )
   {
       currentCount++;
       if( currentCount == targetCount )
            return true;
   }
}
return false;

Altrimenti l'algoritmo richiederebbe che le funzioni membro e le variabili siano definite per impostare e memorizzare tali valori. L'algoritmo sarebbe simile a questo.

int currentCount = 0;
for( char c in targetString )
{
   if( c >= mStartRange && c <= mEndRange )
   {
       currentCount++;
       if( currentCount == mTargetCount )
            return true;
   }
}
return false;

Le variabili possono o non possono essere cambiate spesso, e ci sarà sicuramente un riutilizzo di quelle configurazioni variabili.

Ci sono dei vantaggi del modello delegato che mi manca? Ci sono degli svantaggi nell'usare setter che mi manca? Altri commenti o suggerimenti?

Grazie !!

    
posta drewag 28.04.2011 - 03:32
fonte

2 risposte

1

link

Di fronte a questo tipo di decisione progettuale, fai sempre quanto segue.

  1. Scrivi test unitari per la cosa più semplice e concreta che funzionerà.

  2. Scrivi la cosa più semplice e concreta che funzioni.

  3. Aggiungi commenti per alcune alternative che potrebbero essere utili in un potenziale futuro.

Smetti di risolvere questo problema e vai avanti. Non esagerare.

Finché non sei costretto ad usare la soluzione più complessa, evitala.

Finché non hai tre posizioni che possono essere combinate, non sprecare troppo tempo nel refactoring. Due copie del codice simile non sono un peccato. (Copia e incolla di codice identico è sempre malvagia.) Una terza copia del codice simile significa che il refactoring potrebbe essere in ordine.

    
risposta data 28.04.2011 - 12:15
fonte
0

Non penso che questa sia una buona applicazione del modello delegato. Sembra che tu stia utilizzando i delegati per fornire un semplice dato, questo è eccessivo. Normalmente si usano i delegati quando è necessario fornire funzionalità . Quindi, segui il semplice approccio basato sulla proprietà qui penso.

    
risposta data 28.04.2011 - 12:25
fonte

Leggi altre domande sui tag