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 !!