OOプログラミングに不慣れな友人がメンバーとプロパティの違いを私に尋ねました、そして私は彼に良い答えを与えることができなかったことを認めることを恥ずかしく思いました。プロパティはオブジェクトでもあり得るのでそれ自体、私は一般的な説明と例外のリストを残されました。
誰かが、メンバーとプロパティのどちらを検討するかについて、適切な定義を提示できますか?たぶん私は概念を卑劣にしているのでしょうか、それともメンバーは私が使用する内部名であり、プロパティは他のオブジェクトに公開されているものであるというだけですか?
この質問への答えがわからないことが私のプログラミングの品質に影響を与えたとは思いません。それは単なるセマンティクスのポイントですが、それでも彼に説明できないのは気になります。
プロパティはone種類のメンバーです。もちろん、言語/プラットフォームによっては、コンストラクター、メソッド、フィールド、ネストされた型、変換、インデクサーなどがあります。多くの場合、用語のexactの意味はコンテキストによって異なります。
C#固有の定義を与えるには、C#3.0仕様のセクション1.6.1から:
次の表に、クラスに含めることができるメンバーの種類の概要を示します。
(行...)
- 定数
- 田畑
- メソッド
- プロパティ
- インデクサー
- イベント
- 演算子
- コンストラクター
- デストラクタ
- タイプ
これはクラスのメンバーであることに注意してください。さまざまな「モノ」にはさまざまな種類のメンバーがあります。たとえば、C#では、インターフェイスにメンバーとしてフィールドを含めることはできません。
2つの用語のどちらも、オブジェクト指向プログラミングまたはオブジェクト指向設計では、定義された意味を持ちません。また、圧倒的多数のプログラミング言語で定義された意味もありません。
propertyまたはmemberと呼ばれる概念を持っているプログラミング言語はごくわずかであり、両方を持っている言語はさらに少数です。
2つのいずれかを持つ言語の例としては、C++(メンバーがある)、ECMAScript(プロパティがある)、C#(両方がある)があります。ただし、これらの用語は、必ずしも異なるプログラミング言語で同じ概念を示すわけではありません。たとえば、「メンバー」という用語はC++とC#でほぼ同じことを意味しますが、「プロパティ」という用語はECMAScriptとC#ではまったく異なることを意味します。実際、ECMAScriptの「プロパティ」という用語は、C++およびC#の「メンバー」という用語とほぼ同じ概念を意味します(つまり、ほぼ同じことを意味します)。
これはすべて、これらの2つの用語が、プログラミング言語の関連する仕様が意味することを正確に意味しているということです。それ以上でもそれ以下でもありません。 (ここに無償のルイス・キャロルの引用を挿入してください。)
プロパティはメンバーの一種です。
たとえば、C#では、クラスに次のメンバーを含めることができます。
メンバーは、クラスに属する単なるオブジェクトまたはプリミティブ型です。
プロパティは、メンバーよりも強力です。これは、ゲッターとセッターを作成する簡単な方法のようなもので、たとえば、パブリックゲッターとプライベートセッターを作成できます。読み取りまたは書き込みの方法で、必要なロジックを配置します。これらはメンバーを公開する方法として使用でき、後で読み取りと書き込みのポリシーをより簡単に変更できます。
これはC#に適用されます。ただし、これが他の言語にも当てはまるかどうかはわかりません。
メンバー(変数)は、オブジェクトの一部にすぎません。プロパティは(これを「通常」と修飾します-複数の言語にわたって明確な意味を持つ技術的に明確な単語であるかどうかはわかりません)は、オブジェクトの公的にアクセス可能な側面です。 getterおよびsetterメソッドを介して。
したがって、(ほとんどの場合)プロパティは到達可能なメンバー変数ですが、実際にはオブジェクト状態の一部ではないプロパティを持つことができます(これは優れた設計ではありません)。
public class Foo {
public String getJunk()
{ return "Junk";}
public void setJunk(String ignore){;}
}
}
プロパティはフィールドを公開する方法であり、フィールドは実際の変数です。例(C#):
class Foo {
private int field;
public int Property {
get { return field; }
set { field = value; }
}
}
プロパティとメソッドはどちらもオブジェクトのメンバーです。プロパティは、メソッドが所有するオブジェクトにアクセスまたは使用するときに、オブジェクトのある側面を記述します。
擬似コードの例:
Object Ball
Property color(some Value)
Method bounce(subroutine describing the movement of the Ball)
ボールが定義され、色(プロパティ)が与えられ、メソッドのバウンスが別のオブジェクトに当たったときにボールがどのように反応するかを説明するサブルーチンです。
すべての言語にプロパティがあるわけではありません。つまり、Javaには、ゲッターとセッターがアクセスする必要のあるフィールドのみがあります。
メンバーは、クラスのコンポーネントを示すために使用される一般的な用語です( C++ で発生する可能性がありますが、 Java でも定義されます)。プロパティは、クラスの特定の特性を示すために使用される広い概念であり、クラスがインスタンス化されると、オブジェクトの状態を定義するのに役立ちます。
"Object-Oriented Analysis and Design"からGrady Boochによって抽出された次の文章は、件名。まず、状態と動作の概念を理解することが重要です。
オブジェクトのstateには、オブジェクトのすべての(通常は静的な)プロパティと現在の(通常は動的な)値が含まれますこれらの各プロパティの。プロパティとは、オブジェクトの属性の全体と他のオブジェクトとの関係を意味します。
動作は、状態変化とメッセージパッシング(メソッド)の観点から、オブジェクトがどのように動作および反応するかです。 );オブジェクトの外見上でテスト可能なアクティビティ。
したがって、オブジェクトの動作は、使用可能な操作とその状態(プロパティとその現在の値)によって異なります。 OOPは、言語ごとに大きく異なるため、特定の命名法に関しては非常に一般的であることに注意してください。
用語フィールド(Object Pascal)、インスタンス変数(Smalltalk)、メンバーオブジェクト(C++)、およびスロット(CLOS)は交換可能であり、状態の一部のリポジトリを意味します。オブジェクト。集合的に、それらはオブジェクトの構造を構成します。
クラスの宣言の一部として定義された、オブジェクトに対する操作。 メッセージ(Smalltalk)、メソッド(多くのOO言語)、メンバー関数(C++)、および操作)という用語は通常交換可能です。
しかし、著者によって導入された表記法は正確です。
属性は集約オブジェクトの一部を示すため、分析および設計時に単一のプロパティを表すために使用されますクラスの。言語に依存しない構文を使用すると、属性には名前、クラス、またはその両方、およびオプションでデフォルトの式を含めることができます:_
A:C=E
_。操作は、クラスによって提供されるサービスを示します。操作(...)は、括弧を追加するか、戻りクラス、名前、および仮引数(存在する場合)で構成される操作の完全な署名を提供することにより、属性と区別されます。
R N(Arguments)
要約すると、メンバーはクラスを構成するすべてのものと考えることができ、プロパティは、クラスの構造と他のクラスとの関係を集合的に定義するメンバー(属性)と考えることができます。クラスがインスタンス化されると、オブジェクトの状態を定義するために、そのプロパティに値が割り当てられます。
乾杯
から PHPマニュアル :
クラスメンバー変数は「プロパティ」と呼ばれます。また、「属性」や「フィールド」などの他の用語を使用して参照されている場合もあります。これらは、キーワードpublic、protected、またはprivateのいずれかを使用して定義され、その後に通常の変数宣言が続きます。この宣言には初期化が含まれる場合があります。