問題タブ [design-principles]

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

c# - 読み取りと書き込みを組み合わせたファクトリパターンの実装

私は正しい方法でアプリケーションを設計しようとしています、それはすべきです

  1. SQL Serverから請求書データを読み取ります(請求書の種類に応じて2つのクエリ:販売または購入)
  2. それを処理します(AcmeはSugarCorpよりも少ないフィールドを必要とし、異なるフォーマットである可能性があります)
  3. txtまたはcsvを出力します(将来変更される可能性があります)

ファクトリパターンが役に立ったので、懸念に応じてUML図を作成しました。

UML図

それぞれがまたは(それらに固有)をInvoiceFactoryProvider生成できます。とメソッドを呼び出す必要があります。PInvoiceSInvoiceCreatePInvoice()CreateSInvoice()load()save()

load()SQLReaderクラスと組み合わせて、各行をPInvoiceオブジェクトとして取得するにはどうすればよいですか?そしてsave()私のIDataWriterインターフェースで。いくつかの例/アドバイスを提供できますか?

編集:

Atulが提案したように、ブリッジパターンの例を確認した後、それを使用してこの問題のクラス図を作成しました。これは次のようになります。

UML図-ブリッジパターン

InvoiceSQLクエリは異なる場合があり(アプリケーションは異なるシステムから請求書データをロードする場合があります-PollosInvoiceまたはStarInvoice)、それらの処理方法(異なる実装)。

この場合、抽象化Invoiceをその実装から切り離し、請求書を特定のソフトウェアにエクスポートします(AcmeExporterまたはSigmaExporter)。AcmeExporterまたSigmaExport、InvoiceのDataTableから取得したトランザクションの日付、支払い方法、請求書の種類などの仕様に従ってフィールドを設定します。ExportInvoice()必要なデータを返しDataTableます。InvoiceExporterまた、エンコーディングとファイル形式に2つのインターフェイスを使用しています。

あなたはそれについてどう思いますか?どのような欠陥/利点がありますか?

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

c++ - イベントシステム-フォークなしのQtのシグナル/スロットのような-C++

フローをフォークするためのステートメントで何度も繰り返される本当に不快なサイクルを書くことなく、シグナルとシグナルとメソッド間の接続を処理するための強固なフレームワークを提供できるシステムを設計する方法を知りたいですアプリケーションの。

つまり、Qtなどのシグナルスロットメカニズムの背後にある理論を知りたいのです。

私は特別な理由なしにQtに名前を付けています。これはおそらく、このために最も使用され、十分にテストされたライブラリの1つであるため、C ++の世界でのリファレンスですが、このメカニズムの設計に関するアイデアはどれも良いでしょう。

ありがとう。

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

oop - C++ ゲーム設計の原則

私はstackoverが初めてで、これが初めての投稿なので、優しくしてください:-)

私はマルチレベルのシューティングゲームを開発している最中で、明示的に弾丸を管理するために、私の目的に最適な OOP 設計について質問しています。

通常、ゲームには複数のプレイヤーと複数の敵がいて、それぞれが弾丸を発射する銃を持っています。複数の弾丸、その位置、アニメーション、レンダリングなどを適切に管理する Bullet クラスがあり、これらは正常に動作します。

私の質問は、敵ごとにこれらの弾丸クラスのインスタンスをインスタンス化する方がよいですか、それともすべての弾丸を管理するレベルのインスタンスを 1 つインスタンス化する方がよいでしょうか (誰が発射したかに関係なく)?

単一のインスタンスの利点は、弾丸の管理とレンダリングを一度に最適化できることですが、どの弾丸が誰に属しているか、各敵に存在できる弾丸の数などを覚えておくために、追加の状態情報が必要です。疎結合ではありません。敵ごとに個別のインスタンスを使用する利点は、弾丸ごとに保存する必要がある状態情報が少なくて済みますが、敵またはプレイヤーごとに個別の呼び出しで管理およびレンダリングされることです。弾丸同士の衝突もより難しくなりますが、幸いなことに、これはこの特定のゲームの要件ではありません。

他の誰かが似たようなものを書いたことがありますか?どのように構成しましたか? 決定する前に考慮すべき要素と、そのためのゲーム デザインの原則はありますか?

よろしくニック

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

database-design - データベース内のデータの複製 - Web アプリケーション プロジェクト

私と 2 人の友人は、単純なソーシャル Web アプリのプロジェクトを開始しています。私を悩ませている問題は、Wallet2 人のユーザー間のすべてのトランザクション値の合計を格納する table があることです。

以前のバージョンからの経験に基づいて、ウォレット エントリを複製することにしました。したがって、合計で200 ドルのUser1借りがある場合、 2 つのエントリがあります。User2Wallet

これは、すべてのエントリを選択できるため、すべてのユーザーの債務とクレジットのリストを作成するときに役立ちますWHERE UserID=user。金額が正の場合、友人は私たちに借りがあり、負の場合は友人に借りがあります。

以前のコンセプトは次のようになりました。

200$をUser1支払うと、 User21 つのエントリが生成されます。

ただし、すべてのクレジットと負債を選択する必要がWHERE CreditorUserId=user OR DebtorUserID=userあり、それを表示するときに、現在のユーザーがどの列にリストされているかを確認し、それに応じて金額を変更する必要があります (正の金額はDebtorUser負っていることを意味しCreditorUser、負の金額は反対であるため、ウェブサイトで負債/クレジットを表示する場合User2、-200$ を列のとおり 200$ に変更する必要がありUser2ますDebtorUserID)。

データの複製ソリューションの方がはるかに簡単ですが、このプロジェクトは主に教育目的であるため、適切なプログラミング手法を使用することが優先されます。また、データの複製はそうではないと言う人もいます。どう思いますか?

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

java - javaでWebページ操作の呼び出しにオープンクローズド原則を使用するには?

ユーザーがフォームに入力して送信できる Web ページがあります。

サーバー側:

私はこのアーキテクチャが好きではありません。オープン クローズの原則に違反しているからです。これをリファクタリングして修正することは可能ですか? ありがとう。

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

java - Java の適切な継承アーキテクチャ

私は少し困惑しています。私は class を持っていanimalます。位置などの基本的なものを格納しているとしましょう。それで、smartAnimal拡張するクラスがありますanimalsmartAnimalユーザーの入力なしで意思決定できる機能を追加するとします。

今、私はdog拡張するクラスを持っていますanimalsmartAnimalその機能を必要としないため、拡張しません。これまでのところ、私はうまくいっています: adogは でanimalあり、 asmartAnimalanimalです。しかし今、私はsmartDogそれ拡張されることを望んでsmartAnimalsmartDogますが、dog. たとえば、通常dogの 、.sniff().poop()、およびの多くの機能.bark()は my にも含まれている必要がありますがsmartDog、Java では多重継承が許可されていないため、コードを文字通りコピーして貼り付けない限り、そうではありません。

私が持っていた場合、構成はエレガントではないようです:

class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }

animal...たとえば、位置などの「もの」を複製します。2 セットの位置変数を処理する必要があります。そして、 にあるプロパティの複製animal

複数のインターフェイスを継承することも、適切な解決策のようには思えません。たとえばdog、インターフェイス.sniff()、、、.poop()および.bark()の実装を変更して再実装する必要はなく、smartDog他のクラスのために再実装する必要がないからです。

ここでのベストプラクティスは何ですか? つまり、クラスdogsmartDog?の両方を持つことです。

編集:

いくつかのコメント/回答から、明確にさせてください。私の特定のプロジェクトでは、smartAnimal実際には、それを制御するニューラル ネットワーク全体があります。これは大量のコードであり、インターフェイスに抽象化する意味がありません。NN 機能のコアは、それを持っている動物に関係なく同じですが、各smartAnimalサブクラスは AI の「脳」の出力を異なる方法で実装します。逆に、各動物には独自の機能があり、人間が制御する場合でも、独自の AI エージェントが制御する場合でも同じように動作します。

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

c# - タイプは異なるが意味的には同等の 2 つのオブジェクトの比較を適切に実装する

似たような質問を見つけました

類似した特性を持つ 2 つの明確に異なるオブジェクトを比較する方法

それは暗黙のうちに、および/または部分的に私の質問に答えるかもしれません。

このオブジェクトを(多くのネストされた条件なしで)比較したいとします。

System.String。私は平等または不平等にのみ興味があります (アイデンティティに関する値の範囲ではありません)。

での実装IEquatable<string>ObjectA適切な選択ですか? 何がうまくいくかは気にしません。そのような場合の適切なパターンを特定したいと思います

その他の情報として、 のObjectAシーケンスとして提供されることが多いと考えてくださいIEnumerable<ObjectA>

インスタンスかどう"string" ==かを知る必要はありません。!= objectAソートは含まれません。

編集して明確にする(そして助ける)

申し訳ありませんが、良い質問を書くのは難しい場合があります...

ObjectA比較のために文字列として表すことができないとします (カプセル化に違反することはオプションではありません)。

  • context-1 では、それを と照合する必要がありPropertyYます。

  • PropertyYcontext-2 では、 /に適用されるアルゴリズムと照合する必要がありますPropertyZ

質問の最後にある@Oliverソリューションは、私を再び助けてくれます(そして再び+1します)。カスタム インターフェイスを簡単に定義できます。

私もObjectB同じロジックで異なるプロパティを持っているので、両方ともRAPに違反しないように実装しますIContextConverter(または、より良い名前を見つけることができます) 。

0 投票する
4 に答える
779 参照

c# - 他のコードへの呼び出しは (SOLID) 単一責任原則 (SRP) 違反ですか?

このクラスをビジネス ロジックで考えると、次のようになります。

このクラスにはいくつかのビジネス ロジックが含まれており、いくつかの分野横断的な問題も実行されます。このクラスがオープン/クローズドの原則に違反していることは間違いありませんが、このクラスは単一責任の原則に違反していますか?

クラス自体は、ユーザーの承認、パフォーマンスのプロファイリング、およびトランザクションの処理を担当していないため、私には疑問があります。

クラスはまだ(静的に)これらの分野横断的な懸念に依存しているため、これが貧弱な設計であることに疑いの余地はありませんが、それでも:SRPに違反していますか?もしそうなら、これはなぜですか?