Dart 3リリース、ぬるぽエラーを根絶することが可能に 39
ストーリー by nagazou
ガッ 部門より
ガッ 部門より
プログラミング言語「Dart」が10日、5年ぶりのメジャーバージョンアップ版である「Dart 3」をリリースした。「Google I/O 2023」で発表された「Dart 3」では、100%の「健全なNULL安全性」(sound null safety)が達成されたという。「Dart」では変数に「null」を代入する運用を許可することができたが、「Dart 3」ではそれが許されなくなり、nullポインター例外をはじめとするコーディングエラーを根絶することが可能となった。レコード、パターンマッチ、クラス修飾子といった新しい言語機能も用意されたほか、プレビューの段階で実用は推奨されていないものの、WebAssembly(WASM)への対応も図られている(Medium、Mediumその2、窓の杜)。
外部データとの連携はどうやっているのだろう (スコア:1)
nullが許容されているDBのレコードやJSONは入力は0や''に変換して出力はnullに書き戻す?
いやそれだとnullだったという情報は保持しておかないといかんな。いっそnullを許容したほうが...。
Re: (スコア:0)
そういう言語にはOptionalとかそういうのがある
Re: (スコア:0)
null許容ポインタにすればnullを代入できるからそれでいいんじゃないか?
え?Dart 3 から廃止されたって?
Re: (スコア:0)
.NETだとDBNullってクラスが用意されてる。
Re: (スコア:0)
まあ一般的には独自定義の型なり構造体なりEnumなりを定義してそれで管理って感じですね。
Re: (スコア:0)
擬似NULLオブジェクトでも定義してそれを指すように置換すればいいんでしょ
って普通は気づきそうなものだけど
俺だって気づくんだから
# って他の人も書いてることってこういうことですよね?
Re: (スコア:0)
null不許容なデータ型が全面的に使えるというだけで、null値が必要な場面ではnull許容なデータ型を使える。それぞれint(nullなし)とint?(nullあり)のように表記する。軽くググったところ、そういう感じらしい。
Re:外部データとの連携はどうやっているのだろう (スコア:2, 参考になる)
分かっていない人が相当に多い。窓の杜の説明も誤解を招く書き方だし。
基本的にはnullを許容しない型にはnullを一切許容しない、nullを許容する型にはnullが来たときの処理を必ず書かないといけない。書かないと編集時にエラーになるし、実行もできない。だから、実行時エラーにはならない。
Dart2でもnullの場合の処理を書かないといけないことがほとんどだったけど、!を使うことでnullが来る可能性があってもnullを許容しない型として扱うことができた。Dart3でそれはできない。
nullの代わりに適当なオブジェクト仕立てて誤魔化そう、という方向性のものではない。
Re: (スコア:0)
Dart2の仕様はたぶんC#やTypeScriptと同じだと思うけど、実際これよりガチガチにされるとそれはそれで面倒なんですよね。
int id で、今まではidがない時はnullだったのが、null不許可だから、int?とかにするか、0を入れましょうみたいにせざるを得なくなる。
前者の場合はほぼ全ての使用箇所はintなのに毎回nullチェックが必要になって逆に不便になって、後者の場合はぬるぽが出ないだけで違う不具合になる。
それを回避するためのnull!も潰したんじゃ、たぶんかなり面倒くさくなるよ。
Re: (スコア:0)
前者です。Dart2と実質的には変わっていません。チェックが必要な部分はIDEが教えてくれます。if文でnullの場合とそうでない場合の処理を書く、null合体演算子でnullのときの値を決める、ということが強制されます。
nullを扱える言語において、かつてはプログラマの判断で書いていましたが、IDEが必要なところ、不必要なところを教えてくれて、問題があれば実行ができない、というだけのこと。必要最低限で済むのでそうでない言語よりも楽ですよ。
最近の言語と言うと、私は他にKotlinくらいしか知りませんが、他の言語も似たようなものでしょう。
NULL許容しないだと? (スコア:1)
あのぬるぽが最後の一匹だとは思えない。 (スコア:0)
もしコーディングが続けて行われるとしたら、 あのぬるぽの同類が世界のどこかで現われてくるかもしれない。
Re: (スコア:0)
ガッ
break不要のswitch文・式 (スコア:0)
多くの言語においてswitch文・式はbreakを書かないとswitch文・式から抜けないので、それを利用して意図的にbreakを書かないこともあるのだが、break無しでもswitch文・式から抜けるとなると混乱の元。
拡張されたり式になったりしたのはいいけど、そこを変えるならswitchではなく、whenとかにして欲しかった。
Re:break不要のswitch文・式 (スコア:1)
いや2010年以降に発表されたメジャー言語はほぼフォールスルーではなくbreakがデフォだよ。
go, swift とか。rust は match だけど。
Re: (スコア:0)
メジャーな言語ではC#あたりがbreakが必要な最後の言語だよね。
しかもC#のswitch-caseはbreak必須なのでフォールスルー不可、matchではbreakなし
Re: (スコア:0)
そもそもフォールスルーがバグの元って発想でやってるからね。
Re: (スコア:0)
caseを間に付け足されると壊れるからね
Re: (スコア:0)
> しかもC#のswitch-caseはbreak必須なのでフォールスルー不可、matchではbreakなし
goto case文とgoto default文、涙目
# まあ、使わないけど。
あっぷでーとさまりー (スコア:0)
ぬるぽ で がっ → ぬるぽ に Dart
最近の流行りだけど (スコア:0)
そんな持てはやされるものかね
null 参照の不具合なんて結局パラメータか戻り値のチェックミスなんだからそこに null が入ってようが不正な値が入ってようがプログラムが正しく動かないというのは変わらないし、ぬるぽで落ちるほうがバグが見つけやすいんじゃなかろうか
Re:最近の流行りだけど (スコア:1)
時代は関数型プログラミングですよ。
中でif文あれこれ書くのはスマートじゃないんですよ。
エラーだったら”なんかエラーです”とメッセージ出すだけなんだからそれでいいんですよ。
バグが見つからない?そんなのユーザーが文句いってから処理をつければいいんですよ。
Re:最近の流行りだけど (スコア:1)
NULLを禁止している言語は、C++等がNULLで表現しているエラーや異常値を表すための機構(Option型など)を持っています。NULLの代わりにこれらを使うと、異常値検査を省略したコードが書けないため、
パラメータか戻り値のチェックミス
が起きない仕組みになっています。
Re: (スコア:0)
それでも、0除算はできるという、この中途半端さよ。
Re: (スコア:0)
Rustだと、NonZero型 [rust-lang.org]もありますね。
除数として使うことを意図しているのかどうかは分からないけど。
Re: (スコア:0)
あんまり意味がないよね。
Re:最近の流行りだけど (スコア:1)
null参照エラーだと何が起きたのか分かりにくいというのはあると思う。
でもnullがなければ変わりのエラーになるだけで意味ない感じはするな。
# NoneとかNothingとか、何故nullにしなかったんだ、あの言語どもは。
Cで書けてしまう不正なアドレス参照とはまた違う話だからなぁ。
nullな状態を表せない分使い勝手が悪いとしか思えん。
Re: (スコア:0)
表現力のなかった過去の言語のいわばバッドノウハウに固執しすぎでは。
新しい言語でも表現する方法はありますし、むしろ使い勝手もいいですよ。
Re: (スコア:0)
例えばC#は長らくnull安全ではなかったけど、最近ようやくオプションで
null安全機能を有効にも出来るようになった。
なので、設定を有効にしたり無効にしたりしてコーディングをしてみる事で
実体験をもってnull安全がコードの安全性にどう寄与するかを学習できる。
マジおすすめ。
Re:最近の流行りだけど (スコア:1)
nullが使えなくなったのはいいんだけど、オブジェクトが破棄されているか分からないのがなあ。
Re: (スコア:0)
それ null が使用できたとしてもオブジェクトが破棄されていることは分からないのでは。
Re: (スコア:0)
破棄が必要なオブジェクトは IDisposable使うし、プログラマが制御するのも .NETの基本中の基本だけど、、、
Re:最近の流行りだけど (スコア:1)
というかdispose()の実装こそが、nullが使えなくなることで面倒になるの典型例の一つだよ。
dispose済みかどうかのフラグを追加するしかないことも多いと思う。
Re: (スコア:0)
それは null の使用可否は関係なくて
単に dispose() の存在を前提にした設計や実装ができてないだけでは。
Re: (スコア:0)
親子コメはDispose()を実装するときの話をしていると思うの。
Re: (スコア:0)
もちろん dispose() を実装するときの話です。
Re: (スコア:0)
1bit分のフラグをnullかどうかで表してるのよね
そういうちまちました最適化はコンパイラ任せに出来る流れ
Re: (スコア:0)
クソSIerで働いてそう
Re: (スコア:0)
ぬるぽで落ちるまでバグが見つからないのと、nullチェックをコンパイラに強制されるかの違いです
「チェック済みポインタだけ渡してね」って仕様書やコメントに書いてお願いするより型検査で弾ける方が確実じゃないかと