いいえ、オブジェクトはエンティティを表す必要はありません。
実際、オブジェクトを物理的なエンティティとして考えるのをやめると、OOPが約束するメリットを最終的に得ることができると主張します。
これは最良の例ではありませんが、Coffee Makerのデザインはおそらく私にとって光が降り始めた場所です。
オブジェクトはメッセージに関するものです。彼らは責任についてです。車、ユーザー、注文に関するものではありません。
OOをこのように教えることは知っていますが、MVC、MVVM、またはMVWhateverを実行しようとすると、どこに行くのかを理解することがどれほど根本的にイライラするかを数回試してみると明らかになります。モデルが途方もなく肥大化するか、コントローラーが肥大化します。ナビゲーションのために、Vehiclesに触れるものはすべてVehicle.extファイルにあることを知っておくのは素晴らしいことですが、アプリケーションがVehiclesである場合、必然的にそのファイルに3000行のスパゲッティができてしまいます。
送信する新しいメッセージがある場合、少なくとも1つの新しいオブジェクトと、おそらくそれらのペアがあります。したがって、メソッドのバンドルに関する質問では、メッセージのバンドルについて話している可能性があると主張します。そして、それぞれが独自のオブジェクトであり、独自の仕事をすることができます。そしてそれは大丈夫です。本当に、本当に本当に一緒にする必要があるものをバラバラにすると、それは明らかになります。そして、それらをまとめます。しかし、オブジェクト指向を楽しみたい場合は、便宜上、漠然と適切な引き出しにすべてのメソッドをすぐにドロップするわけではありません。
関数のバッグについて話しましょう
オブジェクトは単なるメソッドのコレクションであり、オブジェクト指向のままである場合がありますが、私の「ルール」はかなり厳密です。
コレクションには単一の責任が必要であり、その責任は「モーターに負荷をかける」ほど一般的ではありません。私はサービス層のファサードのようなことをするかもしれませんが、私はオブジェクト指向コードを書き込もうとしているからではなく、ナビゲーション/発見の理由で怠け者であることを痛感しています。
すべてのメソッドは、一貫した抽象化層にある必要があります。1つのメソッドがMotorオブジェクトを取得し、別のメソッドがHorsepowerを返す場合、おそらく離れすぎています。
オブジェクトは同じ「種類」のデータで動作するはずです。このオブジェクトはモーター(開始/停止)にデータを送り、これはクランク長で処理を行い、これは点火シーケンスを処理し、これはhtml形式を取ります。このデータは、オブジェクト上のフィールドである可能性があり、まとまりがあります。
私は通常、変換、合成を行っているとき、または単に可変性を心配したくないときに、この種のオブジェクトを構築します。
オブジェクトの責任に焦点を当てることで、結束が促進されます。オブジェクトになるにはある程度の凝集性が必要ですが、オブジェクトであるためにフィールドや動作をする必要はありません。これらの5つのモーターメソッドを必要とするシステムを構築していた場合、それらのことを行う5つの異なるオブジェクトから始めます。共通点を見つけたので、物事を統合するか、共通の「ヘルパー」オブジェクトを使用します。それは私をオープン/クローズドの懸念に動かします-どのように私はこの特定のファイルを再び変更する必要はなく、必要な場所でそれを使用する必要がないようにこの機能のビットを抽出できますか?
オブジェクトはメッセージに関するものです
オブジェクトにとってフィールドはほとんど問題になりません。レジスタを取得および設定しても、プログラム外の世界は変わりません。他のオブジェクトとのコラボレーションにより、作業が完了します。ただし、OOの強みは、抽象化を作成できるため、個々の詳細すべてを一度に考慮する必要がないことです。リークしたり、意味をなさない抽象化には問題があるため、メンタルモデルに一致するオブジェクトを作成することについて(多すぎるかもしれませんが)深く考えます。
重要な質問:これらの2つのオブジェクトが互いに対話する必要があるのはなぜですか?
オブジェクトは人の臓器と考えてください。デフォルトの目的があり、関心のある特定のメッセージを受信したときにのみ動作を変更します。
あなたが横断歩道にいて、車が速く来ているシナリオを想像してください。脳のオブジェクトとして、ストレッサーを検出します。視床下部にコルチコトロフィン放出ホルモンを送るように言います。下垂体はそのメッセージを受け取り、副腎皮質刺激ホルモンを放出します。副腎はそのメッセージを受け取り、アドレナリンを作り出します。筋肉オブジェクトがそのアドレナリンメッセージを取得すると、収縮します。心臓が同じメッセージを受け取ると、心臓はより速く鼓動します。通りを横切って全速力で走るという複雑な行動を開始することに関与するプレーヤーのチェーン全体があり、それが重要なメッセージです。脳オブジェクトは視床下部にアラートを送信させる方法を知っていますが、最終的に行動を起こすオブジェクトのチェーンを知りません。同様に、心臓はアドレナリンがどこから来るのかわからない、
したがって、この(簡略化された)例では、副腎オブジェクトは、ACTHを摂取してアドレナリンを分泌する方法を知るだけで済みます。それを行うのにフィールドは必要ありませんが、それでも私にはオブジェクトのように見えます。
ここで、アプリケーションが通りを横切るようにのみ設計されている場合、下垂体と副腎のオブジェクトは必要ないかもしれません。または、概念的に「下垂体モデル」と見なされるもののほんの一部を実行する下垂体オブジェクトのみが必要です。これらの概念はすべて概念的なエンティティとして存在しますが、それはソフトウェアであり、AdrenalineSenderまたはMuscleContractorなどを作成でき、モデルの「不完全性」についてあまり心配する必要はありません。