【问题标题】:Single responsibility principle in APIAPI中的单一职责原则
【发布时间】:2017-02-17 14:02:26
【问题描述】:

请看下面的代码:

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. if( ! this.IsCultureSupported(culture)) ?
  • 2.如果支持怎么办?回归文化?
  • @KonstantinL,是的,如果支持,返回相同的。
  • 你应该在你的问题中修复它(并添加缩进)。 +++ 一般来说,我建议不要采取任何原则。这是ICultureService,所以 SRP 告诉我“它负责所有的文化管理(仅此而已)”。它并不禁止我添加方法。它只禁止直接处理不相关的问题。
  • @Pragmatic 您似乎是一个足够大的成员,知道您可以投票并接受对您有帮助的答案。如果您需要进一步说明,请对我的回答发表评论。老实说,这个问题有很多缺失的信息,但我试图用所有缺失的信息给你一个合理的答案。

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


【解决方案1】:

根据单一职责原则(和其他 OOP 规则),是否可以(在 CultureManager 中)引入如下功能:

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

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

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

    return fallBackCulture;
}

【讨论】:

  • CKing,你是对的,CultureManager 将实现 ICultureServerice,并且此方法将添加到它们两者中。您建议的方法不满足要求,我们需要通过文化并检查是否支持,如果不支持则返回。
  • 感谢您的回答,但我不相信您的方法 GetFallbackCulture,顾名思义,这将返回 FallbackCulture,但并非总是如此。它可以返回相同的文化(传递给它而不是后备文化)。
  • @Pragmatic 适合自己。如果我是 API 设计者,如果不支持 culture,我将有一个方法并将其行为记录为 Gets a FallbackCulture。否则返回 culture 参数。。您很少会发现 API 开发人员创建名称为 getSomethingIfInvalid 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2011-11-16
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多