【发布时间】: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