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

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


7
自己実行型匿名関数とプロトタイプ
Javascriptには、javascriptでクラス/名前空間を作成および管理するための明確な手法がいくつかあります。 ある技術と他の技術を使用する場合にどのような状況が必要かを知りたいです。私は1つを選んで、それを前進させたいです。 複数のチーム間で保守および共有されるエンタープライズコードを記述しますが、保守可能なjavascriptを記述する際のベストプラクティスを知りたいですか? 私は、自己実行型の匿名関数を好む傾向がありますが、これらの手法に対するコミュニティの投票がどういうものか興味があります。 プロトタイプ: function obj() { } obj.prototype.test = function() { alert('Hello?'); }; var obj2 = new obj(); obj2.test(); 自己閉鎖匿名関数: //Self-Executing Anonymous Function (function( skillet, $, undefined ) { //Private Property var isHot = true; //Public Property skillet.ingredient = "Bacon Strips"; //Public Method skillet.fry = function() { var …

4
開発チームがVisual Studioの複数のプロジェクトに単一のソリューションを使用すると「相互依存の複雑さが増す」と主張するのはなぜですか?
既存の製品の新しいバージョンの開発を開始している外部チームの管理を支援しています。これまで、このチームは、展開可能なビルドを作成するために連携するVisual Studioの約30のモジュールに対して、単一のソリューションで単一のプロジェクトのモデルを常に使用していました。 これは、ビルドの信頼性と品質に有害な影響を及ぼします。常に最新のソースコードが送信されるとは限らないためです。すべての参照コードを単一のソリューションに統合するためにそれらを押すことを試みていますが、いくつかの抵抗があります-特に、すべてが配置されている場合、モジュール間の相互依存性(Visual Studioの「プロジェクト」を読む)が増加していることについて話し続けています単一のソリューションファイル。別のソリューションのコードは他で使用されていません。 これはナンセンスであり、優れた開発パターンはそのような問題を回避するだろうと私は主張します。 問題のチームは、既存の製品のバグ修正と新機能の開発も行いますが、その経験は控えめに言っても不十分であり、複数のソリューションに分割するというまったく同じ問題に苦しんでいます。ソース管理(TFS)へのアクセスを拒否されました。コードベースを統一するために取っているアプローチは、欠落している更新の数を減らし、時々発生する回帰よりも少なくすることです(はい、修正されたバグが再取得されています) -製品に導入されました)「ソリューションフォルダー全体のZIPを送信して、解凍し、Visual Studioで開き、F5 一般的な構造と品質の観点から、コードはかなり貧弱でサポートが困難です。この経験から、開発サイクルのできるだけ早い段階で作業プロセスを正しくしようと考えています。 私が見逃しているものはありますか?すべてのコードを分離しておく正当な理由はありますか?私のお金のために、それは一般的な知識になるほど説得力のある理由でなければなりませんが、私はすべてを知らないことを喜んで認めています。

4
webappで同じデータを編集している複数のユーザーをどのように処理しますか?
私が取り組んでいるプロジェクトは、複数のユーザー間でタスクリストを管理するWebアプリケーションを作成することです。これは、承認されたユーザーによってタスクアイテムが配布されるマスタータスクリストです。各ユーザーは、割り当てられたタスクにログインして表示するための独自のアカウントを持っています。複数のユーザーが単一のタスクを共有することは可能です。 次の状況を処理する方法の全体的な概念にさらに取り組んでいるので、プロジェクトの詳細をここから省こうとしていますが、それが役立つ場合は、RequestFactoryを実装したJava、EclipseLink、GWTを使用しています。データベースはPostgreSQLです。 したがって、私が調整しようとしている概念的な問題は次のとおりです。 複数のユーザーに共通の単一のタスクが何らかの方法で変更された場合(タスクの完了、削除など)、このタスクを持つすべてのユーザーのタスクリストが更新されます。この機能の実装を支援する設計パターンはありますか? 私が調べたパターンには、ObserverとMediatorがあります。これらについて検討すべき他のパターンはありますか? 2人のユーザーが同じタスクを同時に変更しているとします。 まず、そのような状況が発生するのを許可する必要がありますか、それとも誰かが変更を行うまでロックする必要がありますか? 次に、ロックをかけない場合、どの変更を受け入れるかを調整するにはどうすればよいですか?これには、ユーザー1がデータを送信でき、ユーザー2が更新されたデータを受信する前に、先に進んで変更を送信した可能性があるため、1の状況が含まれます。 このWebアプリの複数のインスタンス間でデータを適切に同期する方法について提供できるガイドポイント、アドバイス、またはヒントを本当に探しています。とても感謝しています!

