Почему избегают инкремента (“++”) и декремент (“-”) операторы в JavaScript?

Насколько мне известно, нет собственного решения JPA для обеспечения значений по умолчанию. Вот мой обходной путь:

Решение без переноса базы данных

@Column(columnDefinition="tinyint(1) default 1")
private boolean include;

Java-ориентированное решение

private boolean include = true;

Шаблон Java плюс Plus Builder

     @Column(nullable = false)
     private Boolean include;
     ...
     public static class Builder {
      private Boolean include = true; // Here it comes your default value
      public Builder include (Boolean include ) {
      this.include = include ;
      return this;
     }
     // Use the pattern builder whenever you need to persist a new entity.
     public MyEntity build() {
       MyEntity myEntity = new MyEntity ();
       myEntity .setinclude (include );
       return myEntity;
      }
...
}

Это мой любимый и менее навязчивый. По сути, он делегирует задачу по определению значения по умолчанию для шаблона Builder в вашей сущности.

348
задан Vikrant 17 May 2018 в 23:12
поделиться

8 ответов

Я считаю, что нужно всегда использовать ++ и - отдельно в одной строке, например:

i++;
array[i] = foo;

вместо

array[++i] = foo;

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

398
ответ дан 23 November 2019 в 00:28
поделиться

«До» и «после» природа операторов инкремента и декремента может сбивать с толку тех, кто с ними не знаком; это один из способов, которым они могут быть хитрыми.

16
ответ дан 23 November 2019 в 00:28
поделиться

Является ли Fortran языком C-подобным? В нем нет ни ++, ни -. Вот , как вы пишете цикл :

     integer i, n, sum

      sum = 0
      do 10 i = 1, n
         sum = sum + i
         write(*,*) 'i =', i
         write(*,*) 'sum =', sum
  10  continue

Элемент индекса i увеличивается в соответствии с правилами языка каждый раз в цикле. Если вы хотите увеличить значение, отличное от 1, например, считать в обратном порядке на два, синтаксис ...

      integer i

      do 20 i = 10, 1, -2
         write(*,*) 'i =', i
  20  continue

Python C-подобен? Он использует диапазон и понимание списков и другие синтаксисы, чтобы обойти необходимость увеличения индекса:

print range(10,1,-2) # prints [10,8.6.4.2]
[x*x for x in range(1,10)] # returns [1,4,9,16 ... ]

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

Являются ли Фортран и Python в меньшей степени магнитом для ошибок, чем процедурные языки, в которых есть ++ и -? У меня нет доказательств.

Я утверждаю, что Фортран и Python похожи на C, потому что я никогда не встречал человека, свободно владеющего C, который не мог бы с точностью 90% правильно угадать намерение необфусцированного Fortran или Python.

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

Являются ли Fortran и Python в меньшей степени магнитом для ошибок, чем процедурные языки, в которых есть ++ и -? У меня нет доказательств.

Я утверждаю, что Фортран и Python похожи на C, потому что я никогда не встречал человека, свободно владеющего C, который не мог бы с точностью 90% правильно угадать намерение необфусцированного Fortran или Python.

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

Являются ли Fortran и Python в меньшей степени магнитом для ошибок, чем процедурные языки, в которых есть ++ и -? У меня нет доказательств.

Я утверждаю, что Фортран и Python похожи на C, потому что я никогда не встречал человека, свободно владеющего C, который не мог бы с точностью 90% правильно угадать намерение необфусцированного Fortran или Python.

1
ответ дан 23 November 2019 в 00:28
поделиться

Если вы прочтете JavaScript The Good Parts, вы увидите, что Крокфорд заменил i ++ в цикле for на i + = 1 (не i = i + 1). Это довольно чисто и читабельно, и вряд ли превратится во что-то «хитрое».

Крокфорд запретил автоинкремент и автоматическое уменьшение в параметре в jsLint. Вы выбираете, следовать ли совету или нет.

Мое личное правило - не делать ничего в сочетании с автоинкрементом или автоматическим декрементом.

