パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

悩まされてしまうプログラミング言語の奇妙な特徴は?」記事へのコメント

  • Java の getうんたらsetうんたらは、一体なんなのであろうか。無意味なコードがただ増えるだけだ。たぶん、アクセサメソッドには、重要な価値があると信じられた時代があったのだろうが、しかし、今となっては、くだらない役立たずなのは明らか。じっさい、今出てきてる新しいプログラミング言語には、そのようなものは無い。

    べつに Java で public インスタンス変数使ってコード書いても、コンパイルエラーが出るわけじゃなし。かまやしないのだが、API がそうなってないから、自分のコードだけそうするってのも少し格好わるい。

    • えっと、それは本気で Java でパブリックフィールドを使わずにアクセサーを使う理由を理解できないと言っているの? 「Java には C# のプロパティーに相当する機能がなくてアクセサーメソッドだらけになるのが古臭い」とか言うならわかるけれど。

      • アクセサメソッドは要らないでしょう。JavaScript、Go、Haskell、Dart で書かれたコードを見れば明らかなように、アクセスコントロール機構なんて無くても、誰もまったく困らない。

        親コメント
        • これまでの話とアクセスコントロール機構の有無の関連も今一つ不明瞭だし、 Haskell にアクセスコントロール機構がないとか言い出すし (モジュールのユーザーはモジュールからエクスポートされた識別子しか使えない、というのが Haskell のアクセスコントロール機構だよ)、何言っているんだとしか思えないんだけど。

          親コメント
        • Objective-Cで書かれたコードを見れば悪施さメソッドは明らかに必要。 Javaでプログラムしていると、無指定はprivateにして欲しいと切に願う。
          --
          -- 哀れな日本人専用(sorry Japanese only) --
          親コメント
        • >アクセサメソッドは要らないでしょう。

          アクセサとは、オブジェクトの利用者に仕様通りの使い方を強制するためのものです。
          つまり、不特定多数の人が使うようなライブラリには必要なものです。

          逆に言うと、そうでないその場限りのプログラミングには不要だと思います。

          親コメント
        • by Anonymous Coward

          JavaScriptには機能が追加されたようですが。

          誰かが困ったんでしょうね。

          • by Anonymous Coward

            追加されてはいない。
            そもそもJavaScriptだとインスタンスとクラスの結びつきがないから、そのクラスでのみ読めるという仕組みがあわない。

            • by Anonymous Coward

              Object.definePropertyができましたね。

              JavaだってC#だって、そのクラスのみ読めるというようには普通作らないでしょう。
              そのインスタンスのみ読めるように作ります。

              • by Anonymous Coward

                あーアクセサの話ね。
                setter、getterはそりゃいるよ、で入ったのは結構前。
                上の話はprivate云々の話のつもりで書いた。

              • by Anonymous Coward

                privateはもともと、
                クロージャでなんとかできたんじゃありませんでしたっけ?

              • by Anonymous Coward

                やろうと思えば出来なくもないが、実質できない。
                各メソッドがその変数を参照しようとすれば、メソッドの外側にクロージャを作らないといけない。
                でもただそれだけだと全てのインスタンスにおいて共有されてしまう。
                インスタンス毎に分けたくばコンストラクタ内でクロージャを作らないといけない。
                となると、コンストラクタ内でメソッドを定義することになる。
                すると、今度はメソッドを各インスタンスで共有するということができなくなる。
                これらの問題を無理矢理解決しようとすると、今度はメモリリークになる。
                唯一の解決策はES6で入るWeakMapを活用すること。

        • by Anonymous Coward

          DartもGoも変数の頭文字でprivate変数か指定できるけど、

          例外なのはJavaScriptだけで
          プラウザ上では1スレッドしか使えないので、データ競合が起きないし
          DOMはhtml文書の構造を変更する手段を提供APIだから、レンダリングはブラウザが勝手にやってくれる。

          • by Anonymous Coward

            スレッド云々は関係ないよ。
            JSでもprivateはある。
            WeakMapのラッパー(インスタンスと変数群オブジェクトを登録する)で実現する。

        • by Anonymous Coward

          アクセサメソッドは、必ずしもアクセスコントロールのために必要とされているのではないのですが……。
          参照/代入のタイミングを横取りできるのが重要なんです。
          インスタンス変数をむき出しにしたら、Lazy Initialization(遅延初期化)とか実装できないじゃないですか。

          • by Anonymous Coward

            インスタンス変数へのアクセス方法を別途カスタマイズ可能にする、という方法もあるよ(例:CLOSのMOP)。コードの字面だけ見て何やってるかわかりにくいからJavaでは採用しないだろうけど。

Stableって古いって意味だっけ? -- Debian初級

処理中...