オブジェクトに属性、状態、動作があると言えますか?


16

OOPの概念に対するOracleの紹介を読んでいたときに、この説明に出会いました。

実世界のオブジェクトには2つの特性があります。それらはすべて状態と動作を持っています。犬には状態(名前、色、品種、空腹)と行動((える、フェッチング、尾を振る)があります。ソフトウェアオブジェクトは、概念的には実世界のオブジェクトに似ています。それらも状態と関連する動作で構成されています。

そのパッセージに関する私の問題は、状態を記述するときに、その属性もそこにあるということです。たとえば、犬の名前と色はその属性であり、空腹または喉が渇いているのはその状態です。

したがって、私の意見では、オブジェクトの特性を属性、状態、および動作の 3つの部分に分ける方がより正確です。

確かに、これをプログラミング言語に翻訳すると、属性と状態の両方がフィールド/変数に格納され、動作がメソッド/関数に格納されるため、3分割パーティションが2分割パーティションになることがわかります。

しかし、概念的に言えば、3つのものを分離する方が理にかなっています。

別の例を次に示します。ランプを考えてみましょう。ランプのサイズと点灯するかどうかの両方が状態であると言うことは、私の意見では広まっています。ランプサイズは状態ではなく属性であり、ランプのオン/オフは状態です。

または私は何かを見逃しましたか?


4
うん、あなたは行動をシミュレートするためのテクニックとしての特性が欠けています。
ヤニス

この記事を見て、それが役立つことがあります。yegor256.com/2014/12/09/...
yegor256

回答:


13

インスタンスの不変の特性を意味する属性を定義する場合、オブジェクトは属性、状態、および動作で構成されるという点で正しいです。実際のところ、この区別をすることは重要です。なぜなら、(あなたの感覚では)属性のみを含み、状態を含まないオブジェクトが存在するからです。それらは不変と呼ばれ、プログラミングに非常に役立ちます。

この3つの部分からなる定義は、プログラミング言語で実際に表されます。たとえばfinal、JavaのreadonlyキーワードまたはC#のキーワードを使用して、インスタンスの存続期間を通じて変化しないインスタンスデータを示します。

ただし、変更されないインスタンスデータは通常、属性と呼ばれないことを追加する必要があります。使用している言語に応じて、「最終」または「読み取り専用」または「定数データ」としてそれらを話す傾向があります。それらの適切な用語は「不変式」ですが、この言葉はこの意味で頻繁には使用されません。より頻繁に他の目的に使用されます。


インスタンスの変化しない特性と変化する特性という用語を考えるのは理にかなっています。そして、それほど遠くなかったことがうれしいです。ありがとう!
ダニエルスコッコ

製造または組み立てプロセス中のランプのサイズは状態になりますか?
ジェフ

いいえ、属性になります。(OPの言葉の意味で。)
マイクナキス

4
状態と属性の間に根本的な違いはないため、状態を可変または不変であると定義する方が簡単です。(不変)属性と(可変)状態を持つことは正しくありません(多くの意味で同等です)が、その区別は定義を必要以上に複雑にします。IMOという用語は、概念を説明するのに最適な用語ではないかもしれませんが、「状態」は何らかの形で変更が想定されることを意味するのに対し、Oracleの記事に記載されている「状態」にはそれがありません。
ライライアン

不変性に対する人々の姿勢は、年が経つにつれて変化していると思います。その重要性を理解している人にとっては、可変状態と不変状態の間には根本的な違いがあり、異なる名前を保証するのに十分です。非常に興味深い読書をお勧めしますか?エリック・リッパート-コードのすばらしい冒険-C#の不変性パート1:不変性の種類
マイク・

4

オブジェクトには2つの特性しかないと言う方が正確だと思います。Oracleの例を取り上げます。

犬には状態(名前、色、品種、空腹)と行動(barえる、フェッチする、尾を振る)があります。ソフトウェアオブジェクトは、概念的には実世界のオブジェクトに似ています。それらも状態と関連する動作で構成されています。

名前、色、品種、空腹の値(状態)が属性のオブジェクトに保存されているという事実は、実装の詳細です。属性はまったく必要ありません。

3番目の特性として属性を含める場合、オブジェクトの(状態などの)動作も変更される可能性があるため、4番目としてメソッドを含める必要があります。状態と動作は、オブジェクトの2つの抽象的な特性です。属性とメソッドは、これらの概念の具体的な実装です。


キツネの毛皮の色は、冬に変わるため状態になりますか?
ジェフ

@JeffO Furの色も、古くなったり、濡れたり、染まったりすると変わる可能性があります...さまざまな理由があります。1つのオブジェクトの存続中に変化する可能性があるというだけで、実際には状態ではありませんが、同じタイプの異なるオブジェクトがその属性に対して異なる値を持つことができるためです。
トカゲのビル

1

状態は属性と対応する値のセットであるため、私の観点からは、あなたは正しくありません(そして、単純な定義に不必要な追加の複雑さを作成しています)。


0

私たちは無数の方法で物事を分類することができ、各分類には「正しい答え」はありません。分類がより深い理解につながるか、コミュニケーションを改善する場合にのみ、物事を分類することには利点があります。チームが属性、状態、および機能という用語を使用することを好み、これらに対して適切な作業定義がある場合、これは内部コミュニケーションを改善するのに役立ちますが、このグループの外部とコミュニケーションをとるときは柔軟である必要があります。

「空腹」と「渇き」の概念は、基本的な属性(血糖値、水分補給レベルなど)から導き出すことができるため、状態は、以下に基づいてTrueまたはFalseに循環できる基本属性から派生するメタ属性と考えることができます。関連する基本属性の状態。ライトの例では、ライトは属性applied_voltageand resistanceと機能voltage_switch()and を持っていると考えることができますshine()voltage_swich()次に、いくつかの入力(例えば、手動スイッチ、ライト、タイマーなど)の関数であり、shine()の関数であるapplied_voltageresistancelight_stateオブジェクトのメンタルな構築を支援するためにTrueまたはFalseのいずれかのメタ属性を宣言することもできますが、これらのアイデアはすべて、作業を整理するために使用する単なるメンタルな構成要素です。


-2

オブジェクトの状態は、属性に直接または間接的にエンコードされます。たとえば、犬をのどが渇かせたい場合は、犬に

private boolean thirsty;

または、次のようなものにすることができます

private Date lastDrinkAt;

そして、現在の時間と最後に何かを飲んだ時間を比較することで、犬のインスタンスがのどが渇いているかどうかを判断します。

どちらにしても、オブジェクトの状態はその属性内にあります。

次に、属性を持たないクラス、ほとんどがユーティリティクラスがあります。ただし、この場合も通常、それらのインスタンスを作成する必要はありません。

文について推論できるようにするために、科学者は通常、最小限の原則に固執します。これが、Oracleが状態を明示的に言及しなかった理由だと思う。属性の値から導出できます。


1
Oracle 状態を明示的に言及しました。引用を読んでください。そしてOPは明らかにオブジェクトの特性を変化させないという意味で属性という言葉を使用しているので、彼はそれらを状態と混同しない。
マイクナキス

それらはまだ特性です-それらが変化しているかどうか、またはそれらを「属性」または「メンバー」と呼ぶかどうか。プログラミングの世界では、オブジェクトの属性以外にオブジェクトの状態を表すものはありません。

-3

実際の接続は見当違いです。私がそれを教える方法は次のとおりです(c ++アプローチ):

  1. コンピューターは、データとコードの2つの異なるストレージ形式をサポートしています
  2. データはビット010101010101のように見える
  3. コードはasm命令のように見える
  4. データビットには2つの異なる値があり、0または1のいずれかです。
  5. データはデータ型に抽象化されます:int i = 1; 一部のビット0000001への短い表記です
  6. コードは関数のようになります。int f(int a){return a + a + a; }は、一部のasm命令の短い表記です
  7. 複数の変数がある場合は、それらを構造体に結合します。int a; フロートb; 構造体ABに配置できます{int a; フロートb; };
  8. いくつかのコードを結合すると、クラスが得られます。class ABf {int a; フロートb; float sum(float c)const {return a + b + c; }};
  9. 次に、データの場合、値を見つけるために使用できる変数名があります:データにアクセスするためのa + b + c。
  10. そして、通常の関数呼び出しがあります:int k = f(10); f関数内に「格納された」asm命令にアクセスします。
  11. 次に、オブジェクトインスタンスがあります。ABfvar;
  12. そして、メンバー関数呼び出し:int k2 = var.sum(10.0);
  13. 関数の型はint f(int);
  14. メンバー関数の型はint ABf :: sum(float);です。
  15. タイプABf *のthis-pointerがあります
  16. a、b、cなどの変数はコンテキストに依存します。メンバー関数内にある場合、this-> bまたは単にbを意味します。
  17. メンバー関数int ABf :: sum(float c)は、int sum(ABf * this、float c);の単なる表記です。
  18. 「状態」という言葉は、データと同じ意味です
  19. 「行動」という言葉はコードと同じ意味です
  20. 「属性」という言葉は単にデータと同じ意味です。

したがって、状態と属性の間には実際には何も違いはありません。それは単なるビットのランダムなコレクションです。それらを分離することはただのarbitrary意的な区別です。エイリアスとは何かを知る必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.