Принцип единой ответственности в 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();
     }
}

comment
1. if( ! this.IsCultureSupported(culture)) ?   -  person KonstantinL    schedule 17.02.2017
comment
2. а что если поддерживается? вернуть культуру?   -  person KonstantinL    schedule 17.02.2017
comment
@KonstantinL, Да, если поддерживается, верните то же самое.   -  person Pragmatic    schedule 17.02.2017
comment
Вы должны исправить это в своем вопросе (и добавить отступ). +++ В общем, я бы посоветовал не заходить слишком далеко ни в каких принципах. Это ICultureService, поэтому SRP говорит мне, что занимается всем культурным управлением (и ничем другим). Это не запрещает мне добавлять методы. Это только запрещает решать вопросы, не связанные напрямую.   -  person maaartinus    schedule 17.02.2017
comment
@Pragmatic Вы, кажется, достаточно взрослый участник, чтобы знать, что вы можете голосовать и принимать ответы, которые вам помогли. Пожалуйста, оставьте комментарий к моему ответу, если вам нужны дополнительные разъяснения. Честно говоря, в этом вопросе много недостающей информации, но я попытался дать вам разумный ответ со всей недостающей информацией.   -  person CKing    schedule 21.02.2017


Ответы (1)


В соответствии с принципом единой ответственности (и другими правилами ООП) можно ли ввести функцию (в CultureManager), например:

То, о чем вы говорите, называется принципом Говори-не-спрашивай, а не принципом единой ответственности. Добавление функции 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;
}
person CKing    schedule 17.02.2017
comment
CKing, вы правы, CultureManager реализует ICultureServerice, и этот метод будет добавлен к ним обоим. Метод, который вы предлагаете, не соответствует требованию, нам нужно передать культуру и проверить, поддерживается ли он, если не вернуть поддерживаемый. - person Pragmatic; 17.02.2017
comment
спасибо за ответ, но я не уверен в вашем методе GetFallbackCulture, так как название предполагает, что он вернет FallbackCulture, что не всегда так. Он может вернуть ту же культуру (которая передается ему, а не резервную). - person Pragmatic; 25.02.2017
comment
@Pragmatic Подойди себе. Если бы я был разработчиком API, у меня был бы один метод, и я бы задокументировал его поведение как Получает FallbackCulture, если culture не поддерживается. В противном случае возвращает аргумент culture.. Редко вы встретите разработчиков API, создающих методы с именами getSomethingIfInvalid. - person CKing; 25.02.2017