2012-05-10 3 views
0

Данный метод веб-сервиса:Есть ли смысл в таком рефакторинге?

public void FindSomeEntities(int? Id, string param1, int? param2, ...) 

Refactored:

public void FindSomeEntities(SelectionParameters selectionParameters) 

class SelectionParameters 
{ 
    public int? Id; 
    public string param1; 
    public int? param2 
    ... 
} 

Плюсы:

  1. слишком много параметров в методе оригинальный веб-сервиса сводится к только один
  2. если есть необходимо изменить, нам не нужно будет менять интервал между е метода - только определение SelectionParameters

Минусы:

  1. SelectionParameters класса не любой бизнес-ценность - он используется только в качестве вспомогательного класса и используется в одном методе. В результате у нас будет есть много методов с 1 параметром и много одноразовых классов
  2. На самом деле интерфейс IS изменен, мы просто немного изменим эти изменения глубже.
+1

Я бы предпочел избегать рефакторинга, так как это ** будет болезненным для будущего в будущем.Когда дело доходит до веб-сервисов, imho больше, более простые (int, string ...) параметры лучше, чем меньше, сложные (пользовательские «контейнерные» классы). – Alex

+0

Вот почему я задал этот вопрос: так как для меня нет смысла это делать, и я пытался убедить своего коллегу – Dima

ответ

2

Этот рефакторинг называется Introduce Parameter Object. Вероятно, будет хорошей идеей, если параметры естественно связаны друг с другом, и особенно если они часто используются вместе как списки параметров для нескольких методов.

2

Я не уверен, что в этом рефакторинге есть большая ценность, потому что, как вы говорите, количество поддерживающих классов будет/может быть болью для поддержания и обслуживания других целей.

Если параметры имеют различные цели, например, в вашем примере «ID», тогда я бы подумал, что было бы разумно держать их в отдельности, чтобы было легко идентифицировать их и что вы хотите с ними делать в способ корпус.

Если же ваш PARAMS лишь набор значений, которые выполняют аналогичную/один и ту же функцию в теле метода, вы можете взглянуть на использование params ключевого слова и определить свой метод как это:

public void FindSomeEnteties(params object[] theParameters) 

Это зависит хотите ли вы выкопать массив, чтобы вытащить индекс 0 и рассматривать его как идентификатор и т. д. и т. д., или ваш метод просто хочет сделать то же самое со всеми переданными параметрами.

0

Если есть основания полагать, что один и тот же (дополнительный) набор параметров используется другими веб-службами, это разумно.

Независимо от того, выполняете ли вы это, у вас есть структура defacto как список аргументов. Это наблюдение реализовано на нашем языке программирования PARLANSE, который всегда имеет один аргумент для функции, названный '?' (вроде «я» в OO). Этот аргумент имеет тип; это может быть скалярная или сложная переменная (int или string), или она может быть структурой. Обычно определяется структура с помощью объявления структуры; в PARLANSE, писать то, что кажется множественным аргументом, неявно определяет структуру. В тех случаях, когда список аргументов передается дочерней функции, можно просто вызвать эту дочернюю функцию на '?' и передается весь список аргументов.

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