web-dev-qa-db-ja.com

現実世界のオブジェクトは、OOP worldの(計算)オブジェクトですか?

OOP設計フェーズ戦略では、

システムの物理的/概念的なオブジェクトcanは、以下の2つの条件に基づいて、OOP設計されたプログラムの計算オブジェクトとしてモデル化(検討)されます:

最初のケース:システムのその物理的/概念的なオブジェクトは、ローカルな状態でなければならず、その状態は時間とともに変化します。

または

2番目のケース:システムの物理的/概念的なオブジェクトはローカル状態を持っている場合と持たない場合がありますが、同じオブジェクトが相互作用を通じてシステムの他の物理的/概念的なオブジェクトの状態に影響を与える必要があります。

上記の2つのケースもサポートされています here 、つまり:Viewing objects as finite state machines

上記の2つのケースを説明するために、以下はobject model図とclass diagramのコインフリッピングゲーム。

class Coinおよびclass Playerタイプオブジェクト、ローカル状態coinOption最初のケースで述べたように。 class CoinGameタイプオブジェクトにはローカル状態はありませんが、2番目のケースで述べたように、他のオブジェクト(タイプPlayerおよびCoin)の状態に影響します。

enter image description here

2番目のケースに従って、class CoinGameタイプオブジェクトは、以下の相互作用を通じて、タイプPlayerおよびCoinの他のオブジェクトの状態に影響しますが、class CoinGame型オブジェクト自体には、それ自体のローカル状態はありません。

enter image description here

そう、 class CoinGameはローカル状態を維持せず、以下のようにcompositeおよびPlayerCoinの関係がありますJavaコード。

public class CoinGame {

        Player[] players = new Player[2];

        Coin theCoin = new Coin();

        CoinGame(String player1Name, String player2Name){

            players[0] = new Player(player1Name);
            players[1] = new Player(player2Name);

        }
       .....
}

Javaでの完全な code は次のとおりです。実世界からオブジェクトを選択する場合、上記の2つのケースが有効です。私の理解は正しいですか?

5
overexchange

SICP§1.1.2 では、次のように述べています。

プログラミング言語の重要な側面は、名前を使用して計算オブジェクトを参照するための手段です。名前は、値がオブジェクトである変数を識別すると言います。

したがって、計算オブジェクトは、単に変数によってポイントされるです。オブジェクト、ファーストクラス関数、または数値の場合もあります。計算オブジェクトが必要なのはこれだけです。

最初の2つのアサーションに関して、オブジェクトは状態を変更したり、メッセージを他のオブジェクトに渡したりすることで、時間の経過に伴う変化をモデル化できるという点で、これら2つのアサーションは両方とも真です

3
Robert Harvey

私の理解は正しいですか?

いいえ、不変オブジェクト(JavaまたはC#の文字列、またはPythonのタプル)など)は時間の経過とともに状態を変更しません。それでも、それらはあらゆる種類の(計算)オブジェクトの完全に有効な例ですof OOP定義私は知っています。しかし、これらの種類のオブジェクトは相互作用を通じて他のオブジェクトの状態に影響を与える可能性があります。

オブジェクトcanが変更可能な状態にあるからといって、オブジェクトがhaveであることは必須ではありません "OOPセンス」。

3
Doc Brown

私が読んだ2つのケース/条件は、どの実世界および概念オブジェクトが、計算オブジェクトをモデル化するための意味のある候補であるかを明らかにしています。オブジェクトまたは変数in-codeが計算オブジェクトであるかどうかではありません。そして、そこには大きな主観性があります-プログラマーであるあなたが意味のある状態や相互作用を認識して、コードをモデル化できるかどうかがすべてです。

次の2つのオブジェクトについて考えます。

Aカップ:カップの属性はその充満度であり、時間の経過とともに変化します。したがって、cupオブジェクトは、[時間とともに]変化する可能性があるcup値を格納するという点で、「計算」_fullnessオブジェクトをモデル化できます。たとえば、リソースの消費をバッファリングするために小さくて有限のコンテナが必要な場合、cupが正当なモデルになる可能性があります。

あなたのいとこのEd:何もしません。座っているだけで動かない。そして、誰も気にしないでください。したがって...計算モデルとして特定の値はありません。

1
svidgen