Как правильно цеплять методы в .Net? - PullRequest
3 голосов
/ 14 июля 2011

В .Net вы можете связывать методы, возвращающие значение, или используя void. Является ли один из них «правильным путем»?

Так что вы могли бы сказать

1)

Foo myFoo = new Foo();
myfoo.Bars = 
  myBars.DoSomethingCool(x)
  .DoSomethingElse(y)
  .AndSomethingElse(z);

public static IList<IBar> DoSomethingCool(this IList<IBar> source, object x)
{
  IList<IBar> result = //some fn(source)
  return result;
}

В этом случае все 3 метода расширения должны возвращать IList (тип для myFoo.Bars)

или это также может быть записано как

2)

myBars.DoSomethingCool(x)
.DoSomethingElse(y)
.AndSomethingElse(z);

public static void DoSomethingCool(this IList<IBar> source, object x)
{
  //Modify source
  source = //some fn(source)
  //Don't return anything
}

в этом случае методы расширения возвращают пустоту, но выполняют ли работу входящий исходный объект?

ОБНОВЛЕНИЕ В своем ответе Саймон был прав, что 2) не скомпилируется. Вот как это можно переписать:

DoSomethingCool(myBars)
.DoSomethingElse(myBars)
.AndSomethingElse(myBars);

myBars будет меняться внутри вызова каждого метода, а методы будут возвращать void.

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

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

Замечания по поводу проблемы отладки цепочек - это то, что нужно учитывать, хотя я считаю, что цепочки особенно полезны при фильтрации.

mybars.FilterByHasHappyHour() намного лучше, чем

BigGiantUtilityClass.GetBarsWithHappyHours(myBars)
0 голосов
/ 14 июля 2011

В обоих случаях вы используете метод расширения, возвращаете объект, а затем используете этот объект в качестве входных данных для следующего метода в цепочке.Второй пример близок к Свободному интерфейсу (но не совсем).Я думаю, что в ваших двух примерах критическое различие заключается в изменчивости.Вы хотите изменить исходный ввод (второй пример) или нет (первый пример)?«Правильный» ответ зависит от ситуации и контекста.

...