#302

Возврат неуспешного результата из функции в JS

if (stat(filename) == -1) {
  // file doesn't exist
}

Такой код прижился только в C, и только там он является общепринятым и понятным.

В скриптовых языках программирования не следует возвращать -1 как признак (не)успешного выполнения функции, а в JS осторожно нужно быть и со всякими null/undefined. Вообще, канонически правильного способа вернуть ошибку толком-то и нет; сишный errno — это страшный костыль, за который потомки до сих пор благодарны нам. Сишный же способ передать указатель на переменную тоже не самое элегантное решение, и имеет право на жизнь только там, где все программисты этот паттерн знают и хорошо к нему привыкли.

В случае JavaScript нужно просто пройти все пять стадий принятия и договориться с собой, что ты возвращаешь из функции структуру вида

return {
  success: true,
  user: {
    id: ...
  }
}

Ключевые понятия:

  • постарайся унифицировать методы; либо везде возвращать success-структуру либо везде проверять if (!result);
  • категорически избавься от проверки типа возвращаемого значения как признака. Никаких const count = returnCount() и затем if (count === null) { /* нету */ };
  • если метод возвращает success-структуру, то в результате всегда присутствует ключ success. Не нужно его опускать, полагаясь на то, что в этом случае result.success == false;
  • если метод возвращает success-структуру, то он не имеет права вернуть null;
  • если ты используешь сишный паттерн, передавая в функцию хеш, который затем функция меняет внутри, то четко укажи это в названии функции: parseUserAndAugmentWithIds(user = {});

Еще можно делать так:

class DeleteFile {
  static perform(path) {
    // ...
    return DeleteFile.SUCCESS;
  }
}

DeleteFile.SUCCESS = 'success';
DeleteFile.NOT_FOUND = 'notFound';

// ...

if (DeleteFile.perform(filename) != DeleteFile.SUCCESS) {
  // бля
}