2014-02-05 59 views
4

我有一个方法用于发送GET请求是这样的:我应该违反SOLID中的S还是应该违反DRY原则?

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方法相同,除了另外两行代码在条件语句(“如果Post”)之外,我是违反DRY,因为大部分代码是相同的。

还有第三种方法吗?中间道路?或者我必须在这两个违规之间做出选择?我被困在干燥和固体之间。

+0

有一种方法可以检测到POST或不* *,*会调用其他两种方法之一。 –

+0

您始终可以重构它们都使用的代码。 –

+0

你也可以将你当前的代码分成两种方法;调用你的第一个代码片段(但没有if)POST和另一个GET只有if条件,然后调用POST。如果你不能这样做,通常你会尝试遵循DRY,这是编程的本质。顺便说一下,有一个Stack Exchange网站致力于[代码评论](http://codereview.stackexchange.com/)。 –

回答

9

从更高层次的抽象看它如何?不用担心方法名称中的GETPOST,只需将其称为ProcessRequest即可。在这种情况下,您可能会争辩说SRP仍在被跟踪 - 您的方法正在执行的一件事是处理指定URI中指示的请求 - 而且您没有复制任何代码。

+0

优秀的答案,一个很好的问题!为你+1! – n8wrl

+0

是的,单一职责谈论的目的不是实现这个目的的过程,而这可能需要一个if语句。 –

+0

尽管在这种情况下,你是否这样认为'ProcessRequest'类做得太多了? - 即使在高度抽象的情况下,我通常会将CRUD操作视为单独的单一责任,而不是集体操作。 – anotherdave

相关问题