0

Пожалуйста, обратите внимание на следующий фрагмент кода:единый принцип ответственности в API

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

Мы обнаружили, что большинство потребителей первого называют IsCultureSupported для проверки, если их культура поддерживается или нет. И если культура не поддерживается, они называют GetFallbackCulture():

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

В соответствии с единой ответственности Принцип (и другие правила упс), это нормально, чтобы ввести функцию (в ICultureService и ее реализации), как:

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

1. если (this.IsCultureSupported (культура)!)? – KonstantinL

+0

2. а что, если он поддерживается? культура возвращения? – KonstantinL

+0

@KonstantinL, Да, если поддерживается, верните то же самое. – Pragmatic

ответ

0

в соответствии с единой ответственности Принцип (и другие правила упс), это нормально, чтобы ввести функцию (в CultureManager) как:

Что вы в re refer to to называется Принцип Tell-Don't-Ask, а не Одинокий принцип ответственности. Добавление функции GetFallbackCultureIfInvalid делает код клиента более удобочитаемым. Вы также должны уменьшить видимость IsCultureSupported, чтобы этот метод больше не был виден для кода клиента.

Тем не менее, это выглядит как CultureManager является реализация CultureService поэтому не имеет смысла, чтобы добавить новый метод, названный GetFallbackCultureIfInvalid в CultureManager, который не является частью CultureService интерфейса. То, что вы должны сделать, это придерживаться одного метода, называемого GetFallbackCulture в CultureManager и пусть возвращают падение назад культуру, если требуемое условие:

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

    return fallBackCulture; 
} 
+0

CKing, вы правы, CultureManager будет реализовывать ICultureServerice, и этот метод будет добавлен к обоим. Метод, который вы предлагаете, не соответствует требованию, нам нужно передать культуру и проверить, поддерживается ли это, если не вернуть поддерживаемый. – Pragmatic

+0

спасибо за ответ, но я не убежден в вашем методе GetFallbackCulture, поскольку название предполагает, что это вернет FallbackCulture, что не всегда так. Он может возвращать ту же культуру (которая передается ему, а не резервная). – Pragmatic

+0

@ Прагматический костюм. Если бы я был дизайнером API, у меня был бы единственный метод и документировал бы его поведение как * Получает 'FallbackCulture', если' культура' не поддерживается. Возвращает аргумент 'культура' в противном случае. *. Редко вы найдете разработчиков API, создающих методы с именами 'getSomethingIfInvalid'. – CKing