Come applicare il principio della responsabilità unica se il programma dovrebbe fare un sacco di cose?

4

Se ho bisogno di scrivere un programma che

  1. Legge un file json
  2. Converte i suoi dati in yaml
  3. Scriverlo sul file yaml

e aderendo al principio di responsabilità singola creo classi come

  1. FileReader
  2. JsonToYamlConverter
  3. FileWriter

tutto sembra a posto, ma poi ho bisogno di creare una classe per invocare tutte queste classi, non violerebbe il principio di responsabilità singola?

    
posta Bob 31.08.2017 - 21:49
fonte

3 risposte

13

Il modo migliore per capire l'SRP è lavorare sull'interpretazione della "responsabilità" come "qualcosa che qualche forza esterna al programma potrebbe causare il bisogno di cambiare". In questo caso, è difficile capire perché il tuo modulo che combina le tue tre classi possa essere modificato diversamente da una modifica completa di ciò che effettivamente fa il programma, che a mio avviso è solo un motivo per cambiare.

Ora, il tuo JsonToYamlConverter però: questo ha 2 ragioni per cambiare: il formato di input può essere cambiato da JSON a qualcos'altro, o il formato di output può essere cambiato da YAML a qualcos'altro. La soluzione migliore sarebbe utilizzare un JsonReader per produrre una struttura di oggetti e un YamlWriter per consumarlo.

    
risposta data 01.09.2017 - 00:18
fonte
1

Sì.

Ma possiamo aggirare il problema dicendo che la responsabilità del programma è quella di garantire che X, Y e Z vengano eseguiti nell'ordine corretto, passando le informazioni da una alla successiva

Non gli importa come vengono raggiunti, cioè la responsabilità delle singole classi. Si interessa solo di "l'orchestrazione" dei compiti.

    
risposta data 01.09.2017 - 00:08
fonte
1

"but then I need to create some class to invoke all these classes, wouldn't it violate the single responsibility principle?"

Penso di vedere qual è la causa della tua confusione; questo non è di per sé una violazione dell'SRP, perché la classe introdotta di recente è non effettivamente responsabile per i comportamenti implementati dalle altre classi.

Riceve semplicemente alcune richieste di alto livello e inoltra (parti di) il lavoro a quelle altre classi. La sua responsabilità è di coordinare la loro interazione in qualche modo.

Una delle motivazioni chiave alla base di SRP è evitare interdipendenze tra parti del codice che gestiscono ogni responsabilità (se è tutto nella stessa classe, il codice può essere ingarbugliato in modi sottili). Avere a disposizione interfacce pubbliche separate e ben definite 1 aiuta, poiché nasconde i dettagli dell'implementazione e limita / struttura i modi in cui queste classi possono interagire - in modo che una richiesta di modifica che riguarda solo una delle le classi hanno un effetto limitato (o, idealmente, nessun effetto) sugli altri.

1 Non intendo necessariamente tipi di interfaccia C # o Java.

    
risposta data 01.09.2017 - 15:10
fonte

Leggi altre domande sui tag