【问题标题】:Should I violate the S in SOLID or should I violate the DRY Principle?我应该违反 SOLID 中的 S 还是应该违反 DRY 原则?
【发布时间】:2014-02-05 18:49:05
【问题描述】:

我有一种发送 GET 请求的方法,如下所示:

private JArray GetRESTData(string uri)
{
    try
    {
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        var webResponse = (HttpWebResponse)webRequest.GetResponse();
        var reader = new StreamReader(webResponse.GetResponseStream());
        string s = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<JArray>(s);
    }
    catch // This method crashes if only one json "record" is found - try this:
    {
        try
        {
            MessageBox.Show(GetScalarVal(uri));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    return null;
}

...我通过在 webRequest 和 webResponse 的分配之间进行修改来处理 POST 请求:

if (uri.ToUpper().Contains("POST"))
{
    webRequest.Method = "POST";
    webRequest.ContentLength = 0;
}

...并将其重命名为 GetOrPostRESTData()

但这违反了单一职责原则。

但是,如果我将其分为两个方法,POST 方法与 GET 方法相同,除了在条件(“if Post”)中的另外两行代码之外,我违反了DRY,因为大部分代码都是一样的。

还有第三种方法吗?中路?还是我必须在这两种违规行为之间做出选择?我被困在一个干燥的地方和一个坚实的地方之间。

【问题讨论】:

  • 有一个方法可以检测 POST 与否,并且 那个 会调用其他两种方法之一。
  • 你可以随时重构他们都使用的代码。
  • 您还可以将当前代码拆分为两种方法;调用你的第一个 sn-p(但没有 if)POST 和另一个只有 if 条件的 GET,然后调用 POST。如果你做不到,通常你会尝试遵循 DRY,这是编程的精髓。顺便说一下,有一个 Stack Exchange 网站专门用于 code reviews。

标签: c# dry solid-principles single-responsibility-principle


【解决方案1】:

如果从更高的抽象层次来看待它呢?不必担心方法名称中是GET 还是POST,只需将其命名为ProcessRequest 之类的名称即可。在这种情况下,您可能会争辩说 SRP 仍在被遵循 - 您的方法正在做的一件事就是处理给定 URI 中指示的请求 - 而且您没有复制任何代码。

【讨论】:

  • 是的,单一职责是关于目的,而不是实现该目的的过程,这可能需要一个 if 语句。
  • 在这种情况下,你不觉得ProcessRequest 类做得太多了吗? — 即使在高度抽象的情况下,我通常也会将 CRUD 操作视为单个职责,而不是集体职责。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2014-02-15
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多