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

プログラミング言語「Dart」に「null安全」版が登場 31

ストーリー by nagazou
なんでもかんでもnull安全化 部門より

やや旧聞に類する話だが、6月11日(米国時間)に、プログラミング言語「Dart」の“null安全(null Safety)”版が公開されたそうだ。現在、「Dart」の開発チャネル上でテクニカルプレビューとして公開されている。

「Dart」は型安全(type-safe)なプログラミング言語ではあるが、ほかの言語と同様にnull参照エラーの問題を抱えていた。「null安全」版であればこの問題をクリアできるとしている。また、nullチェックを省いた高速かつコンパクトなネイティブコードを生成できるとのこと(窓の杜)。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2020年06月18日 15時59分 (#3835755)

    Dart は JavaScript や TypeScript と比べたらそりゃ便利だが、
    「JavaScript を Java 風に書けるようにしました」ってくらいで
    最近の言語なのに文法がダサくて新しい機能が全然ないんだよなぁ

    しかも Java レベルのパッケージ管理行き届いた IDE がないから
    補完も全然されない、単に面倒くさい Java
    Kotolin 使ってたほうが絶対良い

  • by Anonymous Coward on 2020年06月18日 14時35分 (#3835680)

    ヽ( ・∀・)ノ┌┛ガッΣ(ノ`Д´)ノぬるぽ

    だったのが

    ヽ( ・∀・)ノ┌┛ガッΣ(´∇`) ぬるホッ

    という

    安全になったからって糞コードおkって訳じゃねぇ

    となるわけですね

    # 糞コードは世に尽きまじ

    • by Anonymous Coward

      初期化漏れとかメモリリークとか。
      オブジェクトを使用しなくなったときにnullを代入して参照外すのはどう変わるんだろう。

      • by Anonymous Coward on 2020年06月18日 17時26分 (#3835840)

        NULLを入れたいときは、NULL許容型(従来通りの型)を使うだけですよ。
        NULL安全って、NULLチェックの漏れをコンパイラが検出できるようにする仕組みでしかなくて、設計とかロジックに何か影響するわけじゃない。

        昔から静的解析ツールとかで、NULLになる可能性があるとかチェックはできたけど、関数の呼び出し元を延々とたどる必要があって、コンパイル時にやるには負荷が高すぎた。NULL安全をサポートする言語では、NULL非許容の型を用意することで、スコープ内だけでチェックを閉じられるようにしたというだけの話。

        新規に設計すると言語側のNULLでないことを保証する機能にたよれるのでNULL非許容の型を主に使うようにして、NULLを使わないコードの範囲を広げれば、その間はNULLチェックのコードが不要なので無駄がなくなるところがメリット
        NULLが必要なときは、今までどおりNULL許容型使えばいいです。

        親コメント
      • by Anonymous Coward

        初期化強制なのかもね、コンパイラがチェックということは。

        しかし、空を意味するために0とか "" を単に突っ込むだけになって、null参照で落ちないだけで挙動不審なプログラムになるだけな気がする…。

        参照外す方法なぁ。NullObjectとかいう空っぽのクラス作って、それをnewして突っ込んだりしてなw

        • by Anonymous Coward

          型安全な言語でnullが入る型に0を入れる意味はないでしょう。
          まあ初期化強制ですね。
          メモリ開放はnullの代入ではなくスコープで管理しようねって話かと。

      • by Anonymous Coward

        null許容型があるみたいよ

        • by Anonymous Coward

          参照を外すためだけにnull許容型にしてnull安全性をなくすのもなあと。

          • by Anonymous Coward

            参照を外したいのに、NULL安全を維持するなんてのは本末転倒
            百害あって一利なし。
            NULL安全な処理とNULL安全でない処理は、分離できてないとコンパイルも通らないですから、NULLが必要な箇所は普通にNULLを使えばいいんです。
            普通に書くだけで、どちら側の処理か明確に区別きますし、そもそも区別つかないように書くことが出来ません。

        • by Anonymous Coward

          null がターミネーターとして優秀すぎるので仕方ない。

      • by Anonymous Coward

        「この変数(引数)の取扱いはnullを考慮してないコードですよ」という型が増えて、
        「nullが入っているかもしれない変数」をその処理に渡す時は事前にnullかどうかチェックしないとコンパイルエラーになる。
        というのがnull安全のあらましです。

      • by Anonymous Coward

        Dartはよく知らんけど、Kotlinの思想は、
        スコープを超えて存在するようなオブジェクトはNewしない。
        どうしても永続化したい場合、静的なオブジェクトにする。
        戻り値の参照は作らない。
        なんでしょう。
        参照を作らなければ消す必要はないですから。

      • by Anonymous Coward

        Null Object パターン [wikipedia.org]がわりと大活躍

        • by Anonymous Coward

          null saftyとnullObjectは真逆の考え方だろ。

          • by Anonymous Coward

            応用力よ。

            nullを許容したくないが、初期化は後回しにしたい場合
            NullObjectで初期化しておけばよろしい。
            あえて参照を外したい場合も、NullObjectにすればよろしい。

            基本的には相反するからといって、一生応用を考えないようじゃダメだ。

            • by Anonymous Coward

              https://nullsafety.dartpad.dev/3d9c1769de7912c654bc5d132aff60ac [dartpad.dev]
              初期化の後回しの為だけにNullObjectなんて使わなくていい

            • by Anonymous Coward

              NULL安全で、null object 導入って、どんな気違いだよ。
              null object のメリット全否定じゃん。
              # そもそも null object pattern を止めましょうってのが、NULL安全の基本中の基本だぞ。

              • by Anonymous Coward

                nullとnull objectは無関係
                nullはnullだしnull objectはobjet
                頭の悪いやつは「無関係」というのが理解できない
                おおかたrubyで全クラス階層共通ののnull objectを作ってんだろ

            • by Anonymous Coward

              それは応用力じゃなくて、理解力の欠如あるいは思考力の欠如っていうんだよ。

              NULLが使いたい箇所にはNULL共用型を使いましょう。
              NULLObjectを作って、NULL非許容型に設定すると、NULl非許容型は存在価値がなくなります。メリットが減るではなく、完全に無くなります。

            • by Anonymous Coward

              何となくわかった。

              NULL安全に書くことが可能な処理では、本質的にNULL値が不要だから、Null Objectの出番は無い。
              設計的にNULL値を必要とする処理では、そもそもNULL安全にはならないから、Null Objectによる実装が選択肢に現れる。

              NULL安全に書けるなら、その方が良い。

      • by Anonymous Coward

        初期化漏れはコンパイルが通らないので起こりえません。

        • by Anonymous Coward

          クソコードの話をしているのだから、この場合の初期化漏れは初期化されないのではなく初期値の変更忘れ。
          基底クラスのプロパティを変え忘れたとか。

          • by Anonymous Coward

            こういうコメント見ると、NULL安全はまったく理解されてないのだなぁと思うな。

            NULL安全なコードで、後で変更することを想定してる初期値なんてものは実装としても概念としても存在しない。
            NULL安全なフィールドや変数は、つねに意味のある値になっていなければならないし、実際そうなるように書く。
            常に意味がある値を持てないフィールドに、NULL安全な型をつかってはいけない。

            • by Anonymous Coward

              上で、nullObjectパターンとかの話も出てるのも、そのへんが理解されてないからだろうな。
              常に意味のある値であることを保証するための枠組みだと理解してたら、nullObjectパターンを持ってくるなんていう頓珍漢な発想が出てくる余地もないからな。

              • by Anonymous Coward

                オブジェクトの生成時にどうしても初期値を設定できない場合はあるが、そういうときはプロパティやgetterを使うなり遅延初期化なりするしな
                面倒だと思うかもしれないが、本質的に制約が大きくて面倒なんだよ

                (#3836212)は関数型言語の経験はないんだろうか
                あれこそNULL安全の代表選手なのだが

                あとnull objectはちゃんと意味がある値だぞ馬鹿

              • by Anonymous Coward

                どこでnullナシ処理を担保するかって話なだけなのにオマエらカッカしすぎ
                nullobjectで進んでも表示や保存する動的コードの前段階でナニカをしなきゃならんわけで
                素晴らしい解決法思いつかない現状ユーザーコード側に責任押し付ける安全のほうが低コストだから皆が拝んでんだよ

              • by Anonymous Coward

                null objectにはきちんとした名前をつける必要がある
                https://en.wikipedia.org/wiki/Null_object_pattern [wikipedia.org]

                Given a binary tree, with this node structure:

                class node {
                    node left
                    node right
                }

                One may implement a tree size procedure recursively:

                function tree_size(node) {
                    return 1 + tree_size(node.left) + tree_size(node.right)
                }

                Since the child nodes may not exist, one must modify the procedure by adding non-existence or null checks:

                function tree_size(node) {
                    set sum = 1
                    if node.left exists {
                        sum = sum + tree_size(node.left)
                    }
                    if node.right exists {
                        sum = sum + tree_size(node.right)
                    }
                    return sum
                }

                This however makes the procedure more complicated by mixing boundary checks with normal logic, and it becomes harder to read. Using the null object pattern, one can create a special version of the procedure but only for null nodes:

                function tree_size(node) {
                    return 1 + tree_size(node.left) + tree_size(node.right)
                }
                function tree_size(null_node) {
                    return 0
                }

                This separates normal logic from special case handling, and makes the code easier to understand.

                このnull_nodeは普通はleafと呼ばれているので、実際のプログラムではそう名付けなければならないし、他のプログラムでnull objectを使う場合には、同様に適した名前をつ

              • by Anonymous Coward

                > オブジェクトの生成時にどうしても初期値を設定できない場合はあるが、そういうときはプロパティやgetterを使うなり遅延初期化なりするしな

                そのために、NULL許容型があるのですから、それをつかいましょうね。
                NULLでなくなったことを確認した処理からは、その値を保持したNULL非許容の型に値を保持してそれを使いましょう。
                NULL非許容型に、nullObjectの考えをもってくると、NULL(でないとしても)非許容ではなく、NULL許容と同じく、最後までつかえる値なのかわからない型となり、NULL非許容にする意味がなくなります。

                > (#3836212)は関数型言語の経験はないんだ

              • by Anonymous Coward

                おお、ここまで堂々とした無知は気持ちがいいな
                kotlinのlateinitとか、代数データ型とか、キーワードは教えてやるから自分で調べな
                無知と馬鹿は違うから、自分で調べれば望みがあるぞ

              • by Anonymous Coward

                おじさんは例外を投げるほうが好きです。
                例外を拾った側で好き勝手するほうが好きです。

          • by Anonymous Coward

            それはNullかんけいないよね。
            なんかのクラスのインスタンス変数の初期値を設計上長さゼロの文字列からNullに変えた。
            ソースコードの修正を忘れた。
            バグったってことだよね?

typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...