我有一个发送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之间。
答案 0 :(得分:9)
如何从更高级别的抽象中查看它?不要担心它是方法名称中的GET
还是POST
,而是将其称为ProcessRequest
。在这种情况下,您可能会争辩说SRP仍在被遵循 - 您的方法正在做的一件事就是处理给定URI中指示的请求 - 并且您不会复制任何代码。