0

S'il vous plaît jeter un oeil à la suite morceau de code:principe de responsabilité unique dans l'API

public interface ICultureService 
{ 
    List<Culture> GetCultures(); 
    bool IsCultureSupported(Culture culture); 
    Culture GetFallbackCulture(); 
} 

Nous avons constaté que la plupart des consommateurs premier appel IsCultureSupported pour valider si leur culture est prise en charge ou non. Et si la culture ne sont pas pris en charge, ils appellent GetFallbackCulture():

public CallingMethod() 
{ 
    if(!cultureManager.IsCultureSupported(currentCulture)) 
    { 
      currentCulture=cultureManager.GetFallbackCulture(); 
    } 
    . 
    . 
    . 
} 

Comme par simple Responsabilité Principe (et d'autres règles oops), est-il autorisé à introduire une fonction (en ICultureService et sa mise en œuvre) comme:

function GetFallbackCultureIfInvalid(Culture culture) 
{ 
    if(this.IsCultureSupported(culture) 
    { 
      return this.FallbackCulture(); 
    } 
} 
+0

1. si (this.IsCultureSupported (culture)!)? – KonstantinL

+0

2. et si c'est supporté? retourner la culture? – KonstantinL

+0

@KonstantinL, Oui, s'il est pris en charge, renvoyer la même chose. – Pragmatic

Répondre

0

comme par simple responsabilité Principe (et d'autres règles oops), est-il correct d'introduire une fonction (en CultureManager) comme:

Qu'est-ce que vous a se référer à est appelé le Tell-Do't-Ask principe plutôt que le Principe de responsabilité unique. L'ajout de la fonction GetFallbackCultureIfInvalid rend le code client plus lisible. Vous devez également réduire la visibilité du IsCultureSupported afin que cette méthode ne soit plus visible pour le code client.

Cela dit, il semble que CultureManager est une implémentation de CultureService il n'a pas de sens d'ajouter une nouvelle méthode nommée GetFallbackCultureIfInvalid dans CultureManager qui ne fait pas partie de l'interface CultureService. Ce que vous devez faire est de coller à une seule méthode appelée GetFallbackCulture en CultureManager et laisser revenir une chute culture en arrière si la condition requise est remplie:

Culture GetFallbackCulture(Culture culture) { 
    Culture fallBackCulture = culture; 
    if(!this.IsCultureSupported(culture) { 
     fallBackCulture = this.FallbackCulture(); 
    } 

    return fallBackCulture; 
} 
+0

CKing, vous avez raison, CultureManager implémentera ICultureServerice et cette méthode sera ajoutée aux deux. La méthode que vous suggérez ne remplit pas l'exigence, nous devons passer la culture et vérifier si cela est supporté, sinon renvoyer le supporté. – Pragmatic

+0

merci pour la réponse mais je ne suis pas convaincu par votre méthode GetFallbackCulture, car son nom suggère que cela retournera FallbackCulture ce qui n'est pas toujours le cas. Il peut retourner la même culture (qui lui est transmise et non la solution de repli). – Pragmatic

+0

@Pragmatic Vous-même. Si j'étais le concepteur d'API, j'aurais une seule méthode et documenterais son comportement comme * Obtient un 'FallbackCulture' si le' culture' n'est pas supporté. Retourne l'argument 'culture' sinon. *. Rarement, vous trouverez des développeurs API créant des méthodes avec des noms 'getSomethingIfInvalid'. – CKing