Один параметр или много - PullRequest
6 голосов
/ 13 апреля 2011

У меня есть два метода:

BuildThing(Thing a);
BuildThings(IEnumerable<Thing> things);

Это хорошо с точки зрения чистого кода?Или, может быть, было бы лучше просто использовать BuildThings и передать IEnumerable только с одной вещью?Или использовать params?

Спасибо.

Ответы [ 6 ]

8 голосов
/ 13 апреля 2011

Есть одна вещь, которую вы можете сделать:

BuildThings(params Thing[] things);

Что позволяет использовать:

BuildThings(thing1, thing2, thing3, ...);
6 голосов
/ 13 апреля 2011

мои личные предпочтения следующие

Интерфейс:

void Build(Thing thing);
void Build(IEnumerable<Thing> things);

реализация:

void Build(Thing thing)
{
    Build(new [] { thing });
}

void Build(IEnumerable<Thing> things)
{
    //do stuff
}

причина, по которой я предпочитаю использовать этот шаблон, заключается в том, что он гарантирует, что вы останетесь DRY , в то же время предоставляя вам возможность иметь несколько перегрузок, в отличие от способа params, где вам придется преобразовывать любые не массив, перечисляемый в массив.

2 голосов
/ 13 апреля 2011

params не будет хорошим решением для ваших методов.

Я думаю, это нормально, если у вас есть 2 или более методов, если у вас есть только одна реализация.

public void BuildThing(Thing a)
{
    this.BuildThings(new List<Thing>(){a});
}
1 голос
/ 13 апреля 2011

Методы, которые вы предоставили, кажутся хорошей практикой. Могут быть разные вещи, которые вы захотите сделать, когда создаете только один экземпляр, а не несколько экземпляров.

Я бы не стал использовать params, потому что это заставляет вас создавать массив, например, если у вас есть список.

0 голосов
/ 13 апреля 2011

Я бы рассмотрел два случая:

  1. чтобы иметь эти два метода, но в BuildThing(Thing a) я бы использовал BuildThings(IEnumerable<Thing> things) и передал бы IEnumerable только с одной вещью
  2. Создайте только один метод с params У этой опции есть один недостаток - вам нужно конвертировать каждые IEnumerable в Array (кроме, конечно, массивов), если вы хотите передать более одного аргумента.

Я бы пошел с params решением, вероятно.

0 голосов
/ 13 апреля 2011

Чисто с точки зрения «чистого кода», это совершенно нормально. Хотя функционально альтернативы могут подходить или не подходить вам лучше. Например, использование params заставляет перечислять коллекцию перед вызовом, а не лениво перечисляться внутри вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...