repository Cache che viola l'SRP [chiuso]

-5
interface IRepository {
  Data getData();
}

class BaseRepository implements IRepository {
  public Data getData() {
    ...
  }
}

class CacheRepository implements IRepository {
  private final IRepository mRepository;
  private final ICache mCache;

  public CacheRepository(IRepository repository, ICache cache) {
    mRepository = repository;
    mCache = cache;
  }

  public Data getData() {
    Data data = cache.getData();

    if (data == null)
      data = mRepository.getData();

    mCache.setData(data);
  }
}

Il CacheRepository fa due cose, usa la cache e ottiene i dati. Come migliorarlo?

    
posta Алексей Мальченко 04.05.2016 - 18:26
fonte

2 risposte

4

Migliora la tua vita usando il buon senso.

"Responsabilità singola" significa responsabilità per un insieme di cose correlate. Come il custode di una scuola ha la sola responsabilità di prendersi cura della scuola, che consiste in milioni di miliardi di piccole cose.

Vedi qualcosa di negativo con questa cache oltre alla tua violazione percepita di una regola? Questa classe ha la sola responsabilità di fornire dati. Il caching è un dettaglio di implementazione.

    
risposta data 04.05.2016 - 18:33
fonte
0

Penso che questo soddisfi gli SRP in virtù del suo unico metodo pubblico

public Data getData();

Come fa questo (per collaborazione tra una cache e un repository) non sembra irragionevole. Nessuno dei due è esposto pubblicamente tramite l'interfaccia CacheRepository . Si potrebbe sostenere che chiamarlo CacheRepository in qualche modo esponga la sua funzionalità. Non vorrei, ma probabilmente passerei dei riferimenti a questo come IRepository - il caching sarebbe un miglioramento delle prestazioni e nella maggior parte dei casi non interessa il codice del client in termini di funzionalità.

    
risposta data 04.05.2016 - 19:14
fonte