Событие не запускается через домен приложений

У меня много проблем с AppDomains. В настоящее время у меня есть AppDomain, содержащий элементы управления камерой, и я пытаюсь, чтобы события из этого вторичного AppDomain (например, снимок) возвращались в основную программу. Кажется, все настроено правильно (события зарегистрированы, функции будут выполняться через границы домена), но когда я пытаюсь вызвать, ничего не происходит. {if (temp <32) вернуть «Замораживание»; иначе if (temp <60) возвращает «Brr»; else if (temp <80) return "...

Код:

public String getTemperatureMessage(double temp)
{
    if(temp < 32)
        return "Freezing";
    else if(temp < 60)
        return "Brr";
    else if(temp < 80)
        return "Comfortable";
    else
        return "Too hot";
}

Что касается приведенного выше фрагмента кода, то if if технически излишни и совсем не меняют поведение. Однако я склонен вставьте их туда, чтобы подчеркнуть, что условия являются исключительными. Каковы ваши мысли? Ненужные или более ясные?

9
задан 10 revs, 7 users 54% 26 August 2010 в 22:11
поделиться

13 ответов

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

С моей точки зрения, if/else if действительно важно, потому что даже если в вашем случае вы вернете какое-то значение, удаление остальных будет означать, что вы все равно их не поставите, и это означало бы совершенно другое дело, если бы возвратов не было здесь.

Кроме того, представьте, что когда-нибудь кто-то захочет отредактировать ваш код и очистить его для одного возврата, этот человек может неправильно понять ваш код и сделать серьезную ошибку, подобную этой:

public String getTemperatureMessage(double temp){
    String message;
    if(temp < 32)
        message = "Freezing";
    if(temp < 60)
        message = "Brr";
    if(temp < 80)
        message = "Comfortable";
    else 
        message = "Too hot";
    return message;
}

Чтобы прояснить мою точку зрения, сохранить остальные, он сохранит ваш код ясным.

7
ответ дан 4 December 2019 в 06:16
поделиться

Для простого оператора if без слишком большого количества строк кода с множественными возвратами проблем нет. Однако ничто меня так не бесит, как:

function doTemperatureCalculations(double temperature) {
  if (temperature < 20) {
    /* 
      Gazillion lines of code here .....
     */
    return "Very cold!";
  } else if (temperature < 40) {
    /*
      Another gazillion loc .....
     */
    return "Summer in the North Pole.";
  } else {
    /*
      Multiple returns embedded throughout ....
     */
  }
}
1
ответ дан 4 December 2019 в 06:16
поделиться

Нет смысла. Вы добавляете ненужные семантические и другие накладные расходы для абсолютно нулевой пользы. Когда вы вернетесь, вы вернетесь, и контроль закончится. Делать вид, что что-то еще является излишним и просто создает впечатление, что вы не знаете, что делает оператор return.

0
ответ дан 4 December 2019 в 06:16
поделиться

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

Таким образом, аргумент является одиночным или составным оператором.

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

ПС. Я всегда посылал температуру в градусах по Цельсию, ой, только что сломал вашу функцию!

0
ответ дан 4 December 2019 в 06:16
поделиться
public String getTemperatureMessage(double temp)
{
    String retval = null;
    if(temp < 32)
        retval = "Freezing";
    else if(temp < 60)
        retval = "Brr";
    else if(temp < 80)
        retval = "Comfortable";
    else
        retval = "Too hot";
    return retval;
}
1
ответ дан 4 December 2019 в 06:16
поделиться

Для простых однострочных Я склонен опускать else, но если есть более сложные блоки if, я предпочитаю else, чтобы было ясно, что условия взаимоисключающие.

2
ответ дан 4 December 2019 в 06:16
поделиться

Единственной возможной альтернативой в этом частном случае является использование условного оператора ?:.

public String getTemperatureMessage(double temp) {
    return temp < 32 ? "Freezing"
         : temp < 60 ? "Brr"
         : temp < 80 ? "Comfortable"
         : "Too hot";
}

Остался вопрос, как это читается для начинающих.

Ссылки

  • Условный оператор JLS 15.25 ?:
    • Оператор является правоассоциативным, поэтому такая вложенность оператора будет работать "как ожидается"

Связанные вопросы

10
ответ дан 4 December 2019 в 06:16
поделиться

Если функция имеет несколько "успешных" возвращаемых значений, я буду использовать if/else для выбора среди них. Если функция имеет нормальное возвращаемое значение, но один или несколько путей могут аварийно завершиться досрочно, я обычно не буду использовать «иначе» для нормального пути. Например, я думаю, что гораздо более «естественно» сказать:

int do_something(int arg1)
{
  if (arg1 > MAX_ARG1_VALUE)
    return ARG1_ERROR;
  ... main guts of code here
  return 0;
}

, чем сказать:

int do_something(int arg1)
{
  if (arg1 > MAX_ARG1_VALUE)
    return ARG1_ERROR;
  else
  {
    ... main guts of code here
    return 0;
  }
}

или

int do_something(int arg1)
{
  if (arg1 <= MAX_ARG1_VALUE)
  {
    ... main guts of code here
    return 0;
  }
  else
    return ARG1_ERROR;

Это различие становится особенно важным, если есть несколько вещей, которые могут «пойти не так», например.

int do_something(int arg1)
{
  if (arg1 > MAX_ARG1_VALUE)
    return ARG1_ERROR;
  ... some code goes here
  if (something_went_wrong1)
    return SOMETHING1_ERROR;
  ... more code goes here
  if (something_went_wrong2)
    return SOMETHING2_ERROR;
  ... more code goes here
  if (something_went_wrong3)
    return SOMETHING3_ERROR;
  return 0;
}

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

8
ответ дан 4 December 2019 в 06:16
поделиться

все хорошо. без «иначе» эта строка

if(temp < 80)
    return "Comfortable";

была бы неубедительной. с "еще" ясно, что есть другие предварительные условия.

0
ответ дан 4 December 2019 в 06:16
поделиться

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

0
ответ дан 4 December 2019 в 06:16
поделиться

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


if (error condition) {  
  do some stuff;
  return;
} else {
  do stuff;
  if (other error condition) {
     do some stuff1;
     return;
  } else {
     do some other stuff;
     return

  }
}

Приведенный ниже код снижает уровень вложенности, что снижает сложность кода:


if (error condition) {
  do some stuff;
  return;
}
do stuff;
if (other error condition) {
  do some stuff1;
  return;
}
do some other stuff;
return;

В вашем примере это легко сделать в любом случае. Но во многих случаях вам лучше использовать таблицу поиска для такого рода вещей и читать значения из файла/базы данных. Для эффективности в C это часто кодируется как массив структур.

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

Я могу думать о преимуществе остальных. Если вы хотите добавить новый последний случай, без elses вы можете забыть добавить if к текущему «Too Hot Condition», если, скажем, вы хотите добавить «Dying» на 120 или что-то в этом роде. в то время как с elses вы знаете, что вам нужно, чтобы финал else был перед «Dying», поэтому вы, скорее всего, подумаете о том, чтобы поставить else перед «Too Hot». Кроме того, если вы просто поставите else на «Dying», вы получите ошибку компиляции, которая заставит вас задуматься.

1
ответ дан 4 December 2019 в 06:16
поделиться

Кто использует IF/ELSE IF..., когда можно использовать оператор SWITCH?

Я предпочитаю один оператор RETURN — несколько операторов return могут затруднить отладку...

0
ответ дан 4 December 2019 в 06:16
поделиться

Это зависит от многих факторов, например, от того, насколько сложен ваш код. В таком простом примере я бы поместил возвраты в ту же строку, что и ifs, и не использовал elses. Структура и поведение понятны:

public String getTemperatureMessage(double temp)
{
    if(temp < 32) return "Freezing";
    if(temp < 60) return "Brr";
    if(temp < 80) return "Comfortable";
    return "Too hot";
}

Когда у меня есть более сложный код, я считаю полезным не выходить из вложенности с помощью возвратов или продолжения/разрыва, а присваивать значения переменным состояния или результата. Затем я также включу {}, даже если блок представляет собой один оператор, в основном для сохранения согласованности в том, как структура представлена ​​в коде, а также для того, чтобы немного снизить риск того, что последующие изменения забудут преобразовать оператор в блок.

Если бы этот пример был более сложным, я бы, вероятно, закодировал его так:

public String getTemperatureMessage(double temp) {
    String result;
    if(temp < 32) {
        result = "Freezing";
    } else {
        if(temp < 60) {
            result = "Brr";
        } else {
            if(temp < 80) {
                result = "Comfortable";
            } else {
                result = "Too hot";
            }
        }
    }
    return result;
}
9
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: