API中的单一责任原则

时间:2017-02-17 14:02:27

标签: oop design-patterns object-oriented-analysis single-responsibility-principle tell-dont-ask

请看下面这段代码:

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

我们发现大多数消费者首先致电IsCultureSupported来验证他们的文化是否得到支持。如果不支持文化,他们会调用GetFallbackCulture():

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

根据单一责任原则(和其他OOP规则),可以引入一个函数(在ICultureService及其实现中),如:

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

1 个答案:

答案 0 :(得分:0)

  

根据单一责任原则(以及其他OOP规则),可以引入一个函数(在CultureManager中),如:

您所指的是 Tell-Would-Ask 原则,而不是单一责任原则。添加GetFallbackCultureIfInvalid函数实际上使客户端代码更具可读性。您还应该降低IsCultureSupported的可见性,以便客户端代码不再显示此方法。

也就是说,看起来CultureManagerCultureService的实现,所以在GetFallbackCultureIfInvalid中添加一个名为CultureManager的新方法是没有意义的CultureService接口的一部分。您应该做的是坚持GetFallbackCulture中名为CultureManager的单一方法,如果满足所需条件,则让它返回后备文化:

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

    return fallBackCulture;
}