Лучшая практика для передачи параметров, которые могут принимать два значения - PullRequest
3 голосов
/ 12 июля 2011

Как лучше написать?

public void Foo(bool isStart) {
   // Code [Common]
   if (is Start) {
      // Code [Start]
   } else {
      // Code [End]
   }
   // Code [Common]
}

или

public enum MyEnum {
   Start, End
}
public void Foo(MyEnum param) {
   // Code [Common]
   switch (param) {
      case MyEnum.Start:
         // Code [Start]
         break;
      case MyEnum.End:
         // Code [End]
         break;
   }
   // Code [Common]
}

Обновление: Я ищу небольшое решение. Части "Common", "Start" и "End" очень короткие, я не хочу разбивать Foo на несколько методов.

Ответы [ 5 ]

9 голосов
/ 12 июля 2011

Как насчет:

public class Foo
{
    public void Start()
    {
        PreCommon();

        // Code [Start]

        PostCommon();
    }

    public void Stop()
    {
        PreCommon();

        // Code [Stop]

        PostCommon();
    }

    private void PreCommon()
    {
        // Code [Pre-Common]
    }  

    private void PostCommon()
    {
        // Code [Post-Common]
    }    
    ...

}

Методы с единственной ответственностью легче читать, легче понимать и легче поддерживать.

1 голос
/ 12 июля 2011

Как насчет этого ↓

abstract class FooBase
{
    public abstract void DoSomthingBegin();
    public abstract void DoSomthingEnd();

    public void Foo()
    {
        // Code [Common]
        DoSomthingBegin();
        DoSomthingEnd();
        // Code [Common]
    }
}

class FooBegin : FooBase
{
    public override void DoSomthingBegin()
    {
        Console.WriteLine("OnBegin");
    }
}

class FooEnd : FooBase
{
    public override void DoSomthingBegin()
    {
        Console.WriteLine("OnEnd");
    }
}
1 голос
/ 12 июля 2011

Мое эмпирическое правило состоит в том, чтобы занять несколько минут, когда я попаду в эту ситуацию, и действительно подумать, смогу ли я сделать обоснование в будущих сценариях или версиях для 3-го случая (требуя перечисления или совершенно нового типа). Если я не могу вспомнить третий случай, я всегда использую bool, потому что их проще всего тестировать.

Я всегда называю с положительной стороны вещи и начинаю имя свойства с формы «быть» ... такой как «IsActive» или «HasChildren»

1 голос
/ 12 июля 2011

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

Вот еще один вариант. Хорошо работает, если у вас есть более двух вариантов кода для работы (если это было вашей целью перечисления).

public void Foo(Action unique)
{
   // Code [Common]
   unique();
   // Code [Common]
}

private void StartCode()
{
    // Code [Start]
}

private void EndCode()
{
    // Code [End]
}

// call it
Foo(StartCode);
1 голос
/ 12 июля 2011

это зависит только от ситуации и вашего подхода. например, YAGNI говорит, что вам не понадобится enum, так что вы можете придерживаться bool. но опять же, если вы знаете, что вам это понадобится, или думаете, что вам это может понадобиться, то, вероятно, второй путь. ИЛИ на самом деле, если вы хотите чего-то более выразительного, мне больше нравится второй способ, потому что он делает для вызывающего абонента очевидным то, что устанавливается; true / false не так описательно, как MyEnum.Start и MyEnum.Stop.

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