我有一个发送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(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,大部分代码都是一样的.
还有第三种方式吗?中途?或者我必须在这两种违规行为中做出选择 我被困在DRY和SOLID之间.
如何从更高级别的抽象中查看它?不要担心它是a GET
还是POST
在方法名称中,只需称之为ProcessRequest
.在这种情况下,您可能会争辩说SRP仍然被遵循 - 您的方法正在做的一件事就是处理给定URI中指示的请求 - 并且您不会复制任何代码.