問題タブ [object-design]

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 投票する
3 に答える
31806 参照

c++ - クラスメンバーとしての std::mutex と std::recursive_mutex の比較

私は何人かの人々が嫌いなのを見てきましたrecursive_mutex:

http://www.zaval.org/resources/library/butenhof1.html

しかし、スレッド セーフ (mutex 保護) であるクラスを実装する方法を考えると、mutex で保護する必要があるすべてのメソッドが mutex で保護され、mutex が最大 1 回ロックされることを証明するのは非常に難しいように思えます。

したがって、オブジェクト指向設計では、(1 つのリソースのみを保護するために) 1 か所でのみ使用されない限り、std::recursive_mutexデフォルトであり、一般的なケースでパフォーマンスの最適化と見なされる必要がありますか?std::mutex

明確にするために、1 つの非静的ミューテックスについて話しています。したがって、各クラス インスタンスにはミューテックスが 1 つしかありません。

各パブリック メソッドの開始時:

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

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

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

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

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

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

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

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

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

また


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

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

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

oop - 別のクラスのクラスについてあまり知識を持たないようにする

私が書いているアプリケーションの設計について助けが必要です。アプリケーションでは、従業員はプロジェクト内で作業を予約できます (いわゆる予約オブジェクト)。予約オブジェクトには、オプションで予算を設定できます。予約オブジェクトの予算が使い果たされた場合、従業員はその予約オブジェクトで予約できてはなりません。

プロジェクト リーダーは、次の 2 つの方法のいずれかで予算額を設定する必要があります。

  1. 金額を表す 10 進数の設定
  2. 工数で金額設定

たとえば、予約オブジェクト X の予算は 10,000$ であると言えます。X の予算は、シニア 2.5 人日、ジュニア 3 人日、サポート 5.5 人日で構成されていると言っても過言ではありません。内部的には、工数は金額として計算されます (シニアの価格の 2.5 倍 + ジュニアの価格の 3 倍 + サポートの価格の 5.5 倍)。工数は何らかの計算機ですが、永続化する必要があるため、UI だけではありません。

問題は、工数予算が予約オブジェクトをあまり知らずに、工数予算に価格を注入する方法です。各予約オブジェクトは、レベル (「シニア」、「ジュニア」、「サポート」など) に対して異なる価格を持つことができます。

私は次のクラスを思いつきました。

金額と工数の 2 つの特別なクラス。

クラスのコンシューマーは、次のように記述できるようになりました。

便宜上Budget.Amount、具象クラスでのプロパティの実装と の定義も公開しましたManDay

アプリケーション内の他のオブジェクトにも予算があるという要件があります。それはまだ明確ではありません。ManDayBudget価格検索ロジックについてあまり知らず、オブジェクトの予約について何も知らないほうがよいように、クラスをどのように設計すればよいでしょうか。計算を行うクラスが欠けているような気がします。

編集:

消費者がすべきこととできることを明確にするために:

予約オブジェクト X ( ) の金額はbo_x.Budget.Amount7.600 で、Y の金額は 9.200 です。これは、予約オブジェクトごとに異なる価格が定義されているためです。消費者は、これだけの工数予算を言いますが、それ以上は何も言いません。しかし、後でクラスを再利用するために、BookingObject についてあまり知識がなくても、何らかの方法で金額を計算する必要があります。

編集2:

X はシニアの価格を 100 に、ジュニアの価格を 80 に、などと設定することができ、Y はシニアの価格を 125 に、ジュニアの価格を 100 に設定することができます。日 2 つの予約オブジェクトの金額が異なります。

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

.net - TDD と CodeFirst (Entity Framework)

この質問は、データ アクセスやリポジトリをテストする方法に関するものではありません。プロジェクトで(TDDで作成した)POCOクラスを使用したいときに発生する問題についてです。つまり、これは Linq to Entities の制限による問題です (または、クラスの設計に関する私の問題かもしれません)。

