C # Отмена метода через вызов метода - PullRequest
0 голосов
/ 23 ноября 2018

Hello StackOver Community,

У меня есть следующий c # -код

void foo(int x)
{
  if(x<=0)
     {
       return;
     }
  do something more...
     .
     .
     .
}

Я хочу избавиться от оператора if, вызвав функцию, которая "вернет" мою функцию fooесли выполнено условие x <= 0. </p>

То есть

void foo(int x)
{
  TerminateIfNegative(x);

  do something more...
     .
     .
     .
}

private ???? TerminateIfNegative(int a)
{
    if (a<=0)
    {
         "Make the method which called me "return" at the place I was called"
    }
}

Надеюсь, что-то понятно, что я хочу сделать.У кого-нибудь есть идея?

Приветствия,

Флориан

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

На самом деле есть решение для этого.И довольно уродливый.Я знаю, что, вероятно, никто не согласится с тем, что это следует использовать, но я все равно представлю это.Здесь у вас есть печально известное решение goto:

void foo(int x)
{
  TerminateIfNegative(x);

  do something more...
     .
     .
     .

  EndOfFoo:
}

private void TerminateIfNegative(int a)
{
    if (a<=0)
    {
         goto EndOfFoo;
    }
}
0 голосов
/ 23 ноября 2018

Поведение, которое вы запрашиваете, распространено в процедурном программировании, где у вас есть общий линейный программный поток от самой первой строки до самой последней.Это будет применяться к построчному выполнению, а это не то, о чем ООП.Есть веские причины, по которым мы обычно не рекомендуем использовать goto и другие вещи, которые контролируют ход программы, поскольку это усложнит отслеживание вашего кода, например, при отладке.На самом деле это приводит к спагетти-коду.

Представьте, что вы хотите отладить приложение через несколько месяцев.Вы перебираете свой код до тех пор, пока не достигнете Foo, войдете в него, чтобы понять, что он делает, и - ооо, что это такое - ваш отладчик выпрыгивает из Foo по любой причине.Совершенно неясно , почему метод просто останавливает свое выполнение.

То, что вы, похоже, действительно хотите, - это выполнить некоторые проверки вашего пользовательского ввода.Поэтому, если ваш пользователь вводит отрицательное число, ваша программа должна остановиться.В этом случае можно просто сгенерировать исключение, которое в основном указывает на то, что метод не может делать то, что должен делать.Вы можете просто создать какой-нибудь Validate -метод, который генерирует исключение для недействительного ввода:

void Validate(int x)
{
    if(x <= 0) 
        throw new InvalidArgumentException("x must not be negative");
}

Это оставляет вызывающему методу метод обработки ошибки.Таким образом, ваш Validate -метод просто проверяет ввод.Он не должен завершать вызывающий метод, который нарушил бы принцип единственной ответственности, не так ли?

Однако создание исключения в вашем случае кажется чем-то вроде взятия кувалды всломать орехСамый простой и чистый способ - делать именно то, что вы хотите избежать.Иметь оператор if, который завершает foo, если ввод неверен:

void foo()
{
    if(!Validate(x))
        return;
}
bool Validate(int x)
{
    return x > 0;
}
0 голосов
/ 23 ноября 2018

Когда тип возвращаемого метода - void, этот метод ничего не возвращает.Есть только следующие опции, чтобы остановить выполнение команд внутри метода void:

  • Бросить исключение
  • Использовать return; (что является наиболее распространенным способом)

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

...