EDIT 2017/02/13 : controlla il repo come è adesso. Il primo esempio è la soluzione con SRP in mente, ma successivamente introducendo altri principi di SOLID .. Avrei dovuto spiegarlo meglio.
Sto cercando di ottenere un buon esempio su una violazione e su come risolvere il principio SR. Voglio essere sicuro però che sia buono, e che non scrivo nulla che non abbia senso - quindi qualsiasi input è benvenuto, o come potrei spiegarlo meglio. Lo faccio per insegnare a me stesso e capire meglio la "S" di SOLID con la teoria e l'esempio.
Ecco l'esempio: link - o sotto come riferimento.
Principio di responsabilità singola
A class should only have only one reason to change.
Esempio di violazione
La classe Person
è responsabile della detenzione di dati relativi alle persone, ma contiene anche una funzione Format
che emette i dati di questa persona in un determinato formato. Attualmente questo metodo accetta un parametro su cui la funzione decide quale algoritmo utilizzare restituisce i dati nel formato richiesto.
L'esempio di seguito viola il principio di responsabilità singola perché la classe Person
ora è responsabile della conservazione dei dati della persona e formattazione quei dati.
class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public Gender Gender { get; set; }
public DateTime DateOfBirth { get; set; }
public string Format(string formatType) {
switch(formatType) {
case "JSON":
// implement JSON formatting here
return jsonFormattedString;
break;
case "FirstAndLastName":
// implementation of first & lastname formatting here
return firstAndLastNameString;
break;
default:
// implementation of default formatting
return defaultFormattedString;
}
}
}
Come risolvere?
Possiamo risolvere questo problema assicurandoci che la classe Person
sia responsabile solo della conservazione dei dati e non responsabile della formattazione di tali dati. Quindi estraiamo il metodo Format
e introduciamo un'altra classe responsabile della formattazione di un libro.
class PersonFormatter {
public string Format(Person person, string formatType) {
switch(formatType) {
case "JSON":
// implement JSON formatting here
return jsonFormattedString;
break;
case "FirstAndLastName":
// implementation of first & lastname formatting here
return firstAndLastNameString;
break;
default:
// implementation of default formatting
return defaultFormattedString;
}
}
}
class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public Gender Gender { get; set; }
public DateTime DateOfBirth { get; set; }
}
Potremmo sostenere che questo esempio contiene ancora violazioni contro SOLID , e questo è vero. Poiché il metodo format
mantiene ancora troppe responsabilità in quanto deve implementare troppi dettagli su come viene formattato. Lo risolveremo in seguito con uno o più degli altri principi: il principio Inversione dipendenza e il principio Segragation interfaccia . Ma almeno ora possiamo cambiare l'implementazione della formattazione di una Persona senza influenzare la classe Person stessa - come afferma lo SRP.