アカウント名:
パスワード:
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では採用しないだろうけど。
パブリックフィールドをそこまで嫌う理由もよくわからない。
C#ならともかく、Javaはダイレクトアクセスをアクセサ呼び出しに書き換えるコストが大きいから用心のため最初からアクセサ呼び出しにするのが定石。
Javaの文法にプロパティが追加されたらいらなくなる?あとリファクタツールで間に合う程度の小規模なら害はないが大規模でライブラリ多用するようになると追うのが大変なので必須、というのは正しい?(小規模でも癖にならないよう、あるいはコード流用される可能性があるので義務づける、というのは別の話として)
コストなんか大きくないだろjk。
ステップ1:eclipseで Refactor -> Encapsulate Field
以上。当然、影響箇所は全てテストをするわけで、そっちのコストの方が大きい。これは最初からセッタゲッタを使ってたとしても、中のロジックを変えたのならやっぱりテストは必要。C#だって同じ。それに比べたら、リファクタリング作業なんてサガミオリジナルの0.01mmよりも無に等しい存在。なおサガミオリジナル0.01mmはお一人様1箱でお願いします。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー
言語というよりはAPIの特徴か (スコア:2)
Java の getうんたらsetうんたらは、一体なんなのであろうか。無意味なコードがただ増えるだけだ。たぶん、アクセサメソッドには、重要な価値があると信じられた時代があったのだろうが、しかし、今となっては、くだらない役立たずなのは明らか。じっさい、今出てきてる新しいプログラミング言語には、そのようなものは無い。
べつに Java で public インスタンス変数使ってコード書いても、コンパイルエラーが出るわけじゃなし。かまやしないのだが、API がそうなってないから、自分のコードだけそうするってのも少し格好わるい。
Re:言語というよりはAPIの特徴か (スコア: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では採用しないだろうけど。
Re:言語というよりはAPIの特徴か (スコア:1)
パブリックフィールドをそこまで嫌う理由もよくわからない。
Re: (スコア:0)
C#ならともかく、Javaはダイレクトアクセスをアクセサ呼び出しに書き換えるコストが大きいから用心のため最初からアクセサ呼び出しにするのが定石。
2つほど質問 (スコア:0)
Javaの文法にプロパティが追加されたらいらなくなる?
あとリファクタツールで間に合う程度の小規模なら害はないが大規模でライブラリ多用するようになると追うのが大変なので必須、というのは正しい?(小規模でも癖にならないよう、あるいはコード流用される可能性があるので義務づける、というのは別の話として)
Re: (スコア:0)
コストなんか大きくないだろjk。
ステップ1:eclipseで Refactor -> Encapsulate Field
以上。
当然、影響箇所は全てテストをするわけで、そっちのコストの方が大きい。
これは最初からセッタゲッタを使ってたとしても、中のロジックを変えたのならやっぱりテストは必要。C#だって同じ。
それに比べたら、リファクタリング作業なんてサガミオリジナルの0.01mmよりも無に等しい存在。
なおサガミオリジナル0.01mmはお一人様1箱でお願いします。
Re: (スコア:0)
外部とのインターフェース変わらないからいつでも変更できるし。
readonlyとかset onlyなものは欲しいケースはあるのでプロパティがいらないわけじゃないけどね。
javaの場合は他の都合でgetとsetをつけないといけない分そうもいかないけど。