2014-02-05 53 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

相關問題