TDD を通じてたどり着いたクラスは次のとおりです (もちろん、非常に単純化されています)。

シンプルですね。

それで... では、何が問題なのですか?見てみましょう...データベースからコースのすべてのデータを取得したい場合(コースクラスには現実モデルに多くのサブコレクションがあります) 、それらにフィルターを適用する場合、私ができる唯一の方法は次のようでした:

ご存じのとおり、 GetGreatStudents()関数が原因でエラーが返されます。

LINQ to Entities はメソッドを認識しません [...] このメソッドはストア式に変換できません。

つまり、メソッドを.Where(n => n.Average > 8)に直接置き換えることができることはわかっていますが、それはひどいものです (実際には多くのフィルターがあります)。ビルドしてテストした API を使用できない場合、TDD を使用しますか?

そこで私の質問は、TDD と Entity Framework を使用した開発経験のある方に、Linq to Entities を使用するときに、TDD を介して設計した美しい API をどのように使用できるでしょうか?

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

oop - クラス インターフェイスの設計に関する意思決定

次の問題について、他の人から考えてもらいたいと思います。Products と Items という 2 つのクラスがあるとします。Products オブジェクトを使用すると、任意の Item オブジェクトにアクセスできます。これが例です。

アイテムの状態を更新/保存する最良の方法は何でしょうか? 2 つのオプションが表示されます。

また

最初のアプローチは非常に簡単に思えます。Item オブジェクトの属性が設定されると、save メソッドを呼び出して変更が保持されます。

一方、後者のアプローチの方が優れているように感じます。2 つのオブジェクトの役割を分離しています。Item オブジェクトには状態のみが含まれ、 Products オブジェクトはその状態で動作します。このソリューションは、単体テストの作成にも適している場合があります。何かご意見は?

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

c++ - 純粋仮想を再度実装せずに派生クラスを強制する

Aいくつかの基本的な機能を定義するインターフェイス クラスを定義しました。私の実装では、A0このインターフェイスを実装する基本クラスがあり、この基本クラスから階層内の他のいくつかのクラスを派生させました。

ご覧のとおり、それぞれの実装にのみ関連する特別な関数を定義するIContainerReaderおよびIContainerWriterクラスを定義しました。

しかし、今は問題があります。なぜなら、リーダーまたはライターが常にコンテナー ベースも持っていることを確認したいからです。したがって、論理的な解決策は、から派生することIContainerReader/-WriterですIContainerReader/Writerしかし、これを行うと、オブジェクトが基本クラスを介して既に定義されている基本関数も再度実装することを期待しているため、コンパイラは不平を言います。しかし、これらのオブジェクトの 1 つへのポインターからIContainerReader派生させない場合、その機能も保証されません。IContainerIContainer

このようにコンパイルしようとすると、エラーが発生しますIContainerReaderIContainer

ただし、あるべき姿IContainerReaderから派生すると、次のエラーが発生します。IContainer

したがって、コンパイラは、派生クラスの基本クラスからのすべての関数も再実装することを期待しています。

Reader/Writer クラスでこれらすべての関数を再度定義することなく、これに対する解決策はありますか? もちろん、基本クラスにまで下がるダミーを実装することもできますが、これは少し不器用で不必要なオーバーヘッドであると考えており、これに対するより良い解決策があることを願っています。

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

python - Pythonでネストされたジェネレーター構造を作成するには?

ImageSeries特定のパターン (xy のすべての値、z のすべての値) で画像を取得するオブジェクトを作成しようとしています。ジェネレーターをタスク リストに追加するメソッドを呼び出して、これを行うには、ジェネレーターを 2 つの for ループに通します。

しかし、私の 2 番目のタスクは、最初のタスクの最初の繰り返しの後に使い果たされてしまいます。これは私の望む結果ではありません。2 番目のタスクが最初のタスクのすべての反復を実行するようにします。

このようなパターンをプログラムする効率的な方法があるかどうか疑問に思っていました。

現在の出力:

期待される出力: