Назначить переменную в выражении условия, хорошей практике или нет?

Я переехал один год назад с классических языков OO, таких как Java на JavaScript. Следующий код определенно не рекомендуется (или даже не корректно) в Java:

if(dayNumber = getClickedDayNumber(dayInfo))
{
    alert("day number found : " + dayNumber);
}
function getClickedDayNumber(dayInfo)
{
    dayNumber = dayInfo.indexOf("fc-day");
    if(dayNumber != -1) //substring found
    {
        //normally any calendar month consists of "40" days, so this will definitely pick up its day number.
        return parseInt(dayInfo.substring(dayNumber+6, dayNumber+8));
    }
    else return false;
}

В принципе, я только выяснил, что могу назначить переменную значению в условии if if и сразу же проверить назначенное значение, как если бы оно было логическим.

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

Ответ 1

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

if (value = someFunction()) {
    ...
}

вы не знаете, что они хотели сделать, или если они намеревались написать это:

if (value == someFunction()) {
    ...
}

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

if ((value = someFunction()) === <whatever truthy value you are expecting>) {
    ...
}

Ответ 2

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

if (x = processorIntensiveFunction()) { // declaration inside if intended
    alert(x);
}

Зачем эта функция должна запускаться во второй раз с помощью:

alert(processorIntensiveFunction());

Потому что первая версия LOOKS плохой? Я не могу согласиться с этой логикой.

Ответ 3

Я делал это много раз. Чтобы обойти предупреждение JavaScript, я добавляю два параметра:

if ((result = get_something())) { }

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

Ответ 4

Вы можете сделать это и на Java. И нет, это не очень хорошая практика.:)

(И используйте === в Javascript для типизированного равенства. Прочитайте Крокфорда "Книга добрых частей" на JS.)

Ответ 5

Есть один случай, когда вы это делаете, while -loops.
При чтении файлов вы обычно делаете так:

void readFile(String pathToFile) {
    // Create a FileInputStream object
    FileInputStream fileIn = null;
    try {
        // Create the FileInputStream
        fileIn = new FileInputStream(pathToFile);
        // Create a variable to store the current line text in
        String currentLine;
        // While the file has lines left, read the next line,
        // store it in the variable and do whatever is in the loop
        while((currentLine = in.readLine()) != null) {
            // Print out the current line in the console
            // (you can do whatever you want with the line. this is just an example)
            System.out.println(currentLine);
        }
    } catch(IOException e) {
        // Handle exception
    } finally {
        try {
            // Close the FileInputStream
            fileIn.close();
        } catch(IOException e) {
            // Handle exception
        }
    }
}

Посмотрите на while -loop в строке 9. Там новая строка считывается и сохраняется в переменной, а затем выполняется содержимое цикла. Я знаю, что это не if -statement, но я думаю, что цикл while также может быть включен в ваш вопрос.

Причиной этого является то, что при использовании FileInputStream каждый раз, когда вы вызываете FileInputStream.readLine(), он читает следующую строку в файле, поэтому, если бы вы вызвали его из цикла только с fileIn.readLine() != null без назначения вместо вызова (currentLine = fileIn.readLine()) != null, а затем вызвала его изнутри цикла, вы получите только каждую вторую строку.

Надеюсь, вы понимаете, и удачи!

Ответ 6

Вы можете выполнять задания в операторах if в Java. Хорошим примером было бы прочитать что-то и написать его:

http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new

Код:

// Copies src file to dst file.
// If the dst file does not exist, it is created
void copy(File src, File dst) throws IOException 
{
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst);

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

Ответ 7

Это не очень хорошая практика. Вы скоро смутитесь. Он похож на общую ошибку: неправильное использование операторов "=" и "==".

Вы должны разбить его на две строки кодов. Это не только помогает сделать код более четким, но и легким для рефакторинга в будущем. Представьте, что вы меняете условие IF? Вы можете случайно удалить строку, и ваша переменная больше не получит назначенное ей значение.

Ответ 8

Если бы вы обратились к книге Мартина Фаулера " Рефакторинг, улучшающий дизайн существующего кода" ! Тогда есть несколько случаев, когда это будет хорошей практикой, например. длинные сложные условия для использования вызова функции или метода для подтверждения вашего случая:

"Мотивация

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

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

И да, его ответ также действителен для реализаций Java. Он не присваивает условную функцию переменной, хотя в примерах.

Ответ 9

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

Ответ 10

вы можете сделать что-то вроде этого:

if (value = /* sic */ some_function()){
  use_value(value)
}

Ответ 11

Я приехал сюда с Голанга, где обычно можно увидеть что-то вроде

if (err := doSomething(); err != nil) {
    return nil, err
}

В котором err распространяется до этого, if только блок. Таким образом, вот что я делаю в es6, который кажется довольно уродливым, но не делает мои довольно строгие правила eslint бледными, и достигает того же самого.

{
  const err = doSomething()
  if (err != null) {
    return (null, err)
  }
}

Дополнительные фигурные скобки определяют новую "лексическую область видимости"? Это означает, что я могу использовать const, а err недоступен для внешнего блока.