我有一种发送 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;
}

...我改变了它来处理 POST 请求,方法是将它夹在 webRequest 和 webResponse 的分配之间:
if (uri.ToUpper().Contains("POST"))
{
    webRequest.Method = "POST";
    webRequest.ContentLength = 0;
}

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

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

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

有没有第三种方式?中道?或者我必须在这两种违规行为之间做出选择?我被困在干燥和坚固的地方之间。

最佳答案

从更高的抽象层次来看它怎么样?不用担心它是方法名称中的 GET 还是 POST ,只需将其称为 ProcessRequest 。在这种情况下,您可能会争辩说仍然遵循 SRP - 您的方法所做的唯一一件事就是处理给定 URI 中指示的请求 - 您没有复制任何代码。

关于c# - 我应该违反 SOLID 中的 S 还是违反 DRY 原则?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21585889/

10-10 09:35