4
私のコードで「マネージャー」を避ける方法
この質問は、Software Engineering Stack Exchangeで回答できるため、Code Review Stack Exchangeから移行されました。 6年前に移行され ました。 現在、C ++向けにEntity Systemを再設計しています。多くのマネージャーがいます。私の設計では、ライブラリを結合するためにこれらのクラスがあります。「マネージャー」クラスに関しては、多くの悪いことを聞いたことがあります。おそらく、クラスに適切な名前を付けていません。しかし、他にどのような名前を付けるべきかはわかりません。 私のライブラリーのほとんどのマネージャーは、これらのクラスで構成されています(ただし、多少異なります)。 コンテナ-マネージャ内のオブジェクトのコンテナ 属性-マネージャー内のオブジェクトの属性 ライブラリの新しいデザインには、ライブラリを結び付けるために、これらの特定のクラスがあります。 ComponentManager-エンティティシステムのコンポーネントを管理します ComponentContainer コンポーネント属性 シーン*-シーンへの参照(以下を参照) SystemManager-エンティティシステム内のシステムを管理します SystemContainer シーン*-シーンへの参照(以下を参照) EntityManager-エンティティシステム内のエンティティを管理します EntityPool-エンティティのプール EntityAttributes-エンティティの属性(これはComponentContainerおよびSystemクラスのみがアクセス可能です) シーン*-シーンへの参照(以下を参照) シーン-すべてのマネージャーを結び付ける ComponentManager SystemManager EntityManager Sceneクラス自体にすべてのコンテナ/プールを配置することを考えていました。 すなわち これの代わりに: Scene scene; // create a Scene // NOTE: // I technically could wrap this line in …

4
「変化するものをカプセル化する」と言うとき、それはどういう意味ですか?
私が出会ったOOP原則の1つは次のとおりです。-さまざまなものをカプセル化します。 私はフレーズの文字通りの意味が何であるかを理解しています。しかし、私はそれがより良いデザインにどの程度貢献するのかわかりません。誰かが良い例を使って説明できますか?

4
既に存在するオブジェクトに機能を追加するにはどうすればよいですか?
特定の量の明確に定義された機能を備えたインターフェイスがあります。まあ言ってみれば: interface BakeryInterface { public function createCookies(); public function createIceCream(); } これはインターフェイスのほとんどの実装でうまく機能しますが、いくつかのインスタンスでは、いくつかの新しい機能を追加する必要があります(新しいメソッドにロールインするなどcreateBrownies())。これを行うための明白/単純なアプローチは、インターフェースを拡張することです。 interface BrownieBakeryInterface extends BakeryInterface { public function createBrownies(); } しかし、既存のAPIを変更せずに新しい機能を追加できないという点でかなり大きな欠点があります(新しいインターフェイスを使用するようにクラスを変更するなど)。 インスタンス化後に機能を追加するためにアダプターを使用することを考えていました。 class BrownieAdapter { private brownieBakery; public function construct(BakeryInterface bakery) { this->brownieBakery = bakery; } public function createBrownies() { /* ... */ } } これは私に次のようになります: bakery = new …

3
予測される変更を計画しているRESTエンドポイントの推奨パターンは何ですか
変更のための先見の明を持つ外部アプリケーション用のAPIを設計しようとすることは簡単ではありませんが、少し前もって考えておくことで、後で生活が楽になります。私は、以前のバージョンのハンドラーをそのままにしておくことで、後方互換性を維持しながら将来の変更をサポートするスキームを確立しようとしています。 この記事の主な関心事は、特定の製品/会社に対して定義されたすべてのエンドポイントでどのパターンに従う必要があるかです。 基本スキーム のベースURLテンプレートを考えると、https://rest.product.com/すべてのサービスが/api、/authおよびなどの他の非レストベースのエンドポイントと共に存在することを考案しました/doc。したがって、次のようにベースエンドポイントを確立できます。 https://rest.product.com/api/... https://rest.product.com/auth/login https://rest.product.com/auth/logout https://rest.product.com/doc/... サービスエンドポイント 次に、エンドポイント自体について説明します。懸念はPOST、GET、DELETEこの記事の主な目的ではなく、それらのアクション自体に懸念されます。 エンドポイントは、名前空間とアクションに分類できます。また、各アクションは、戻り値の型または必須パラメーターの基本的な変更をサポートする方法で表示される必要があります。 登録されたユーザーがメッセージを送信できる架空のチャットサービスを利用すると、次のエンドポイントがある場合があります。 https://rest.product.com/api/messages/list/{user} https://rest.product.com/api/messages/send 今度は、壊れる可能性のある将来のAPI変更に対するバージョンサポートを追加します。私たちは、どちらかの後にバージョンの署名を追加することができ/api/たりした後/messages/。与えられたsendエンドポイント我々は、v1の以下のものを持つことができます。 https://rest.product.com/api/v1/messages/send https://rest.product.com/api/messages/v1/send だから私の最初の質問は、バージョン識別子の推奨場所は何ですか? コントローラーコードの管理 そのため、以前のバージョンをサポートする必要があることを確立しました。そのため、時間の経過とともに廃止される可能性のある新しいバージョンのそれぞれのコードを何らかの方法で処理する必要があります。Javaでエンドポイントを記述していると仮定すると、これをパッケージで管理できます。 package com.product.messages.v1; public interface MessageController { void send(); Message[] list(); } これには、すべてのコードがネームスペースを介して分離されているという利点があります。この場合、重大な変更はサービスエンドポイントの新しいコピーを意味します。これの不利な点は、すべてのコードをコピーする必要があり、新しいバージョンと以前のバージョンに適用するバグ修正を各コピーに適用/テストする必要があることです。 別のアプローチは、エンドポイントごとにハンドラーを作成することです。 package com.product.messages; public class MessageServiceImpl { public void send(String version) { getMessageSender(version).send(); } // Assume we have …

