2014-02-05 4 views
4

я имел метод для отправки запросов GET, как это:Должен ли я нарушать S в SOLID или я должен нарушать принцип 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, за исключением дополнительных двух строк кода, которые в противном случае являются условными («если сообщение»), я нарушая DRY, поскольку большая часть кода такая же.

Есть ли третий способ? Средний путь? Или я должен выбирать между этими двумя нарушениями? Я застрял между сухим и твердым местом.

+0

Имейте метод, который обнаруживает POST или нет, и *, который * будет вызывать один из двух других методов. –

+0

Вы всегда можете реорганизовать код, который они используют. –

+0

Вы также можете разделить текущий код на два метода; Вызовите свой первый фрагмент (но без if) POST, а другой GET - только с условием if, после которого следует вызов POST. Если вы не можете этого сделать, обычно вы пытаетесь следовать DRY, это суть программирования. И, кстати, есть веб-сайт Stack Exchange, посвященный [обзорам кода] (http://codereview.stackexchange.com/). –

ответ

9

Как насчет того, чтобы смотреть на него с более высокого уровня абстракции? Вместо того, чтобы беспокоиться о том, является ли это GET или POST в имени метода, просто назовите его чем-то вроде ProcessRequest. В этом случае вы можете утверждать, что SRP по-прежнему соблюдается - единственное, что делает ваш метод, это обработка запроса, указанного в данном URI, - и вы не дублируете какой-либо код.

+0

Отличный ответ на отличный вопрос! +1 для вас обоих! – n8wrl

+0

Да, единственная ответственность говорит о цели не процесса, с помощью которого эта цель выполнена, что может потребовать утверждение if. –

+0

В этом случае, не так ли, что класс 'ProcessRequest' делает слишком много? - Даже при высоком уровне абстракции я обычно рассматривал операции CRUD как отдельные обязанности индивидуально, а не коллективно. – anotherdave

Смежные вопросы