問題タブ [composition]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
clone - カプセル化 凝集・合成
カプセル化に関するウィキペディアの記事には、次のように記載されています。
「カプセル化は、ユーザーがコンポーネントの内部データを無効または一貫性のない状態に設定するのを防ぐことにより、コンポーネントの整合性も保護します」
私はフォーラムでカプセル化に関する議論を開始しました。その中で、上記のカプセル化のルールを維持するために、常にセッターやゲッター内でオブジェクトを複製する必要があるかどうかを尋ねました。メイン オブジェクト内のオブジェクトがメイン オブジェクトの外部で改ざんされていないことを確認したい場合は、常にそれを複製する必要があると考えました。
ある討論者は、この問題では集約と構成を区別する必要があると主張しました。基本的に彼が述べていると思うのはこれです:
- コンポジションの一部であるオブジェクト (たとえば、長方形のポイント) を返したい場合は、それを複製します。
- 集約の一部であるオブジェクト (たとえば、UserManager の一部としてのユーザー) を返したい場合は、参照を壊さずにそれを返します。
それは私にとっても理にかなっています。しかし今、私は少し混乱しています。そして、この件についてご意見をお聞かせいただきたいと思います。
厳密に言えば、カプセル化は常にクローン作成を義務付けますか?
PS .: 私は PHP でプログラムを作成しています。PHP はスクリプト言語であるため、リソース管理はもう少し関連性があるかもしれません。
oop - 特定のオブジェクトを構成する動機となる要因は?
特定のオブジェクトを別のオブジェクト内に構成する理由はたくさんあります。一部の学派は、プログラムを特定の方法で設計する理由を明示しています。たとえば、「データ駆動型設計」または「ドメイン駆動型設計」です。私はまだ OOP の初心者であり、あるオブジェクトが別のオブジェクトに含まれる理由を理解するのが難しいことがよくあります。ときどき、素晴らしいと思えるオブジェクトを見つけたときに、「よし、これをどこかに置かなければならないのだろうか?」と気付くことがあります。この背後にある理由は、ハードディスクにファイルを配置することを決定した場所と似ていますか?
これには、いくつかの指針があります。
- 物理的な世界での関係をモデル化する場合。
- コンポーザーがオブジェクトの構築に必要なデータを持っている場合。
- 構成されたオブジェクトがコンポーザーをリッスンする場合。
この決定を下すとき、あなたは何を求めますか?
java - 委任、構成、集約の区別(Java OO Design)
私は、委任、構成、および集約を互いに区別し、一方を他方の上に使用するのが最善である場合を特定するという継続的な問題に直面しています。
私はJavaOOAnalysis and Designの本を調べましたが、まだ混乱が残っています。主な説明はこれです:
委任:オブジェクトが別のオブジェクトの機能を変更せずにそのまま使用する場合。
構成:私のオブジェクトは他のオブジェクトで構成されており、オブジェクトが破壊された後は存在できなくなります-ガベージコレクション。
集約:私のオブジェクトは、私のオブジェクトが破壊された後でも生きることができる他のオブジェクトで構成されています。
それぞれのケースを示すいくつかの簡単な例と、その背後にある理由を示すことは可能ですか?私のオブジェクトが単に別のオブジェクトへの参照を持っている以外に、これらの例を他にどのように示すことができますか?
haskell - Haskellの構成(。)とF#のパイプフォワード演算子(|>)
F#では、pipe-forward演算子の使用|>
が非常に一般的です。しかし、Haskellでは(.)
、関数の合成が使用されているのを見たことがあります。それらが関連していることは理解していますが、Haskellでパイプフォワードが使用されていないという言語上の理由はありますか、それとも他の何かですか?
perl - 継承または構成を使用する必要がありますか?
これは短くしたいと思います。と という 2 つの部屋を持つ HouseA を構築しますBedRoom
。StudyRoom
これらは両方とも という基本クラスから派生していRoom
ます。
BedRoom
とStudyRoom
呼ばれる同じ親がありHouse
ます。また、家のどの部屋も、親を介してのみ他の部屋にアクセスできます。BedRoom
のいずれかの属性にアクセスする必要がある場合は、(親) をStudyRoom
介してのみアクセスする必要があり、House
その逆も同様です。
ここでの問題: たとえば、別の家 (たとえばHouseB
) を建設するとします。これは上記とまったく同じですが、1 つの変更点があります。BedRoom
2 つの別々の部屋 (つまりと)は必要ありませんStudyRoom
が、代わりに、MasterRoom
これらの両方の設備を備えた単一の部屋 ( ) が必要です。コードの再利用性のために、次の設計オプションを考えることができます。
ここで、 用に作成したBedRoom
との属性を再利用できなくなります。とにかく、とのほとんどの属性を再実装する必要があるため、コードが重複することに注意してください。StudyRoom
HouseA
BedRoom
StudyRoom
MasterRoom
BedRoom
このように、コードの大部分を再利用できるようにコンポジションを使用します (再利用できるコードが数千行あります) logicalBedRoom
。メソッドをオーバーライドして、何もしないようにします。たとえば、Bedroom->noOfSides() = 4
とlogicalBedRoom->noOfSides() = ??
. これは継承の適切な使用ですか?
私の実際の設計は、2 つの個々のチップの機能を組み合わせた複雑なチップです (私は House (マザーボード) と Room (チップ) の類推を使用しました)。私はオブジェクト指向 Perl でコードを書いていますが、別の設計案があれば本当にありがたいです。
ありがとう
objective-c - 二重構成と継承にどう対処するか?
この関連する質問を見つけました:継承でコンポジションを使用するにはどうすればよいですか?
Objective-C でも同じことをしたいと思います。つまり、 aはGenericView
そのプロパティobj
が GenericObject であるSpecializedView
ことを知っており、 a はまったく同じobj
プロパティが であることを知っていSpecializedObject
ます。
より明確になる例を次に示します。
SpecializedView
ご覧のとおり、マシンのプロパティはElectricalMachine
ではなく であるため、最後にエラーが発生しますToaster
。
ご助力ありがとうございます!
古い質問
これが私の質問の最初のバージョンです。
私は次の一般的な見解を持っています:
また、次の特殊なビューもあります。
次のオブジェクトがあります。
および次の特殊なオブジェクト:
GenericView で GenericObject を処理し、SpecializedView でそれが SpecializedObject であることを認識して同じオブジェクトを処理するとします。
実装を示して説明しましょう。
GenericView doSomething
SpecializedView doSomethingElse
次の警告が表示されます: 'GenericObject' may not response to '-toastBread' および次のエラー: Incompatible types in assignement
obj の型を GenericObject として定義したので、これは論理的です。GenericView では GenericObject のメソッドを、SpecializedView では SpecializedObject のメソッドを使用できるようにしたいと考えています。プロパティを追加せずに、obj が処理される GenericView の GenericObject である必要があり、SpecializedView で処理される SpecializedObject である必要があることを正確にする方法はありますか? どうやってそれをしますか?
c# - RSS Feed クラスと FeedItem クラスを使用した循環構成パターン
RSS フィードを解析するための小さなシステムを設計しています。Feed と FeedItem の 2 つのクラスがあります。
フィードには FeedItem があり、FeedItem には親フィードがあります。FeedItem クラスに親 Feed メンバーを与えるのは悪いパターンでしょうか:
だから私はこれを行うことができます:
または、これら 2 つのクラス間のこの循環参照を避けるために、親 Feed を介してのみ FeedItem を取得する必要がありますか?
c++ - C++ テンプレート化されたリターン
「コンポーネント」(コンポジションFTW)を保持する「エンティティ」に基づいて構築されたプログラムがあります。
コンポーネントには、スクリプト、アセットなど、さまざまなタイプが含まれる場合があります。
エンティティには文字列のマップと実際のコンポーネントがあり、タイプ名でコンポーネントを検索できます。
という関数が欲しい
文字列と型名を受け取り、要求された型付きコンポーネントを返します。
C++ テンプレートでそのようなことを行うことは可能ですか? 上記は明らかに機能しません。どうすればよいかわかりません。
ありがとう
編集:
私は工場を探していません。
エンティティは、さまざまなタイプのコンポーネントのインスタンスを保持します。現在、これは
と
そのインデックスは同じであることが保証されています。おそらく、後で適切なマップを書きます。
GetComponent が、Entity によって ComponentList に保持されている型名の既にインスタンス化されたコンポーネントへの適切に型指定された参照を返すようにしたいだけです。
java - Eclipse を使用した合成用のコード生成
効果的な Javaは、他の情報源とともに、継承よりも構成を使用することを検討すべきであることを示唆しています。私は、 Decorator パターンを使用し、呼び出しをラップされたオブジェクトに委譲する転送メソッドを実装することで、このような構成を実現していることによく気づきました。
ただし、次のような単純な転送メソッドを多数作成していることに気付くことがよくあります。
Eclipse (3.4.x) 内でこれらの転送メソッドを自動生成する方法はありますか?