パスワードを忘れた? アカウント作成
16588937 story
プログラミング

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)への対応も図られている(MediumMediumその2窓の杜)。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2023年05月15日 15時18分 (#4460240)

    nullが許容されているDBのレコードやJSONは入力は0や''に変換して出力はnullに書き戻す?
    いやそれだとnullだったという情報は保持しておかないといかんな。いっそnullを許容したほうが...。

    • by Anonymous Coward

      そういう言語にはOptionalとかそういうのがある

    • by Anonymous Coward

      null許容ポインタにすればnullを代入できるからそれでいいんじゃないか?
      え?Dart 3 から廃止されたって?

    • by Anonymous Coward

      .NETだとDBNullってクラスが用意されてる。

      • by Anonymous Coward

        まあ一般的には独自定義の型なり構造体なりEnumなりを定義してそれで管理って感じですね。

    • by Anonymous Coward

      擬似NULLオブジェクトでも定義してそれを指すように置換すればいいんでしょ
      って普通は気づきそうなものだけど
      俺だって気づくんだから
      # って他の人も書いてることってこういうことですよね?

    • by Anonymous Coward

      null不許容なデータ型が全面的に使えるというだけで、null値が必要な場面ではnull許容なデータ型を使える。それぞれint(nullなし)とint?(nullあり)のように表記する。軽くググったところ、そういう感じらしい。

      • by Anonymous Coward on 2023年05月15日 23時58分 (#4460578)

        分かっていない人が相当に多い。窓の杜の説明も誤解を招く書き方だし。

        基本的にはnullを許容しない型にはnullを一切許容しない、nullを許容する型にはnullが来たときの処理を必ず書かないといけない。書かないと編集時にエラーになるし、実行もできない。だから、実行時エラーにはならない。

        Dart2でもnullの場合の処理を書かないといけないことがほとんどだったけど、!を使うことでnullが来る可能性があってもnullを許容しない型として扱うことができた。Dart3でそれはできない。

        nullの代わりに適当なオブジェクト仕立てて誤魔化そう、という方向性のものではない。

        親コメント
        • by Anonymous Coward

          Dart2の仕様はたぶんC#やTypeScriptと同じだと思うけど、実際これよりガチガチにされるとそれはそれで面倒なんですよね。
          int id で、今まではidがない時はnullだったのが、null不許可だから、int?とかにするか、0を入れましょうみたいにせざるを得なくなる。
          前者の場合はほぼ全ての使用箇所はintなのに毎回nullチェックが必要になって逆に不便になって、後者の場合はぬるぽが出ないだけで違う不具合になる。
          それを回避するためのnull!も潰したんじゃ、たぶんかなり面倒くさくなるよ。

          • by Anonymous Coward

            前者です。Dart2と実質的には変わっていません。チェックが必要な部分はIDEが教えてくれます。if文でnullの場合とそうでない場合の処理を書く、null合体演算子でnullのときの値を決める、ということが強制されます。

            nullを扱える言語において、かつてはプログラマの判断で書いていましたが、IDEが必要なところ、不必要なところを教えてくれて、問題があれば実行ができない、というだけのこと。必要最低限で済むのでそうでない言語よりも楽ですよ。

            最近の言語と言うと、私は他にKotlinくらいしか知りませんが、他の言語も似たようなものでしょう。

  • by Anonymous Coward on 2023年05月15日 14時44分 (#4460226)

    もしコーディングが続けて行われるとしたら、 あのぬるぽの同類が世界のどこかで現われてくるかもしれない。

  • by Anonymous Coward on 2023年05月15日 15時11分 (#4460236)

    多くの言語においてswitch文・式はbreakを書かないとswitch文・式から抜けないので、それを利用して意図的にbreakを書かないこともあるのだが、break無しでもswitch文・式から抜けるとなると混乱の元。

    拡張されたり式になったりしたのはいいけど、そこを変えるならswitchではなく、whenとかにして欲しかった。

    • by Anonymous Coward on 2023年05月15日 15時54分 (#4460274)

      いや2010年以降に発表されたメジャー言語はほぼフォールスルーではなくbreakがデフォだよ。
      go, swift とか。rust は match だけど。

      親コメント
      • by Anonymous Coward

        メジャーな言語ではC#あたりがbreakが必要な最後の言語だよね。
        しかもC#のswitch-caseはbreak必須なのでフォールスルー不可、matchではbreakなし

        • by Anonymous Coward

          そもそもフォールスルーがバグの元って発想でやってるからね。

          • by Anonymous Coward

            caseを間に付け足されると壊れるからね

        • by Anonymous Coward

          > しかもC#のswitch-caseはbreak必須なのでフォールスルー不可、matchではbreakなし

          goto case文とgoto default文、涙目

          # まあ、使わないけど。

  • by Anonymous Coward on 2023年05月15日 15時17分 (#4460239)

    ぬるぽ で がっ → ぬるぽ に Dart

  • by Anonymous Coward on 2023年05月15日 15時20分 (#4460242)

    そんな持てはやされるものかね
    null 参照の不具合なんて結局パラメータか戻り値のチェックミスなんだからそこに null が入ってようが不正な値が入ってようがプログラムが正しく動かないというのは変わらないし、ぬるぽで落ちるほうがバグが見つけやすいんじゃなかろうか

    • by Anonymous Coward on 2023年05月15日 15時42分 (#4460259)

      時代は関数型プログラミングですよ。
      中でif文あれこれ書くのはスマートじゃないんですよ。
      エラーだったら”なんかエラーです”とメッセージ出すだけなんだからそれでいいんですよ。

      バグが見つからない?そんなのユーザーが文句いってから処理をつければいいんですよ。

      親コメント
    • by Anonymous Coward on 2023年05月15日 16時03分 (#4460281)

      NULLを禁止している言語は、C++等がNULLで表現しているエラーや異常値を表すための機構(Option型など)を持っています。NULLの代わりにこれらを使うと、異常値検査を省略したコードが書けないため、

      パラメータか戻り値のチェックミス

      が起きない仕組みになっています。

      親コメント
      • by Anonymous Coward

        それでも、0除算はできるという、この中途半端さよ。

        • by Anonymous Coward

          Rustだと、NonZero型 [rust-lang.org]もありますね。
          除数として使うことを意図しているのかどうかは分からないけど。

          • by Anonymous Coward

            double f(double x) => 1 / (x - 1) - 1;

            あんまり意味がないよね。

    • by Anonymous Coward on 2023年05月15日 22時23分 (#4460539)

      null参照エラーだと何が起きたのか分かりにくいというのはあると思う。
      でもnullがなければ変わりのエラーになるだけで意味ない感じはするな。
      # NoneとかNothingとか、何故nullにしなかったんだ、あの言語どもは。
      Cで書けてしまう不正なアドレス参照とはまた違う話だからなぁ。
      nullな状態を表せない分使い勝手が悪いとしか思えん。

      親コメント
      • by Anonymous Coward

        表現力のなかった過去の言語のいわばバッドノウハウに固執しすぎでは。
        新しい言語でも表現する方法はありますし、むしろ使い勝手もいいですよ。

    • by Anonymous Coward

      例えばC#は長らくnull安全ではなかったけど、最近ようやくオプションで
      null安全機能を有効にも出来るようになった。
      なので、設定を有効にしたり無効にしたりしてコーディングをしてみる事で
      実体験をもってnull安全がコードの安全性にどう寄与するかを学習できる。
      マジおすすめ。

      • by Anonymous Coward on 2023年05月16日 0時50分 (#4460596)

        nullが使えなくなったのはいいんだけど、オブジェクトが破棄されているか分からないのがなあ。

        親コメント
        • by Anonymous Coward

          それ null が使用できたとしてもオブジェクトが破棄されていることは分からないのでは。

        • by Anonymous Coward

          破棄が必要なオブジェクトは IDisposable使うし、プログラマが制御するのも .NETの基本中の基本だけど、、、

          • by Anonymous Coward on 2023年05月16日 9時56分 (#4460720)

            というかdispose()の実装こそが、nullが使えなくなることで面倒になるの典型例の一つだよ。
            dispose済みかどうかのフラグを追加するしかないことも多いと思う。

            親コメント
            • by Anonymous Coward

              それは null の使用可否は関係なくて
              単に dispose() の存在を前提にした設計や実装ができてないだけでは。

              • by Anonymous Coward

                親子コメはDispose()を実装するときの話をしていると思うの。

              • by Anonymous Coward

                もちろん dispose() を実装するときの話です。

            • by Anonymous Coward

              1bit分のフラグをnullかどうかで表してるのよね
              そういうちまちました最適化はコンパイラ任せに出来る流れ

        • by Anonymous Coward

          クソSIerで働いてそう

    • by Anonymous Coward

      ぬるぽで落ちるまでバグが見つからないのと、nullチェックをコンパイラに強制されるかの違いです
      「チェック済みポインタだけ渡してね」って仕様書やコメントに書いてお願いするより型検査で弾ける方が確実じゃないかと

typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...