プロが教える店舗&オフィスのセキュリティ対策術

フィールド、インスタンス変数、プロパティ、…

C++では、クラスの構成要素はメンバと呼ばれ、メンバには変数と関数と二種類あり、変数は、
(1)メンバ変数(オブジェクトがデータを保持するメンバである事を強調する為、別称データメンバ)
関数は、
(2)メンバ関数
と、とってもクリアに呼ばれていました。

ところがJavaになって、メンバ変数が
(1’)フィールド
メンバ関数が
(2’)メソッド
と呼ばれるようになりました。

さらに(1’)が、

(1’’)インスタンス変数
(1’’’)プロパティ

という風にも呼ばれるようになり、(1')と(1'')と(1''')が、混同して呼ばれるようになりました。
多くの人は、
「それらは "interchangeable" で同じ意味で用いられるものなのだ」
という根拠がよくわからない『解説』をしますが、同じ意味ならば同じ用語を使った方が全体がスッキリ且つ正確に表現できて都合がいいのに、なんでいろいろな用語を混用するのでしょうか?

(A)そもそも何でデータメンバをフィールドと言い換えたのか?
 (a)データメンバの方が、それがデータであることを示唆していていいのでは?
 (b)フィールドって、Cの構造体のフィールドから名前が由来しているのでしょうか?

(A)何でわざわざ(1'')や(1''')みたいな用語を使うのか?
(B)どういう意図でそういう用語を使うのか?

そこら辺の事情に詳しい方がいらっしゃいましたら、お教えください。

A 回答 (2件)

■まずは成り立ちや定義から



Objective-C由来の名称なので、データメンバをフィールドと言い換えた訳ではありません。
メソッドも同様です。

インスタンス変数については、細分化する際にそういう名を与えているだけです。
メンバ[フィールド[クラス変数, インスタンス変数], メソッド ]

プロパティはbeanとしてアクセスする側での呼び方です。
実装はフィールドだったり、アクセッサメソッドだったりと異なりますが、
使う側からは一緒ですし、後から実装が変わっても、使う側は変わりません。

■なぜ混同しているか

1. それぞれ会話している人の視点が違う場合がある。
・JSPでbeanを使う人はプロパティとして考える。
ex.
<jsp:getProperty name="foo" property="bar" />
・javaからbeanを直接使う人は、実装に応じて、フィールドにアクセスしたり、アクセッサメソッドを経由してアクセスする。
ex.
a = foo.bar;
a = foo.getBar();
foo.setBar(a);
・UMLで考えると、fooオブジェクトのbar属性。

2. 自分の経験にそった用語を使ってしまう。
・他の言語をやってきた人が、過去の経験に合わせた、別の用語に置き換えて考える、
そしてその用語をそのまま使ってしまう。

3. ちゃんとわかってない。
・フィールドの事をクラス変数と言う人は時々います(クラスの変数だかららしい)
・インスタンスを格納するからインスタンス変数と呼ぶ人もいましたね。
    • good
    • 0
この回答へのお礼

素晴らしく明解な回答をいただき、大感謝です。

身体をぐーんと空高く持っていってくれて、「ほら、こんなだよ』と全体を鳥瞰させてもらったような感じで、視野が一気に広がりました。

ありがとうございました!!!

お礼日時:2010/05/16 10:09

事情に詳しいわけではないが、


http://java.sun.com/docs/books/jls/third_edition …
classの構成要素はmember、initializer、constructor。
fieldとmethodはmemberの一種。
fieldにはstatic field (class variable)とinstance variable (non-static field)がある。
括弧書きの方はsometimes calledな名称。
プロパティという用語はJava言語仕様では定義されておらず、
JavaBeansなどの言語仕様外のフレームワークなどで使用されている。
さらに言えばプロパティとフィールドに直接の関連がある必要はない。

(A)
計算機科学上、フィールドとは部品としての性格を強調したデータの名称なのでデータであることを示唆していないのではない。
元々区画された畑などのメタファー由来であり表の欄のことやデータベースなどでも使われている。
どういう経緯でJavaではフィールドになったかは知らない。
C由来かもしれないし、他のプログラミング言語由来、もしくはオブジェクト指向的何かの用語由来かもしれない。
(A)
上述の通り、インスタンス変数はフィールドの一種でしかなく、同じものの言い換えではない。
プロパティもまた異なる概念である。
(B)
したがって、異なるものを指すためにそういった用語を使う。

この回答への補足

ご回答、ありがとうございます。

C++でも、メンバ変数には、staticが付くものと付かないものがあります。
C++でも、staticが付くメンバ変数は、クラス固有の変数で、クラス型のインスタンス(=オブジェクト)とは独立に存在します。
Javaの static field と non-static field は、C++のそれらを呼び名を変えて真似たものにすぎないと思います。

本質的な思想としての呼び名の違いを質問しています。
言葉尻を捉える形での呼び名の違いを質問している訳ではありません。

Javaの言語仕様に限定して質問をしているのでもなく、JavaEEまで含めてのトータルな質問をさせていただいています。

補足日時:2010/05/15 16:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!