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

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

5
オブザーバーパターンに対するデリゲートパターンの利点は何ですか?
でデリゲートパターン、1つのオブジェクトのみが直接、別のオブジェクトのイベントに耳を傾けることができます。でオブザーバーパターン、オブジェクトの任意の数は、特定のオブジェクトのイベントに耳を傾けることができます。他のオブジェクトにイベントを通知する必要があるクラスを設計するときに、オブザーバーパターンよりもデリゲートパターンを使用するのはなぜですか?オブザーバーパターンはより柔軟であると思います。現在、オブザーバーは1人しかいませんが、将来の設計では複数のオブザーバーが必要になる場合があります。

3
記念品パターンの背後にある哲学
私はインターネットのさまざまな情報源からの記念品のパターンについて読んでいます。さまざまなソースからの情報の違いにより、このパターンが実際に必要な理由について混乱が生じました。 dofactory実装は、このパターンの主な目的は、システムの状態を復元することであると述べています。 Wikiによると、第一の目的はシステムの変更を復元できるようにすることです。これは別の影響を与えます-システムが復元を必要とせずにmemento実装を持つことが可能であると言っています。そして、その復元機能は、この機能の1つです。 OODesignによると ある時点でオブジェクトの内部状態をキャプチャし、後でオブジェクトをその状態に復元する機能が必要になる場合があります。このようなケースは、エラーまたは障害の場合に役立ちます。 だから、私の質問は、なぜこれを正確に使用するのですか?以前の状態を保存することですか、それとも世話人とメメントの間のカプセル化を促進することですか?このタイプのカプセル化がなぜそれほど重要なのですか? 編集:訪れる人のために、この実装をチェックしてください! 編集:私は問題の解決策の実装に取り​​組んでいます。それについて別の質問を投稿し、その質問をこの質問にリンクします。貴重なご提案をお寄せいただきありがとうございます。 編集3:ここに私のサンプル実装へのリンクがあります

