#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
@interface Spreadsheet : NSObject
- (void)loadFromURL:(NSURL *)url;
- (void)saveToURL:(NSURL *)url;
- (void)drawTo:(CGRect*)targetArea withContext:(CGContextRef *)context;
@end
Je dirais que l'exemple ci-dessus constitue une violation de la SRP. À première vue, il est clair que la classe est responsable d'une chose: les feuilles de calcul. Il se distingue des autres entités du domaine du problème de gestion de documents, telles que le traitement de texte. Cependant, considérez les raisons pour lesquelles l'objet Spreadsheet pourrait changer.
Il se peut que le modèle sous-tendant la feuille de calcul soit modifié. Cela affecte le chargement et le code de sauvegarde mais n'a aucune incidence sur la façon dont la feuille de calcul est dessinée. Les responsabilités de chargement/sauvegarde sont donc distinctes des responsabilités de dessin. Notre classe a deux responsabilités. Donc, si nous pensons à toutes les raisons raisonnablement prévisibles de changer de classe et que seules les méthodes particulières de la classe seraient affectées, nous voyons une opportunité d'éliminer la responsabilité d'obtenir une classe plus ciblée.
Une classe révisée serait:
@interface SpreadsheetEncoder
- (NSData *)encodedSpreadsheet:(Spreadsheet *)spreadsheet;
- (Spreadsheet *)spreadsheetFromEncodedData:(NSData *)data;
@end
@interface Spreadsheet2 : NSObject
- (NSData *)data;
- (instancetype)initSpreadsheetFromData:(NSData *)data;
- (void)drawTo:(CGRect*)targetArea withContext:(CGContextRef *)context;
@end
Comme les progrès de développement de produits, nous pouvons nous demander à nouveau « ce qui pourrait changer » et factoriser alors les classes pour les garder responsables pour une seule préoccupation. SRP est seulement relatif au domaine du problème et à notre compréhension de celui-ci à un moment donné.
SRP, à mon avis, se résume à demander «qu'est-ce qui peut changer? et "qu'est-ce qui serait affecté". Lorsque «ce qui peut changer» ne concerne qu'une seule chose qui est affectée, vous avez des classes qui appliquent le principe SRP.