LINUX.ORG.RU

История изменений

Исправление Ruth, (текущая версия) :

У Optional есть один минус.

Ровно тот же минус есть и в подходе с обеспечением null safety через создание особых случаев. Ведь:

А его обход, например, в kotlin виден сразу — для этого используется очень уродливый постфиксный оператор "!!"

Уродливость оператора — это категория, приходящая с опытом. Для гипотетического джуниора это ничем не отличается от вызова get опционального значения. И точно так же требует поправки на code review.

Для начала про Rust — там, по сути, мы тоже имеем _почти_ Type Level Null Safety, нужно постараться, чтобы вставить null, он не является в явном виде частью языка. Не совсем идеально, но тоже очень хорошо с учетом необходимости сохранения null для FFI.

Вообще же, например, в Scala, я упоминал еще, что можно не просто написать Option.get(), можно просто не вернуть Option, а вернуть сырой объект (или null) из метода. :)

И в итоге — либо все оборачивать в Option, даже если не nullable, либо где-то не оборачивать и тогда каждый раз при использовании думать — там действительно not nullable или просто обернуть забыли? Или не обернули специально, а потом отрефакторили кусочек метода и не заметили, что теперь он может вернуть null?

А так — null *уже* сам по себе является особым случаем — объект может быть двойственного типа и иметь кардинально разное поведение.

Дальше нужно «или крестик снять, или —».

Если мы добавляем Option, давайте реально полностью убирать null — ну хотя бы как в Rust (все же совместимость нужно сохранять), только, лучше, еще более жестко. Вон, как в C# Unsafe делали в свое время — и в блок специальный выделить участок кода нужно, и флаг компилятора вставить — десять раз подумаешь, нужен ли этот геморрой.

Если мы оставляем null как особый случай — давайте не Option ставить, а Nullable Types. Option в таком случае хуже — дает меньше гарантий.

Если в языке нет null, то не будут. Опять же воспользуюсь случаем и сошлюсь на Rust. Там это очень грамотно реализовано.

Про rust — согласен. Но в большинстве остальных языков есть одновременно и Option, и null — это плохо.

Исправление Ruth, :

У Optional есть один минус.

Ровно тот же минус есть и в подходе с обеспечением null safety через создание особых случаев. Ведь:

А его обход, например, в kotlin виден сразу — для этого используется очень уродливый постфиксный оператор "!!"

Уродливость оператора — это категория, приходящая с опытом. Для гипотетического джуниора это ничем не отличается от вызова get опционального значения. И точно так же требует поправки на code review.

Для начала про Rust — там, по сути, мы тоже имеем _почти_ Type Level Null Safety, нужно постараться, чтобы вставить null, он не является в явном виде частью языка. Не совсем идеально, но тоже очень хорошо с учетом необходимости сохранения null для FFI.

Вообще же, например, в Scala, я упоминал еще, что можно не просто написать Option.get(), можно просто не вернуть Option, а вернуть сырой объект (или null) из метода. :)

И в итоге — либо все оборачивать в Option, даже если не nullable, либо где-то не оборачивать и тогда каждый раз при использовании думать — там действительно not nullable или просто обернуть забыли? Или не обернули специально, а потом отрефакторили кусочек метода и не заметили, что теперь он может вернуть null?

А так — null *уже* сам по себе является особым случаем — объект может быть двойственного типа и иметь кардинально разное поведение.

Дальше нужно «или крестик снять, или —».

Если мы добавляем Option, давайте реально полностью убирать null — ну хотя бы как в Rust (все же совместимость нужно сохранять), только, лучше, еще более жестко. Вон, как в C# Unsafe делали в свое время — и в блок специальный выделить участок кода нужно, и флаг компилятора вставить — десять раз подумаешь, нужен ли этот геморрой.

Если мы позволяем null (как Scala, например) — то Option хуже чем nullable types — дает меньше гарантий.

Если в языке нет null, то не будут. Опять же воспользуюсь случаем и сошлюсь на Rust. Там это очень грамотно реализовано.

Про rust — согласен. Но в большинстве остальных языков есть одновременно и Option, и null — это плохо.

Исходная версия Ruth, :

У Optional есть один минус.

Ровно тот же минус есть и в подходе с обеспечением null safety через создание особых случаев. Ведь:

А его обход, например, в kotlin виден сразу — для этого используется очень уродливый постфиксный оператор "!!"

Уродливость оператора — это категория, приходящая с опытом. Для гипотетического джуниора это ничем не отличается от вызова get опционального значения. И точно так же требует поправки на code review.

Для начала про Rust — там, по сути, мы тоже имеем _почти_ Type Level Null Safety, нужно постараться, чтобы вставить null, он не является в явном виде частью языка. Не совсем идеально, но тоже очень хорошо с учетом необходимости сохранения null для FFI.

Вообще же, например, в Scala, я упоминал еще, что можно не просто написать Option.get(), можно просто не вернуть Option, а вернуть сырой объект (или null) из метода. :)

И в итоге — либо все оборачивать в Option, даже если не nullable, либо где-то не оборачивать и тогда каждый раз при использовании думать — там действительно not nullable или просто обернуть забыли? Или не обернули специально, а потом отрефакторили кусочек метода и не заметили, что теперь он может вернуть null?

А так — null *уже* сам по себе является особым случаем — объект может быть двойственного типа и иметь кардинально разное поведение.

Дальше нужно «или крестик снять, или —».

Если мы добавляем Option, давайте реально полностью убирать null — ну хотя бы как в Rust (все же совместимость нужно сохранять), только, лучше, еще более жестко.

Если мы позволяем null (как Scala, например) — то Option хуже чем nullable types — дает меньше гарантий.

Если в языке нет null, то не будут. Опять же воспользуюсь случаем и сошлюсь на Rust. Там это очень грамотно реализовано.

Про rust — согласен. Но в большинстве остальных языков есть одновременно и Option, и null — это плохо.