5
継承を停止するのはいつですか?
むかしむかし、継承についてStack Overflowで質問しました。 私はチェスエンジンをOOPファッションで設計すると言った。だから私はピースの抽象クラスからすべてのピースを継承しますが、継承はまだ続きます。コードで表示させてください public abstract class Piece { public void MakeMove(); public void TakeBackMove(); } public abstract class Pawn: Piece {} public class WhitePawn :Pawn {} public class BlackPawn:Pawn {} プログラマーは私の設計を少しエンジニアリングよりも見つけており、色付きのピースのクラスを削除し、以下のようなプロパティメンバーとしてピースの色を保持することを提案しました。 public abstract class Piece { public Color Color { get; set; } public abstract void MakeMove(); public abstract void …

3
「現実の世界」における疎結合/密結合の理解
公平な説明が欲しいので「コミュニティ」とは言いませんが、再利用可能なモジュールを作成していて、そのモジュールに3つ以上の依存モジュールが必要で、そのうちの1つを削除すると、アプリとしてだけでなく、このモジュールを使用する全体ですが、モジュール自体です。 私の理解(これは間違っているに違いない)から、疎結合のモジュラーシステムは、1つのモジュールを削除するだけでは壊れません。アプリは引き続き実行する必要がありますが、その「機能」/モジュールがなくても、依存するモジュールが存在しないために、モジュール自体がすべてを実行してはなりません。 これは間違っていますか?もしそうなら、モジュールがまだ機能していないすべての点に依存している場合、密結合と疎結合の違いは何ですか?

4
子ステートマシンは、どのようにして制御を親ステートマシンに戻すことができますか?
私のトップレベルのステートマシンには、いくつかのステートとエッジがあります。これを親ステートマシンと呼びます。 A ----> B ----> C 親ステートマシン内のどのステートもステートマシンにすることができます。これらの子供をステートマシンと呼びます。 ___________ / \ A ----> | B0->B1->B2 | ----> C \____________/ 親ステートマシンがAからBに移行すると、Bのステートマシンが引き継ぎます。Bの実行が完了したら、制御を親の状態マシンに放棄し、状態Cに移行するにはどうすればよいですか?どのデザインパターンを使用していますか? 疑問に思うかもしれませんが、私は親の状態マシン内に子の状態マシンを持っています。私の正確なプロジェクトは非常に複雑であり、子の状態の内部動作をカプセル化するのは自然だからです。

3
不変の構造と深い構成階層
私はGUIアプリケーションを開発しています。グラフィックを多用しています。例として、ベクターエディターと考えることができます。すべてのデータ構造を不変にするのは非常に魅力的です。そのため、ほとんど労力をかけずに、元に戻す/やり直し、コピー/貼り付け、その他多くのことを行うことができました。 簡単にするために、次の例を使用します。アプリケーションを使用して多角形を編集するため、「不変点」の単なるリストである「Polygon」オブジェクトがあります。 Scene -> Polygon -> Point そして、私はプログラムに1つだけの可変変数があります-現在のシーンオブジェクトを保持する変数です。私が抱えている問題は、ポイントドラッグを実装しようとしたときに発生します。可変バージョンでは、Pointオブジェクトを取得してその座標の変更を開始するだけです。不変バージョン-行き詰まっています。PolygoncurrentのSceneインデックス、にドラッグされたポイントのインデックスを格納しPolygon、毎回それを置き換えることができます。しかし、このアプローチはスケーリングしません。構成レベルが5に達すると、ボイラープレートは耐えられなくなります。 この問題は解決できると確信しています-結局のところ、完全に不変の構造とIOモナドを持つHas​​kellがあります。しかし、私はその方法を見つけることができません。 ヒントをください。

2
HTTPおよびTCP / IPを介したオブザーバーパターン(サーバークライアント)
私はサーバーと多くのクライアント(約50クライアント)がWebアプリケーションに基づいてそのサーバーに接続するクライアントを持っています。これはもちろん、HTTPプロトコルに基づいており、TCP / IPを使用しています(間違っている場合は修正してください。ネットワーキングは本当に得意ではありません)。 問題は、私が警告メカニズムを開発する必要があることです。誰かが危険な値を含むフォームを送信すると、マネージャー(同じWebアプリケーションを介して接続されている)が彼の画面に警告ポップアップを受信します。 -time(瞬時に)。 ただし、HTTPプロトコルはステートレスなので、ここでは少し戸惑います。これを実装する方法がわかりません。 ソリューションの1つは、JavaScriptをsetInterval()関数と一緒に使用して、サーバーから毎秒データをプルすることです。しかし、これは私には少し汚く、専門家ではないようです。 別のソリューションを実装するアイデアはありますか?

4
アプリケーションに多くの抽象クラスを入れても大丈夫ですか?
最初は、Commmonインターフェースのメソッドのさまざまな実装でStrategyパターンを実装したいと考えていました。これらは、ユーザー入力に基づいて実行時に取得されます。 結局のところ、3〜5個の一般的なメソッドを実装する抽象クラスがあり、さまざまな実装、つまり戦略に残されているメソッドは1つだけです。 更新:多くの抽象クラスとは、6つの異なる高レベルの機能、つまり6つのパッケージがあり、それぞれにInterface + AbstractImpl +(一連の実際のImpl)があることを意味します。 これは何か悪いデザインですか? 後の拡張性に関する否定的な見解-私は、高齢者とのコード/デザインレビューの準備をしています。

1
.NETアプリケーションの権限/適切なモデル/パターン
柔軟かつ簡単に(そのようなものが存在する場合)実装すると同時に、可能であれば組み込みの手段を利用する必要がある これまでのところ、MembershipProviderとRoleProvidersを実装しています。これはかっこいいですが、次にどこに行きますか? 「特権」という用語を追加し、アプリケーション内にハードコードする必要があるように感じます。ユーザーは、特権を役割に追加し、役割をユーザーに割り当てるように役割を構成します。 それは良いモデルのように聞こえますか?ロールに追加することに加えて、ユーザーレベルで特権を追加することを検討する必要がありますか?セットアップ(混乱)と次のサポートに問題があると思います。 そうしないと、一部の特定のユーザーにはより少ない特権が必要になります-管理者は別のロールを作成する必要があります。 このようなシステムの特効薬はありますか?そして、なぜMicrosoftはメンバーシップとロールプロバイダーよりも先に進まなかったのですか? 別のアイデア:ロールを「特権」ホルダーのままにして、ハードコーディングします。次に、使用可能なすべてのマークアップ/属性などを使用して、アプリ内のこれらのロールをコード化できます-すべてMicrosoft。 新しいエンティティ「グループ」を追加し、このような関係を作成します ユーザー ユーザーグループ 団体 RoleGroups 役割 この方法で、ロールをグループにまとめ、それらのグループをユーザーに割り当てることができます。素晴らしいサウンドで、他のソフトウェアパターンと一致します。しかし、実際にはRoleProvider内に次のようなものを実装することはできません。 AddUsersToRoles RemoveUsersFromRoles そして、ハードコーディングされるため、いくつかのものが実際にはもう意味をなさない DeleteRole CreateRole

1
現在の証拠は、正規データモデルよりもコンテキストデータの採用をサポートしていますか?
「標準」の考え方はソフトウェアに広まっています。Canonical Model、Canonical Schema、Canonical Data Modelなどのパターンは、開発中に何度も登場するようです。 多くの開発者と同様に、私は頻繁に、批判的ではないが、正規モデルが必要であるという従来の知恵に従いました。それ以外の場合は、マッパーとトランスレーターの組み合わせの爆発に直面します。または、少なくとも、数年前にやや悪名高いEFの「自信なしの投票」を初めて読んだときまで、私はそれを行っていました。 正規データモデルの追求をかつて支持していたという仮説は、そのアイデアが実践されたときに発見されるであろう要因を含まず、含めることもできませんでした。長年の試行錯誤の結果、正規データモデルが使用される可能性のある個々のコンテキストに個別のモデルを使用することが、最も複雑なアプローチではなく、最もコストのかからないアプローチであり、保守性と拡張性の向上につながります。コンテキストモデルを使用したアプリケーションとエンドポイントの比較。これは、正規モデルが行うソフトウェアエントロピーを促進しないアプローチです。 エッセイはその主張を裏付けるいかなる種類の証拠も提示していませんが、代替案を試すのに十分長い間CDMアプローチに疑問を投げかけ、結果のソフトウェアは文字通りまたは比喩的に爆発しませんでした。しかし、それだけですべてが孤立しているわけではありません。運が良かっただけかもしれません。 ですから、ソフトウェアシステムまたはアーキテクチャに標準モデルとコンテキストモデルを組み合わせた場合の実際的な長期的な影響について、真剣な調査が行われたのでしょうか。 あるいは、それを尋ねるのが早すぎる場合は、開発者/アーキテクトに、CDMから独立したコンテキストモデルへの(またはその逆の)CDMから個人的なエクスペリエンスへの切り替えについて書いてもらい、生産性、複雑さ、信頼性などの実際的な影響は何でしたか? 異なるレベルでの違いについてはどうでしょうか。つまり、単一のアプリケーションで同じモデルを使用する場合と、アプリケーションのシステムまたは企業全体で使用する場合の違いはどうでしょうか。 (事実のみ、お願いします。戦争の話は大歓迎ですが、憶測はありません。)

6
「コードスタイルとデザインパターン」についてのプレゼンテーション[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 私の会社(小規模、3つのオフィスで約40人)は、開発者の1人が技術的なトピックについてのプレゼンテーションを主催する「開発者ワークショップ」をオンラインで行う場合があります。それは必ずしも私たちの仕事に関するものではなく、単に皆が彼らのスキルと理解を向上させるのを助けるためです。 私は次のものをホストするように頼まれました、そしてトピック(私が提供したリストから選ばれました)はコードスタイルとデザインパターンです。私はそれらがそれほど密接に関連していないことを知っていますが、私に耐えます。私のコードベースには改善の余地のある場所がたくさんあります。その一部はDailyWTFに適格な場合さえあるので、このプレゼンテーションをできるだけ効果的にしたいと思っています。問題は、1時間で何をカバーするかが正確にわからないことです。 私の最初のアイデアは、例として独自のコードを使用して、「これを実際に作業に適用してください」という要点を理解することです。しかし、トピックはとても広いです。 私たちのコード(PHP)のいくつかの問題は次のとおりです。 最小限のオブジェクト指向。最近は改善していますが、グローバルな機能はまだたくさんあります。物を見つけるのにしばらく時間がかかります。 グローバル構成(私が推測する意見)。$ GLOBALS ['blah']は、ほぼすべてのファイルに散在しています。 一貫性のないブレーススタイル。最小限に聞こえますが、これにより実際には5日前に構文エラーが発生し、昨日現在でも修正されていません。 非効率な構成。一部の地域での実行時間を70%削減するいくつかの基本的な改善を行うことができました。 私はこのことを、同僚に無礼に聞こえることなく、できる限り役立つものにしたいと考えています。では、「スタイル」のどの側面に焦点を当てるべきか、そしてどのデザインパターンが説明に最も役立つかもしれませんか?

3
Java Swingアプリでのウィンドウ管理の設計パターン
最初の小さなJava Swingアプリの作成を開始しました。プログラムが開くと、ラベルと2つのボタンを備えた単一のシンプルなウィンドウが表示されます。これらのボタンの1つをクリックすると、ウェルカム画面が消去され、まったく別のパネルに置き換えられます。 その機能を作成する最良の方法が何であるかはわかりません。1つの方法はJFrame、引数としてmy を他のすべてのコンポーネントに渡すことですが、それは私にはハッキーな感じがします。または、各パネルをアクションリスナーとして2重にしていますが、それも正しくないようです。 ここで適用すべきデザインパターンはありますか?「メインウィンドウのコンテンツのみを置き換える」は、かなり一般的な操作である必要があります。パターンの名前で十分です。そこから自分でGoogleを使うことができます。(ただし、これ以上の説明にはノーとは言えません。)

2
一連のステップを実行するためのフォールスルースイッチ
私のプログラムは、最初から最後まで一連のステップを実行する必要があります。ただし、異なる入力に基づいて開始点は異なります。たとえば、最初のステップから最後まで実行されるもの、2番目のステップから最後まで実行されるもの、3番目から最後まで実行されるものなどがあります。 シンプルなデザインが必要ですが、現在は次のようなフォールスルースイッチを使用しています。 switch (step) { case 1: //do the 1st step //fall through, so no break here case 2: //do the 2nd step //fall through case 3: //do the 3rd step //fall through ... } それは機能しますが、フォールスルーコードは常に私を不快にします。それを行うためのより良い簡単な方法はありますか?

2
制約付きのジョブキューを最適に設計するにはどうすればよいですか?
次の状況を考慮してください。 処理する必要のある多数の「ジョブ」を作成し、それらをキューに入れるプログラムがあります。 他のワーカープログラムで次の「ジョブ」を取得して、そのジョブを処理できるようにします。 各ジョブにはカテゴリがあります。 カテゴリはいくつあってもかまいません。 同じカテゴリの2つのジョブを別々のワーカーで同時に処理することはできません。 ワーカーは一度に1つのジョブを処理できます。 同じカテゴリの複数のジョブが同時に処理される可能性があるため、この状況では従来のキューは機能しませんが、これは許可されていません。 取得するジョブをワーカーに確認させ、そのジョブカテゴリに現在処理中の別のワーカーがあるかどうかを確認し、そうである場合は後で処理するためにジョブをキューに再送信します。これは、この問題を解決する非効率的な方法のようです。この問題を解決できるデータ構造または設計パターンはありますか? さらに説明が必要な場合は、お知らせください。

2
依存性注入は、テストの負担をさらに連鎖させませんか?
私は依存性注入について学んでいます。関数型ライブラリを作成するときにその魅力を見ることができますが、ライブラリを使用する人にもなると、それがどのように解決するのかわかりません。 テストするものがあまりないので、ライブラリのテストがはるかに簡単になります。 しかし、最終的には、ライブラリを使用するときに注入された関数をテストし、標準ライブラリの関数のモックとスタブを処理する必要があります。 これは、Node.jsで扱っている具体的なケースです。 function compile(options) { var files = options.files; var texCompiler = options.texCompiler; var pdfMerger = options.pdfMerger; return Promise.all(files.map(texCompiler(files))) .then(pdfMerger); } 注入:それはテストに簡単ですモックオブジェクトとして、あるいはスパイをtexCompilerし、pdfMerger機能が本当にすべてではあまり行っていないので、ケーキの一部です。私がテストできるのは、両方の関数が正しい順序で呼び出されることだけです。 とはいえ、最終的には私の関数texCompilerやpdfMerger関数をテストする必要はありません。彼らはそのようなものに見えます: var tex2Pdf = Promise.method(function tex2Pdf(tex_doc) { var latex_command = 'pdflatex'; var pdf_output_filename = path.parse(tex_doc).name + '.pdf'; var cmd = latex_command + ' ' + tex_doc; …

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