Я узнал из многолетнего опыта в C, что я не получаю переполнения буфера ( или индекс массива вне пределов), если я буду использовать его просто. Но я обнаружил, что у меня действительно происходит переполнение буфера, если я попадаю в «чрезмерно сложную» практику выполнения других вещей в том же операторе.

Итак, для моих собственных правил использование i ++ в качестве приращения в для цикла в порядке.

Мое личное правило - не делать ничего в сочетании с автоинкрементом или автоматическим декрементом.

Из многолетнего опыта работы с C я узнал, что я не получаю переполнения буфера (или выхода индекса массива за границы), если я сохраняю использовать это просто. Но я обнаружил, что у меня действительно происходит переполнение буфера, если я попадаю в «чрезмерно сложную» практику выполнения других вещей в том же операторе.

Итак, для моих собственных правил использование i ++ в качестве приращения в для цикла в порядке.

Мое личное правило - не делать ничего в сочетании с автоинкрементом или автоматическим декрементом.

Из многолетнего опыта работы с C я узнал, что я не получаю переполнения буфера (или выхода индекса массива за границы), если я сохраняю использовать это просто. Но я обнаружил, что у меня действительно происходит переполнение буфера, если я попадаю в «чрезмерно сложную» практику выполнения других вещей в том же операторе.

Итак, для моих собственных правил использование i ++ в качестве приращения в для цикла в порядке.

46
ответ дан 23 November 2019 в 00:28
поделиться

Рассмотрим следующий код

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[i++] = i++;
    a[i++] = i++;
    a[i++] = i++;

, поскольку i ++ вычисляется дважды, вывод (из отладчика vs2005)

    [0] 0   int
    [1] 0   int
    [2] 2   int
    [3] 0   int
    [4] 4   int

Теперь рассмотрим следующий код:

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[++i] = ++i;
    a[++i] = ++i;
    a[++i] = ++i;

Обратите внимание, что вывод такой же. Теперь вы можете подумать, что ++ i и i ++ - одно и то же. Они не

    [0] 0   int
    [1] 0   int
    [2] 2   int
    [3] 0   int
    [4] 4   int

Наконец, рассмотрим этот код

    int a[10];
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;
    a[3] = 0;
    int i = 0;
    a[++i] = i++;
    a[++i] = i++;
    a[++i] = i++;

Теперь результат:

    [0] 0   int
    [1] 1   int
    [2] 0   int
    [3] 3   int
    [4] 0   int
    [5] 5   int

Значит, они не одно и то же, смешивание обоих приводит к не столь интуитивному поведению. Я думаю, что циклы for подходят для ++, но будьте осторожны, когда у вас есть несколько символов ++ в одной строке или одной инструкции

17
ответ дан 23 November 2019 в 00:28
поделиться

В C есть история выполнения таких вещей, как:

while (*a++ = *b++);

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

И всегда возникает вопрос, что на самом деле делают

++i = i++;

или

i = i++ + ++i;

. Он определен в некоторых языках, а в других нет никакой гарантии, что произойдет.

Если отбросить эти примеры, я не думаю, что есть что-то более идиоматичное, чем цикл for, который использует ++ для увеличения. В некоторых случаях можно обойтись с помощью цикла foreach или цикла while, который проверяет другое условие. Но искажать свой код, пытаясь избежать использования приращения, просто смешно.

69
ответ дан 23 November 2019 в 00:28
поделиться

Я откровенно смущен этим советом. Часть меня задается вопросом, связано ли это с отсутствием опыта (воображаемого или фактического) с кодировщиками javascript.

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

251
ответ дан 23 November 2019 в 00:28
поделиться

Я не знаю, было ли это частью его рассуждений, но если вы воспользуетесь плохо написанной программой минификации, она может превратить x ++ + y в х +++ у . Но опять же, плохо написанный инструмент может нанести любой ущерб.

2
ответ дан 23 November 2019 в 00:28
поделиться
Другие вопросы по тегам:

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