我应该违反SOLID中的S还是违反DRY原则?

时间:2014-02-05 18:49:05

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

我有一个发送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和SOLID之间。

1 个答案:

答案 0 :(得分:9)

如何从更高级别的抽象中查看它?不要担心它是方法名称中的GET还是POST,而是将其称为ProcessRequest。在这种情况下,您可能会争辩说SRP仍在被遵循 - 您的方法正在做的一件事就是处理给定URI中指示的请求 - 并且您不会复制任何代码。