1
Javascriptで必要なモジュールと依存性注入
最近、私の頭の中に疑問が浮かびました: Javascriptの方法は、従来のソフトウェア開発で優れた実践と見なされているほぼすべてに反しますか? このステートメントに関連する一連の質問/観察事項がありますが、StackExchangeの形式を尊重するには、それらを別の質問に分割した方が良いでしょう。 必要なモジュール 最近の標準Javascriptコードは次のようになります。 const someModule = require('./someModule') module.exports = function doSomethingWithRequest() { // do stuff someModule.someFunc() // do other stuff } 長所 カプセル化:モジュールはスタンドアロンで動作し、その機能を実行するために必要なすべてを認識します。 彩色として、クライアントがモジュールを使用するのは簡単です。 短所 貧弱なテスト容易性:これは、DIを使用しない場合の標準ですが、Javscriptなどの動的言語では、mockeryまたはなどのモジュールによって回避することができます* rewire。 それは確かにDIPに違反しています-依存性注入と混同しないでください。-具体的なモジュールしかインポートできないため。 おそらくOCPに違反しています。たとえば、ファイルシステムに(fsモジュールを介して)書き込むログモジュールがあると想像してください。このログモジュールを拡張してネットワークに送信する場合、非常に困難です。 *これはCommonJSまたはAMDモジュールでも動作する可能性があります。それらはほとんどユーザーランドで実装されているためです。ただし、ES6 import構文でこれがどのように可能になるかはわかりません。 依存性注入 依存性注入を使用すると、次のようになります。 module.exports = function doSomethingWithRequest(someModule) { // do stuff someModule.someFunc() // do other stuff } 長所 …

6
イテレータパターン-内部表現を公開しないことが重要なのはなぜですか?
C#Design Pattern Essentialsを読んでいます。現在、イテレータパターンについて読んでいます。 私は実装方法を完全に理解していますが、重要性を理解していないか、ユースケースを見ていません。この本では、誰かがオブジェクトのリストを取得する必要がある例を示しています。IList<T>またはなどのパブリックプロパティを公開することでこれを行うことができますArray。 本は書いている これに伴う問題は、これら両方のクラスの内部表現が外部プロジェクトに公開されていることです。 内部表現とは何ですか?実際にはそれがありますarrayかIList<T>?消費者(これを呼び出しているプログラマー)がこれを知るのが悪い理由が本当にわかりません... この本は、このパターンが機能を公開することでGetEnumerator機能するため、GetEnumerator()この方法で「リスト」を呼び出して公開できると述べています。 特定の状況では、このパターンには(すべてのように)場所があると思いますが、どこで、いつ見るかわかりません。

3
静的ファクトリーとシングルトンとしてのファクトリー
私のコードのいくつかでは、次のような静的ファクトリーがあります。 public class SomeFactory { // Static class private SomeFactory() {...} public static Foo createFoo() {...} public static Foo createFooerFoo() {...} } コードのレビュー中に、これはシングルトンであることが提案され、注入されました。したがって、次のようになります。 public class SomeFactory { public SomeFactory() {} public Foo createFoo() {...} public Foo createFooerFoo() {...} } 強調すべきいくつかのこと: 両方の工場はステートレスです。 メソッド間の唯一の違いは、スコープ(インスタンスと静的)です。実装は同じです。 Fooは、インターフェースを持たないBeanです。 静的にするための引数は次のとおりです。 クラスはステートレスであるため、インスタンス化する必要はありません ファクトリをインスタンス化するよりも静的メソッドを呼び出す方が自然なようです シングルトンとしてのファクトリの引数は次のとおりです。 すべてを注入するのが良い 工場の無国籍にもかかわらず、注入によりテストが簡単になります(簡単にモックできます) 消費者をテストするとき、それはock笑されるべきです …

5
アプリケーション設定を読み込む最良の方法
Javaアプリケーションの設定を保持する簡単な方法は、特定の値(この値は数字、文字列、日付など)に関連付けられた各設定の識別子を含む「.properties」拡張子を持つテキストファイルで表されます。 。C#は同様のアプローチを使用しますが、テキストファイルには「App.config」という名前を付ける必要があります。どちらの場合も、ソースコードでは、設定を読み取るために特定のクラスを初期化する必要があります。このクラスには、指定された設定識別子に関連付けられた値を(文字列として)返すメソッドがあります。 // Java example Properties config = new Properties(); config.load(...); String valueStr = config.getProperty("listening-port"); // ... // C# example NameValueCollection setting = ConfigurationManager.AppSettings; string valueStr = setting["listening-port"]; // ... どちらの場合も、構成ファイルから読み込まれた文字列を解析し、変換された値を関連する型付きオブジェクトに割り当てる必要があります(この段階で解析エラーが発生する可能性があります)。解析ステップの後、設定値が特定の有効領域に属していることを確認する必要があります。たとえば、キュ​​ーの最大サイズは正の値である必要があり、いくつかの値は関連している場合があります(例:min <max )、 等々。 アプリケーションが起動するとすぐに設定をロードする必要があると仮定します。つまり、アプリケーションによって実行される最初の操作は設定をロードすることです。設定の無効な値は、自動的にデフォルト値に置き換えられる必要があります:これが関連する設定のグループに発生した場合、それらの設定はすべてデフォルト値で設定されます。 これらの操作を実行する最も簡単な方法は、最初にすべての設定を解析し、次に読み込まれた値をチェックし、最後にデフォルト値を設定するメソッドを作成することです。ただし、このアプローチを使用する場合、メンテナンスは困難です。アプリケーションの開発中に設定の数が増えると、コードの更新がますます難しくなります。 この問題を解決するために、次のようにTemplate Methodパターンを使用することを考えていました。 public abstract class Setting { protected abstract bool TryParseValues(); protected abstract bool …

7
1つのことだけを行うクラスのパターン
のは、私が手続き持っていると言うものを行うに: void doStuff(initalParams) { ... } 今、私は「何かをする」ことは非常に複雑な操作であることを発見しました。手順は大きくなり、複数の小さな手順に分割し、すぐに何かを行うときに何らかの状態を持つことが有用であることに気付きました。したがって、私はそれを独自のクラスに分解します: class StuffDoer { private someInternalState; public Start(initalParams) { ... } // some private helper procedures here ... } そして、私はこれを次のように呼び出します: new StuffDoer().Start(initialParams); またはこのように: new StuffDoer(initialParams).Start(); そして、これが間違っていると感じるものです。.NETまたはJava APIを使用するとき、私は常にを決して呼び出さないためnew SomeApiClass().Start(...);、間違っていると思われます。確かに、StuffDoerのコンストラクターをプライベートにし、静的ヘルパーメソッドを追加できます。 public static DoStuff(initalParams) { new StuffDoer().Start(initialParams); } しかし、その場合、外部インターフェイスが1つの静的メソッドのみで構成されるクラスがあり、これも奇妙に感じます。 したがって、私の質問:このタイプのクラスには定評のあるパターンがありますか? エントリポイントが1つしかない 「外部的に認識可能な」状態がありません。つまり、インスタンス状態はその1つのエントリポイントの実行中にのみ必要です。

3
コンポーネントエンティティシステムアーキテクチャを使用してアプリケーション(ゲームではない)を構築するのは妥当ですか?
Apple AppStoreやGoogle Playアプリストアなどのアプリケーション(ネイティブまたはWeb)を構築するとき、Model-View-Controllerアーキテクチャを使用することは非常に一般的であることを知っています。 ただし、ゲームエンジンで一般的なComponent-Entity-Systemアーキテクチャを使用してアプリケーションを作成することは合理的ですか?

3
ブリッジの設計パターンを理解する
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 「ブリッジ」デザインパターンがまったくわかりません。さまざまなWebサイトを調べましたが、助けにはなりませんでした。 誰でもこれを理解するのに役立つことができますか?

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