問題タブ [object-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.

0 投票する
2 に答える
620 参照

c++ - コンポジション クラス C++ の冗長コード

私はC++を手に入れようとしています。私の「練習」プログラムがヒットするまで、すべてが順調に進んでいました。その障害は、設計上の問題に起因すると私は信じています。

ブラックジャック(21)を考えてみてください。いくつかのクラスを作りました。

  1. カード
  2. デッキ
  3. プレーヤー

デッキは、単純化のために、カードの配列を持っています。
-すべてのカードを表示できます
-シャッフル
できます-カードを削除できます

手札はデッキです -利点があり ます -
手札の価値を計算できます
-手札にカードを追加できます

さて、私の問題に取り掛かります-プレーヤーのデザイン

-プレーヤーにはハンドがあります (プライベート アクセス)
プレーヤーに関する私の問題は、ハンドに addCardToHand というメソッド関数があることです。addCardToHand(Card c) という Player メソッドを作成して、同じメソッドを呼び出して手元に渡すと、冗長性/設計の悪さを感じます。

また


Hand h をパブリック アクセス可能なメンバーとして宣言し、「main()」でPlayer p のようなことを行い ます。
カード aCard;
phaddCard(カード);

どんなアドバイスも啓発的であり、高く評価されます。私が学んでいることを覚えておいてください。

0 投票する
2 に答える
1440 参照

java - Java - 変数が静的なときに ClassName.this.variable が機能するのはなぜですか?

「これ」がどのように機能するかを完全に理解しようとしています。前回の投稿で、「this」キーワードを使用する理由がわかりました。

静的についての私の理解は、クラスにはそのメンバーのコピーが 1 つあるということです。「this」は、現在のオブジェクトを表すために使用されます。すべてのオブジェクトで、静的メンバー変数は同じですが、なぜ「これ」が静的メンバー変数で機能するのですか?

コード:

また、setVar メソッドでは、ClassName.this を使用してオブジェクトの値を操作できますが、setter を使用した方がより明確であるため、より良いと思います。ここで「これ」を使用する利点はありますか?

説明しようとしているものの例を示すコードを投稿してください。

0 投票する
3 に答える
783 参照

java - getter メソッドを介してオブジェクトの状態を変更することは一般的に悪い習慣と考えられていますか?

私はこれまでの開発中に、このことについてしばらく考えてきました。

私はそのようなことをすることに反対しています。通常、ロジックを明示的に処理する別のメソッドを宣言しています。

例えば

クラスにオブジェクトのリストを返すメソッドがある場合、getter メソッドを介してこのコレクションを直接変更するのは悪い考えだと思います。

次のことを行うことは悪い習慣だと思います:

次のアプローチを使用します。

ただし、もう1つ頭に浮かぶのは、構成オブジェクトにもゲッターとセッターがある場合、他の人を防ぐことはできないということです

ReportGenerator の getter メソッドを使用して Configuration オブジェクトの状態を変更することはできますが、これは許可すべきではないと思います。しかし、これを防ぎたい場合は、ReportGenerator クラスでさらに多くのメソッドを宣言して、呼び出しを Configuration オブジェクトに転送し、防御コピーを使用する必要があります。

私の質問は、コンポジションを使用して別のオブジェクト B を含むオブジェクト A があり、両方にゲッターとセッターがある場合、A のゲッター メソッドを介してオブジェクト B の状態を変更することを好みますか? 例えば

または、B の状態を変更するために A にメソッドを追加することを好みますか (基本的に B への呼び出しを転送します)

例えば

このメソッドの内部では、A call B.setTitle("");

長い質問で申し訳ありませんが、正確に何を聞きたいのかよくわからないと思います。あなたが理解することを願って。:P

0 投票する
1 に答える
78 参照

architecture - goオブジェクトの構成を理解するのに問題があります

私は現在、同時実行プリミティブが優れているため、ゲーム サーバーを実装するために go を使用しています。それはすべて簡単に実装でき、非常に確実に機能します。私は主に Java のバックグラウンドを持っていますが、Java の型階層を忘れるのに苦労しています。位置、速度などの同様のデータ構造をすべて共有するゲーム オブジェクトのコレクションが必要ですが、それらはすべて、更新メソッド内で異なる動作をしたり、異なる機能を許可する特別なフィールドを持つ場合があります。最初は、すべての共有データを含む構造体があり、各カスタム型はその構造体を埋め込んでいました。問題は、組織にデータ構造を使用することです。四分木を使用して、クライアントに近くのオブジェクトの状態を通知します。このようにして、各ゲーム オブジェクトの埋め込まれた構造体へのポインタをツリーに渡すことができ、すべてが機能します。

これの問題は、四分木を照会すると、含まれている型にアクセスできないことです。たとえば、

ここで、オブジェクトの状態について近くのプレイヤーを更新したい場合、四分木を照会しますが、ゲームオブジェクトが実際にクライアントであるかどうかを判断する方法があり、パケットを送信するための接続にアクセスする方法がありません。

Java から、基本クラスを作成し、それをクライアント用にサブクラス化することに慣れています。次に、instanceof特別な処理が必要なものを特定し、それに応じてキャストしてカスタム機能にアクセスできます。次のようなことができると思います。

この方法では、型アサーションを使用してクライアントを分離できますが、これにより、他のゲーム オブジェクトを実装するための多くの重複コードが発生します。go でこのようなことを行うには、もっと慣用的な方法があると思います。これが正しい方法である場合、誰かがこの設計の背後にある理由を理解するのを手伝ってくれるかもしれません.

0 投票する
1 に答える
1585 参照

c++ - 代替 PImpl イディオム - 利点と欠点?

従来の PImpl イディオムは次のようになります。

ただし、楽しみのために、代わりにプライベート継承を使用してコンポジションを使用しようとしました。

[Test.h]

[最初の翻訳単位]

[第 2 翻訳単位]

http://ideone.com/WcxJu2

この代替バージョンの動作は気に入っていますが、従来のバージョンよりも大きな欠点があるかどうか知りたいですか?

編集: DyP は、さらに「きれいな」別のバージョンを親切に提供してくれました。

0 投票する
2 に答える
1039 参照

java - より良い方法は何ですか?ダウンキャスティング?インターフェース?抽象クラス?

全て、

私はこれを間違っている必要があります。当時は良いアイデアのように思えましたが、深く掘り下げていくにつれて、より適切なプログラマティックな方法があると思います。そこでお聞きします...

1 つのメモ。この情報を保存するために Google AppEngine とデータストアを使用しています。

わかりました... 車両のスーパー クラスがあり、それには 3 つのサブクラスがあります... 車、トラック、オートバイ。

スーパークラスには、メーカー、モデル、タイプの 3 つのプロパティがあります。

たとえば、次のようになります。

  • メーカー: フォード
  • モデル: フォーカス
  • タイプ: 車

したがって、データストアには、これらのプロパティを持つ多数の Vehicle エンティティがあります。したがって、ユーザーがすべての車を見たい場合は、「車」タイプですべてをプルします。

ユーザーがこれらの車両の 1 つを「お気に入り」リストに追加したい場合は、車両オブジェクトをそのタイプに基づいて特定のサブクラスに変換します。これにより、その特定のサブクラスの追加のプロパティが追加されます。

この新しい子エンティティは、追加されたプロパティとともにデータストアに保存されます。

つまり、基本的には、たとえば、Vehicle から Car にダウンキャストしています。これは、引数として Vehicle を取る Car クラスに追加のコンストラクターを作成することで実現しました。作成されると、Car オブジェクトにはすべてのプロパティ (Manufacturer、Model、Type) が設定され、特定の実装に付属するすべての新しいプロパティが設定されます。

これは複雑で間違っているようです。それは機能しますが、これを行うためのより良い方法が必要です。

この方法を選択した主な理由は、GAE データストアの仕組みにあります。スーパークラスとその制限されたプロパティを保存してそれらをクエリする方が「安価」です。長い話。

このためにインターフェイスや抽象クラスを使用して頭を包み込もうとしていますが、すべての入力を取得したかったのです。

助けてくれてありがとう。

0 投票する
1 に答える
62 参照

javascript - Angular でアプリケーションを構築する構成アプローチ

HTML コードからのデータを使用して角度コントローラーを接続する方法は?

コンポーネントを相互に接続してアプリケーションを構築できるサーバー側フレームワークがあります。これらのコンポーネントの一部は、わずかな HTML マークアップに変換されます。他のコンポーネントは、最初の種類のコンポーネントのデータのみを提供します。この部分の技術的な詳細は重要ではありません。

例: サーバーには VideoPlayer と PlayButton の 2 つのコンポーネントがあります。PlayButton は VideoPlayer に接続されています。ページがレンダリングされると、 VideoPlayer は になり<div id="the_player" class="flowplayer">...</div>、 PlayButton は になり<button data-player-id="the_player">...</button>ます。そのため、ボタンのオンクリック ハンドラーはdata-player-id、プレーヤーを検索して再生させるために使用できます。VideoPlayer ID ( the_player) は、サーバー上の接続を使用してコンポーネント間で渡されるため、2 つのプレーヤーと複数のボタンを使用して、各ボタンが指定されたプレーヤーのみを制御することができます。これらの接続は JavaScript コードで指定されていないため、コンポーネントの接続を変更しても JavaScript コードにはまったく影響しないことに注意してください。

質問: Angular コントローラーを使用してそのようなことを行うにはどうすればよいですか? Angular DI は単純すぎて、サービスの種類ごとに 1 つのインスタンスしか想定していません。コントローラーと HTML DOM 間の双方向バインディングが気に入っています。これにより、ウィジェットが非常にシンプルになります。しかし、そのようなウィジェットを HTML 属性でアドレス指定されたデータ ソースに接続するにはどうすればよいでしょうか?