アカウント名:
パスワード:
Java の getうんたらsetうんたらは、一体なんなのであろうか。無意味なコードがただ増えるだけだ。たぶん、アクセサメソッドには、重要な価値があると信じられた時代があったのだろうが、しかし、今となっては、くだらない役立たずなのは明らか。じっさい、今出てきてる新しいプログラミング言語には、そのようなものは無い。
べつに Java で public インスタンス変数使ってコード書いても、コンパイルエラーが出るわけじゃなし。かまやしないのだが、API がそうなってないから、自分のコードだけそうするってのも少し格好わるい。
えっと、それは本気で Java でパブリックフィールドを使わずにアクセサーを使う理由を理解できないと言っているの? 「Java には C# のプロパティーに相当する機能がなくてアクセサーメソッドだらけになるのが古臭い」とか言うならわかるけれど。
アクセサメソッドは要らないでしょう。JavaScript、Go、Haskell、Dart で書かれたコードを見れば明らかなように、アクセスコントロール機構なんて無くても、誰もまったく困らない。
これまでの話とアクセスコントロール機構の有無の関連も今一つ不明瞭だし、 Haskell にアクセスコントロール機構がないとか言い出すし (モジュールのユーザーはモジュールからエクスポートされた識別子しか使えない、というのが Haskell のアクセスコントロール機構だよ)、何言っているんだとしか思えないんだけど。
>アクセサメソッドは要らないでしょう。
アクセサとは、オブジェクトの利用者に仕様通りの使い方を強制するためのものです。つまり、不特定多数の人が使うようなライブラリには必要なものです。
逆に言うと、そうでないその場限りのプログラミングには不要だと思います。
JavaScriptには機能が追加されたようですが。
誰かが困ったんでしょうね。
追加されてはいない。そもそもJavaScriptだとインスタンスとクラスの結びつきがないから、そのクラスでのみ読めるという仕組みがあわない。
Object.definePropertyができましたね。
JavaだってC#だって、そのクラスのみ読めるというようには普通作らないでしょう。そのインスタンスのみ読めるように作ります。
あーアクセサの話ね。setter、getterはそりゃいるよ、で入ったのは結構前。上の話はprivate云々の話のつもりで書いた。
privateはもともと、クロージャでなんとかできたんじゃありませんでしたっけ?
やろうと思えば出来なくもないが、実質できない。各メソッドがその変数を参照しようとすれば、メソッドの外側にクロージャを作らないといけない。でもただそれだけだと全てのインスタンスにおいて共有されてしまう。インスタンス毎に分けたくばコンストラクタ内でクロージャを作らないといけない。となると、コンストラクタ内でメソッドを定義することになる。すると、今度はメソッドを各インスタンスで共有するということができなくなる。これらの問題を無理矢理解決しようとすると、今度はメモリリークになる。唯一の解決策はES6で入るWeakMapを活用すること。
DartもGoも変数の頭文字でprivate変数か指定できるけど、
例外なのはJavaScriptだけでプラウザ上では1スレッドしか使えないので、データ競合が起きないしDOMはhtml文書の構造を変更する手段を提供APIだから、レンダリングはブラウザが勝手にやってくれる。
スレッド云々は関係ないよ。JSでもprivateはある。WeakMapのラッパー(インスタンスと変数群オブジェクトを登録する)で実現する。
アクセサメソッドは、必ずしもアクセスコントロールのために必要とされているのではないのですが……。参照/代入のタイミングを横取りできるのが重要なんです。インスタンス変数をむき出しにしたら、Lazy Initialization(遅延初期化)とか実装できないじゃないですか。
インスタンス変数へのアクセス方法を別途カスタマイズ可能にする、という方法もあるよ(例:CLOSのMOP)。コードの字面だけ見て何やってるかわかりにくいからJavaでは採用しないだろうけど。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー
言語というよりはAPIの特徴か (スコア:2)
Java の getうんたらsetうんたらは、一体なんなのであろうか。無意味なコードがただ増えるだけだ。たぶん、アクセサメソッドには、重要な価値があると信じられた時代があったのだろうが、しかし、今となっては、くだらない役立たずなのは明らか。じっさい、今出てきてる新しいプログラミング言語には、そのようなものは無い。
べつに Java で public インスタンス変数使ってコード書いても、コンパイルエラーが出るわけじゃなし。かまやしないのだが、API がそうなってないから、自分のコードだけそうするってのも少し格好わるい。
Re: (スコア:3)
えっと、それは本気で Java でパブリックフィールドを使わずにアクセサーを使う理由を理解できないと言っているの? 「Java には C# のプロパティーに相当する機能がなくてアクセサーメソッドだらけになるのが古臭い」とか言うならわかるけれど。
Re:言語というよりはAPIの特徴か (スコア:2)
アクセサメソッドは要らないでしょう。JavaScript、Go、Haskell、Dart で書かれたコードを見れば明らかなように、アクセスコントロール機構なんて無くても、誰もまったく困らない。
Re:言語というよりはAPIの特徴か (スコア:2)
これまでの話とアクセスコントロール機構の有無の関連も今一つ不明瞭だし、 Haskell にアクセスコントロール機構がないとか言い出すし (モジュールのユーザーはモジュールからエクスポートされた識別子しか使えない、というのが Haskell のアクセスコントロール機構だよ)、何言っているんだとしか思えないんだけど。
Re:言語というよりはAPIの特徴か (スコア:1)
-- 哀れな日本人専用(sorry Japanese only) --
Re:言語というよりはAPIの特徴か (スコア:1)
>アクセサメソッドは要らないでしょう。
アクセサとは、オブジェクトの利用者に仕様通りの使い方を強制するためのものです。
つまり、不特定多数の人が使うようなライブラリには必要なものです。
逆に言うと、そうでないその場限りのプログラミングには不要だと思います。
Re: (スコア:0)
JavaScriptには機能が追加されたようですが。
誰かが困ったんでしょうね。
Re: (スコア:0)
追加されてはいない。
そもそもJavaScriptだとインスタンスとクラスの結びつきがないから、そのクラスでのみ読めるという仕組みがあわない。
Re: (スコア:0)
Object.definePropertyができましたね。
JavaだってC#だって、そのクラスのみ読めるというようには普通作らないでしょう。
そのインスタンスのみ読めるように作ります。
Re: (スコア:0)
あーアクセサの話ね。
setter、getterはそりゃいるよ、で入ったのは結構前。
上の話はprivate云々の話のつもりで書いた。
Re: (スコア:0)
privateはもともと、
クロージャでなんとかできたんじゃありませんでしたっけ?
Re: (スコア:0)
やろうと思えば出来なくもないが、実質できない。
各メソッドがその変数を参照しようとすれば、メソッドの外側にクロージャを作らないといけない。
でもただそれだけだと全てのインスタンスにおいて共有されてしまう。
インスタンス毎に分けたくばコンストラクタ内でクロージャを作らないといけない。
となると、コンストラクタ内でメソッドを定義することになる。
すると、今度はメソッドを各インスタンスで共有するということができなくなる。
これらの問題を無理矢理解決しようとすると、今度はメモリリークになる。
唯一の解決策はES6で入るWeakMapを活用すること。
Re: (スコア:0)
DartもGoも変数の頭文字でprivate変数か指定できるけど、
例外なのはJavaScriptだけで
プラウザ上では1スレッドしか使えないので、データ競合が起きないし
DOMはhtml文書の構造を変更する手段を提供APIだから、レンダリングはブラウザが勝手にやってくれる。
Re: (スコア:0)
スレッド云々は関係ないよ。
JSでもprivateはある。
WeakMapのラッパー(インスタンスと変数群オブジェクトを登録する)で実現する。
Re: (スコア:0)
アクセサメソッドは、必ずしもアクセスコントロールのために必要とされているのではないのですが……。
参照/代入のタイミングを横取りできるのが重要なんです。
インスタンス変数をむき出しにしたら、Lazy Initialization(遅延初期化)とか実装できないじゃないですか。
Re: (スコア:0)
インスタンス変数へのアクセス方法を別途カスタマイズ可能にする、という方法もあるよ(例:CLOSのMOP)。コードの字面だけ見て何やってるかわかりにくいからJavaでは採用しないだろうけど。