pseudo-codice
interface IPagingInfo
{
int CurrentPageNo { get; }
int RowsPerPage { get; }
...
}
interface ResultsRetriver
{
ResultRows GetResults(IPagingInfo pagingInfo);
}
class ANewResultsRetriver : ResultsRetriver
{
ResultRows GetResults(IPagingInfo pagingInfo)
{
// TODO: Retrieve and return all results, ignore pagingInfo.
}
}
Spiegazione
interface ResultsRetriver
esiste da quando conosciamo il tempo. Esistono molte implementazioni di ResultsRetriver
che funzionano felicemente nel sistema. Il nuovo programmatore arriva e ha il compito di scrivere ANewResultsRetriver
. Tuttavia, il suo retriever dei risultati è diverso in quanto non ha un concetto di paging, deve sempre restituire tutti i risultati.
Il programmatore ritiene che la persona che ha scritto interface ResultsRetriver
avrebbe dovuto fornire una versione della chiamata senza il parametro di paging per casi come questo, in cui il parametro non è richiesto. Ora vuole aggiungerlo, un GetResults()
.
Un collega suggerisce che va bene non usare il parametro pagingInfo in questo caso speciale, ma cosa succede se il chiamante invia un pagingInfo valido aspettandosi che i risultati siano conformi al pagingInfo fornito? Quindi ignorare la richiesta dei chiamanti potrebbe non essere prudente. Quindi il collega suggerisce anche di lanciare un PagingNotSupportedException()
per avvisare il chiamante se viene fornito un pagingInfo valido.
Suggerimenti:
- Aggiungi un nuovo metodo
GetResults
aResultsRetriver
che non richiede alcun parametro. Riescializza tutto il codice nell'interfaccia per chiamare la versione corretta in base alla validità di pagingInfo. - Ignora il parametro pagingInfo.
- Ignora il parametro pagingInfo ma lancia un
PagingNotSupportedException()
se viene fornito un parametro pagingInfo valido per avvisare il chiamante del fatto che il parametro verrà ignorato e potrebbe essere necessario aggirare questo problema. - Supponi che ciò che il programmatore sta scrivendo non sia in realtà un
ResultsRetriver
dato cheResultsRetriver
deve supportare il paging con la sua definizione originale. Quindi una nuova interfaccia deve essere definitaNonPagedResultsRetriver
con un metodoGetResults()
senza parametri. Il refactoring per includere questa interfaccia con il codice circostante che attualmente funziona conResultsRetriver
per funzionare anche conNonPagedResultsRetriver
- Qualcos'altro?
Domanda
Qual è la soluzione ottimale e perché?