@bitwheeze

Чем лучше инициализировать переменные, дефолтными значениями или null?

Вопрос скорее метафизический.

Начал работать с typescript (в контексте react.js). До этого программировал на java долго и сейчас программирую, и недолго на javascript. Сейчас у меня дилемма, чем лучше инициализировать переменные. Присваивать им null, или какие то дефолтные значения.

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

Допустим есть какой то Context, в котором хранится какое то состояние получаемое от сервера. Структура User, с несколькими полями, к примеру имя, айдишник, его баланс, число сообщений в личной почте итп

Я теперь стараюсь проинцииализировать контекст как то так

const EMPTY_USER : UserDto = {
    id: "",
    name: "",
    balance: 0,
    newMessages: 0,
    role: Roles.EMPTY_ROLE
}

const [user, setUser] = useState<UserDto>(EMPTY_USER);


Приемущество в том, что мне не надо в коде проверять на null, поля просто отобразятся пустыми.

Альтернативно, можно написать

const [user, setUser] = useState<UserDto | null>(null);


Так имхо проще в том, смысле, что не надо выдумывать фейковые, пустые значения, типа Roles.EMPTY_ROLE и еще и делать их отображение. Но в коде еще надо проверять на Null, код заграмождается if-ами, всякими if(null) return EmptyComponent(); Плюс если разрешить null значения, то порой иногда непонятно, где в цепочке вызовов это значение потерялось. Сложнее для отладки.

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

Типа такого

const {user} = useContext(userContext);
useEffect(() => {
   fetch(userDetailsUrl + "/"  + user.id)
},[])


Довольно часто случается. Просто забываешь сделать проверку. Если бы был null, то сразу в коде было бы видно, что не стоит делать REST вызов, а с дефолтными значениями просто не обращаешь внимания. В результате ненужный вызов api.
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Если "пустое" значение совсем валидно, то лучше его. Если совсем невалидно, то null.
Разумеется, есть и промежуточные варианты, когда это значание - объект, и некоторые поля можно использовать, а некоторые нет. Тут по ситуации, исходя из того, как удобнее делать проверки.

C null можно ещё немного переписать код так:

return value == null ? <EmptyComponent ../> : <RealComponent value={value} />


тогда внутри RealComponent у тебя гарантированно правильное значение, с которым можно спокойно работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы