タグ付けされた質問 「design-patterns」

設計パターンは、ソフトウェア設計で一般的に発生する問題に対する一般的な再利用可能なソリューションです。

5
抽象化に依存することに重大な欠点はありますか?
私はこのウィキを安定した抽象化の原則(SAP)で読んでいました。 SAPは、パッケージの安定性が高いほど、抽象的である必要があると述べています。これは、パッケージの安定性が低い(変更される可能性が高い)場合、より具体的であることを意味します。私が本当に理解していないのは、これが事実であるべき理由です。確かにすべての場合において、安定性に関係なく、抽象化に依存し、具体的な実装を隠す必要がありますか?

6
switchステートメントでswitchを減らす方法は?
データベースから2人に基づいて挨拶文を作成する方法を作成しています。 4つのパラメーターがあります。2つの名前(name1およびname2)および2つの性別(genderおよびgender2)です。 性別の組み合わせごとに、ある種の異なる出力があります。 たとえば、性別1がM(男性)で、性別2もであるM場合、出力は次のようになります。 Dear Sir name1 and Sir name2, 現時点では、私のスイッチは次のようになります。 switch(gender1){ case 'M': switch(gender2){ case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break; case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break; case 'R': ... } break; case 'W': switch(gender2){ case 'M': printf("Dear Madame %s …

4
階層を強制せずに、オブジェクトを相互に作用させて通信するにはどうすればよいですか?
これらのとりとめのない質問で私の質問が明確になることを願っています。ただし、そうでない場合は完全に理解できます。その場合はその旨をお知らせください。さらに明確にしていきます。 オブジェクト指向のゲーム開発に精通するために私が作成した非常に単純なゲームであるBoxPongに出会ってください。ボックスをドラッグしてボールを操作し、黄色い物を集めます。 BoxPongを作成することは、とりわけ、基本的な質問の策定に役立ちました。互いに「所属する」必要なしに、互いに対話するオブジェクトをどのようにして持つことができますか?言い換えれば、オブジェクトが階層的ではなく、代わりに共存する方法はありますか?(以下でさらに詳しく説明します。) オブジェクトの共存の問題はよくある問題だと思うので、解決する確立された方法があるといいのですが。私は四角いホイールを作り直したくないので、私が探している理想的な答えは「ここに、あなたの種類の問題を解決するために一般的に使用される設計パターンがある」と思います。 特にBoxPongのような単純なゲームでは、同じレベルで少数のオブジェクトが共存している、または共存している必要があることは明らかです。箱があり、ボールがあり、収集品があります。オブジェクト指向言語で表現できるのは、厳密なHAS-A関係だけですが、そうです。これは、メンバー変数を介して行われます。私は単に始めてballそれを実行させるだけではなく、永久に別のオブジェクトに属している必要があります。メインのゲームオブジェクトは、そのので、私はそれを設定した持っているボックスを、ひいてはボックスがありたボールを、そして持っているスコアカウンターを。各オブジェクトには、update()位置、方向などを計算するメソッドと同じように移動します。メインのゲームオブジェクトのupdateメソッドを呼び出します。このメソッドは、すべての子のupdateメソッドを呼び出し、次に、すべての子のupdateメソッドを呼び出します。これがオブジェクト指向のゲームを作るために私が見ることができる唯一の方法ですが、それは理想的な方法ではないと感じています。結局のところ、私はボールをボックスに属していると正確に考えるのではなく、同じレベルにいて、それと相互作用していると考えています。これは、すべてのゲームオブジェクトをメインゲームオブジェクトのメンバー変数に変換することで実現できると思いますが、何も解決しないと思います。つまり...明らかな混乱をさけて、ボールとボックスがどのようにしてがお互い知る、つまり相互作用か? また、オブジェクト間で情報を渡す必要があるという問題もあります。私はSNESのコードを書くのにかなりの経験があります。そこでは、実質的に常にRAM全体にアクセスできます。スーパーマリオワールドのカスタム敵を作成していて、マリオのコインをすべて削除して、ゼロを格納して$ 0DBFに対処したいとします。問題ありません。敵がプレイヤーのステータスにアクセスできないという制限はありません。C ++などでは、他のオブジェクト(またはグローバル)から値にアクセスできるようにする方法に疑問を感じることが多いので、私はこの自由に甘やかされていると思います。 BoxPongの例を使用して、ボールが画面の端から跳ね返るようにしたい場合はどうなりますか?widthそして、heightのプロパティであるGameクラスは、ballそれらにアクセスできるようにします。これらの種類の値を(コンストラクターまたは必要なメソッドを介して)渡すこともできますが、それは私にとって悪い習慣であるだけです。 私の主な問題は、お互いを知るためにオブジェクトが必要であるということですが、それを行うために私が見ることができる唯一の方法は、厳密な階層であり、これは醜く非実用的です。 私はC ++の「友達クラス」について聞いたことがありますが、それらがどのように機能するかは知っていますが、それらが最終的な解決策である場合、どうして表示されないのですか friendすべてのC ++プロジェクト全体にキーワードが注がれて概念はすべてのOOP言語に存在するわけではありませんか?(私が最近学んだばかりの関数ポインターについても同じことが言えます。) あらゆる種類の回答を事前にありがとう—そして、あなたに意味をなさない部分があれば、私に知らせてください。

1
「フラックス」と純粋な関数型反応プログラミングの間にはどのような関係がありますか?
Fluxは、私が理解している限り、アプリケーションのデータフローを一方向で処理し、状態をプログラムの残りの部分から分離した、読み取り専用の自己完結型の「ストア」で維持する手法です。ビューによって発行され、ディスパッチャーによってディスパッチされる「アクション」。または、要するに-状態を制御する方法。 それが正しい場合、関数型反応型プログラミングとどのように相関しますか?FRPは状態を非常に強力に制御するため、これらは実際に同じ問題を解決する相互に排他的な手法だと思います。したがって、FRPライブラリ(Elmなど)を使用する場合、Fluxはほとんど使用されません。これは正しいです?

4
このシナリオでは訪問者パターンは有効ですか?
私のタスクの目標は、スケジュールされた繰り返しタスクを実行できる小さなシステムを設計することです。定期的なタスクとは、「月曜日から金曜日の午前8時から午後5時まで、毎時間管理者にメールを送信する」のようなものです。 RecurringTaskという基本クラスがあります。 public abstract class RecurringTask{ // I've already figured out this part public bool isOccuring(DateTime dateTime){ // implementation } // run the task public abstract void Run(){ } } また、RecurringTaskから継承されたクラスがいくつかあります。それらの1つはSendEmailTaskと呼ばれます。 public class SendEmailTask : RecurringTask{ private Email email; public SendEmailTask(Email email){ this.email = email; } public override void Run(){ …

3
データ型のインターフェースの使用はアンチパターンですか?
モデルに(EFを使用して)さまざまなエンティティがあるとします(ユーザー、製品、請求書、注文など)。 エンティティが事前に決定されたセットに属しているアプリケーションでエンティティオブジェクトの要約を印刷できるユーザーコントロールを作成しています。この場合、ユーザーと製品の要約を要約できると言います。 要約にはすべてIDと説明しか含まれないため、このための簡単なインターフェースを作成します。 public interface ISummarizableEntity { public string ID { get; } public string Description { get; } } 次に、問題のエンティティについて、このインターフェイスを実装する部分クラスを作成します。 public partial class User : ISummarizableEntity { public string ID { get{ return UserID.ToString(); } } public string Description { get{ return String.Format("{0} {1} is from {2} and is …

1
メニュー構築パターン
メニューがルーティングに使用されていない場合、メニューのアクティブ状態の処理に頭を悩ませています。 メニューシステムがルーティングも処理するDrupalから来ました。したがって、アクティブ状態とアクティブトレイル状態の設定は、ルートによって処理されます(これはメニューレンダリングシステムとしても機能します)。 現在、多くのPHPフレームワークには、ルーティングを処理するルータークラスがあります。メニューはPOSTを認識してはならないため、これは良い分離のようです|| オプション|| ... リクエスト。 しかし、フロントエンドを書いているとき、メニューをハードコーディングしていることに気づきました。または、すべてをDBに保存し、それらの値をビューに渡します。このアプローチが嫌いなのは、ルーターで既に書き込んだもののコピーを作成しているが、現在はMenuクラスを使用していることです。 例: Route::get('/somewhere','routename.somewhere','showStuffController'); Route::post('/somewhere','routename.somewhere','saveStuffController'); Menu::add('label.somewhere','routename.somewhere'); ここで懸念を分離しているので、それは素晴らしいことです。しかし、MenuはRouteに大きく依存して、アクティブ状態を設定します。メニューは、アクティブトレイルを設定するための階層についても知る必要があります。 つまり、アクティブなトレイルとアクティブなステータスクラスを設定することは、実際にはビューのことです。しかし、 if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; } あなたの意見の至る所で愚かに思えます。次に、迷惑なアクティブトレイルをすべて追加します。ビューがレンダリングされる前にそれを処理し、active-trailフラグをtrueに設定することは、私が知っている方法では非常に醜いようです(すべての子をループするforeachループ、...) 私の質問は: このよりきれいな、より良い、...を得るパターンまたはスマートな方法はありますか?アクティブトレイルの「問題」をどのように処理する必要がありますか? 子->親のレンダリングを考えていました。したがって、最も深いレベルの広告から始めて、次の段階に進みます。しかし、子供はその親について知っていますが、親は自分の子供については何も知りません(変なようです)。

1
APIとアプリケーションの間でオブジェクトを共有するためのパターン
私のWebアプリケーションの設計について深刻な疑いがあります。 ビジネスロジックをインターフェイスから分離したかったので、データベースへのすべての要求を処理するWeb APIを作成しました。 これは、エンティティフレームワークと作業ユニットおよび汎用リポジトリパターンを備えたASP.NET Web APIです。これまでのところ、すべてが良好です。 問題 ヘルプが必要なのは、APIとアプリケーションの間でオブジェクトを共有する効率的な方法がわからない場合です。 エンティティオブジェクトを直接シリアル化したくありません。エンティティモデルが変更された場合、理由もなく大きなオブジェクトをシリアル化してしまう可能性があるため、これは悪い習慣だと思いました。 現在どのように実装されているか インターフェイスはC#のASP.NET Webアプリケーションであり、APIはC#であるため、共有したいすべてのクラスの定義を含む共通ライブラリを作成しました。 私はAndroidアプリを開発するときにソリューションが機能しないことを知っています。Javaでクラスを再度作成する必要がありますが、それは私の最大の問題ではありません。 問題は、常にオブジェクトを変換しているような気がすることです。 例 これが私のワークフローの例です: すべてのオブジェクトとフォームのデータ注釈を含むモデルから始め、ユーザーはそのモデルをコントローラーにPOSTします。 コントローラーでは、このモデルを共通ライブラリーのクラスに変換してから、そのオブジェクトをAPIに送信する必要があります。 次に、私のAPIのコントローラーが呼び出しをキャッチし、そのオブジェクトをエンティティオブジェクトに変換して、データベースを更新します。 だから私は3つのクラスを持っています 検証用のすべてのデータ注釈を含むビューのモデル(クライアント) オブジェクトを共有するための共通ライブラリクラス(DLL) エンティティークラス(API) 何か間違ったことをしているような気がします。よりエレガントなものはありますか?プロジェクトが大きくなりすぎる前に、この問題に対する適切な解決策があることを確認したいと思います。

2
JavaScript MVCアプリケーションの設計(キャンバス)
JavascriptのアプローチのようなMVCを使用してキャンバスアプリケーションを構造化/構築する方法を理解するのが困難です。UIはかなり流動的でアニメーション化され、ゲームはかなり単純化されていますが、トゥイーンとアニメーションに重点が置かれています。MVCがどのように機能するかは原則的にわかりますが、実際には機能しません。私はこれからバガリーをグーグルで検索し、ひどいことを読んだので、始めたときと同じように混乱しています。 アプリケーション領域に関するいくつかの詳細: マルチスクリーンゲームフレームワーク-複数のゲームがこのフレームワーク内に配置されます。一般的なUI「スクリーン」には、設定、情報、難易度の選択、メインメニューなどがあります。 複数のインプットメソッド 一部の画面のトップメニューバーなどの一般的なUI要素 異なるレンダリング方法を使用する可能性(キャンバス/ DOM / webGL) 現時点では、AppModel、AppController、AppViewがあります。ここから、各「画面」を追加してAppViewにアタッチすることを計画していました。しかし、トップメニューバーのようなものはどうですか、それらは別のMVCトライアドである必要がありますか?コンポーネントを密結合せずにどこにどのように取り付けますか? 1つのMVCトライアドを別のトライアド内に配置することは受け入れられている慣行ですか?つまり、各「画面」をAppViewに追加できますか?「トライアド」はMVC用語としても受け入れられますか?! 私の心は選択肢の下で溶けています...私はここで基本的な何かを見逃しているように感じます。私はMVCアプローチを使用せずにすでに稼働しているソリューションを持っていますが、結局、密結合されたスープ-ロジックとビューを組み合わせて、現在組み合わせています。アイデアは、それを開いて、ビューを簡単に変更できるようにすることでした(たとえば、キャンバスビューをDOMベースのビューと交換するため)。 現在使用されているライブラリ:require.js、createJS、アンダースコア、GSAP、手動のMVC実装 特に物事の実際のデザイン、および「スクリーン」を適切なM、V、またはCに分割することに関して、ポインタ、例などをいただければ幸いです。 ...またはMVC以外のより適切な方法 [NB、他に2つの誤ったstackexchangeコミュニティで質問したことがある前にこの質問を見た場合...私の脳が機能しなくなった]

4
.NETプログラミングとPOCOクラス
変更が必要なアプリケーションについて熟考しているときに、今夜は考えていました。エンティティフレームワークエンティティはPOCO(プレーンな古いCLRオブジェクト)であり、ASP.NET MVCで使用されるモデルも通常POCOです。これは基本的にプロパティだけを意味し、メソッドは意味しません。 現在、OOプログラミングでは、通常、オブジェクトにその機能とメソッドを含む機能をカプセル化できます。これにより、ポリモーフィズムが発生します。使用されるPOCOクラスの台頭により、汎用リポジトリーなどの設計パターンがより一般的になっています。以前はオブジェクトに独自のCRUD操作があったはずでしたが、現在はリポジトリにあります。 これはオブジェクトからの進化であり、オブジェクトからCRUD操作を削除してそれらを分離できるようにしたのですか、それとも過去にCRUD操作がオブジェクトレベルにあるはずがなく、私が間違っていたのでしょうか?一体、おそらく両方とも完全に合法であり、常にそうでした。それは私が考えさせられた観察に過ぎないので、私は他の意見を求めるだろうと考えました。

2
Scalaでの自己型と特性継承の違いは何ですか?
グーグルドすると、このトピックに対する多くの回答が出てきます。しかし、これらの2つの機能の違いをうまく説明しているようには思えません。もう一度試してみたいのですが、具体的には... 継承ではなく自己型でできること、およびその逆は何ですか? 私には、2つの間に定量化可能な物理的な違いがあるはずです。そうでなければ、それらは名目上異なるだけです。 特性AがBまたは自己型Bを拡張する場合、どちらもBであることは要件であることを示していませんか?違いはどこですか?

3
Entity Frameworkデータベースコンテキスト(モデル)をMVVM WPFのViewModelに接続する最良の方法は何ですか?
上記の質問のように:Entity Frameworkデータベースモデル(コンテキスト)をMVVM(WPF)のviewModelに接続する最良の方法は何ですか? 私はWPFでMVVMパターンを学習しています。多くの例は、viewModelにモデルを実装する方法を示していますが、その例のモデルは単なる単純なクラスであり、エンティティフレームワークモデル(ベースファーストアプローチ)と一緒にMVVMを使用したいと思います。モデルをviewModelにワイヤリングする最良の方法は何ですか。 回答ありがとうございます。 //ctor of ViewModel public ViewModel() { db = new PackageShipmentDBEntities(); // Entity Framework generated class ListaZBazy = new ObservableCollection<Pack>(db.Packs.Where(w => w.IsSent == false)); } これは私のViewModelの通常の俳優です。もっと良い方法があると思います。リポジトリパターンについて読んでいましたが、これをWPF MVVMに適応できるかどうかわかりません

3
RESTでエンティティ関係を作成する:子IDに投稿して親を作成できますか?
現在、従来の顧客データにアクセスするためのREST APIを設計しています。APIの要素の1つは、ユーザーの資産です。アセットは特定のサービスの下に追加されます。バックエンドAPIは、特定のサービスのユーザーにのみアセットを追加します。したがって、User--Asset関係はありませんが、User-[Service]-Asset関係があります。 URIは次のようになります。 /users/{id}/assets/{id}/services/{id} APIを使用すると、新しいエントリを作成するためのアセットIDとサービスIDがわかります。私たちが苦労しているのは、この関係の創造です。 簡単な方法の1つは、関係全体を /users/{id}/assets/ POST /users/{id}/assets {asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"} しかし、URIが示すように実際にアセットを作成するのではなく、アセットとサービスの関係を作成します。 別の方法として、次のように関係をアドレス指定するURIにPOSTすることを検討しています。 POST /users/{id}/assets/{id}/service/{id} {attribute1:"{var}", attribute2:"{var}"} ただし、この場合、リソースパス/users/{id}/assets/{id}はPOSTの前には存在せず、副作用として作成されます。 まだ存在しないリソースパスへのPOSTはまったく許可されていますか? あなたの考えをありがとう、 ジェラール。

4
Perlのプログラミングスタイル
私はJavaで作業しているため、基本的にはコーディング中にOOPパラダイムを使用しています。私はPerlで仕事を始めようとしていて、Perl開発者が従うパラダイムは何だろうと思っていました。wikiでは、多くのパラダイムをサポートしていると述べていますが、スクリプト言語であるため、これを理解しているとは思いません。 だから私の質問は、Javaで慣れ親しんだオブジェクト指向パターンはPerlの慣用句ですか?それとも効果的なPerlを書くためにデザインスタイルに大幅な変更が必要ですか? 注:これはPerlを批判する問題ではありません。私は実際にはPerlで作業する必要があり、現在のプログラミング方法がどのように変わるかを理解したいと思います。

2
「コマンド」と「複合」を組み合わせて時間遅延をシミュレートするにはどうすればよいですか?
学習課題(私は学校にいない-何か新しいことを学ぼうとしている老人)として、伝播遅延を組み込んだ論理ゲートシミュレーションを記述しようとしています。また、ユーザーはゲートをグループ化して、より高レベルのオブジェクトを作成できる必要があります。 問題にデザインパターンを適用したいのですが、苦労しています。 Head First Design Patternsを読んでいますが、コマンドパターンは、遅延のある回路を通る電気パルスをシミュレートするのに適した方法であることがわかりました。また、複合パターンはネストされたユニットをシミュレートするための優れた方法であることがわかります。2つを混ぜる方法がわかりません。 つまり、ゲートをループすると、ゲート「x」が発火するはずです。15ナノ秒の遅延があるので、現在のゲーム時間から15 nsのタイムスタンプでコマンドを作成します。ディスパッチャーはどこですか?ダイナーの例では、コマンドが「注文」であるため、ウェイトレスとコックはそれぞれコマンドをディスパッチし、遅延を導入するオプションがあります。「複合」ゲートがある場合、独自のディスパッチャーも持っていますか?キューを管理するためにシングルトンを使用する必要がありますか? 私は見つけたものを読みましたが、それでも正しい方向へのプッシュが必要です。 /programming/2015549/using-command-design-pattern /programming/12016314/client-server-command-design-pattern-with-variable-delays /programming/10560892/composite-of-commands-design-pattern /programming/8874705/how-can-i-calculate-propagation-delay-through-series-of-combinational-circuits-u

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.