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

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

4
ソフトウェアアーキテクチャは言語にどの程度依存していますか?
ソフトウェアアーキテクチャと設計パターンについて自分自身を教育していると、ほとんどの場合、言語の機能と設計の詳細が説明に含まれていることに気付きました。 例えば、それに関する実際の記事や本は、クラスとインターフェースを使用してアイデアを説明します。このトピックで簡単に見つけられるものはすべて、オブジェクトとOOPの概念に言及しています。 システムが記述されている言語にそのような概念がまったくない場合はどうなりますか?たとえば、動的に型付けされ、インターフェイスの概念がないPythonまたはNodeを使用した場合はどうなりますか?インターフェイスが一時的な構成要素であり、ランタイムには存在しないTypeScriptを使用するとどうなりますか?関数型プログラミングを採用しようとしている場合はどうなりますか?たとえばSOLIDを無視して、自分の言語に適した他の概念を探す必要がありますか? はいの場合、それらは何ですか?残念ながら、よく採用されているすべてのパラダイム(私が知る限り)は、何らかの形でOOPの概念と型を参照しています。いいえの場合、一般的なアーキテクチャと設計の原則を特定の言語とユースケースに適合させるとき、どの規則に従う必要がありますか? 一般的に、アーキテクチャと言語の依存関係をどのように説明しますか?

4
多型のコンテキストでサブタイプに追加されたメソッドを処理する方法は?
ポリモーフィズムの概念を使用してクラス階層を作成し、親の参照を使用すると、オブジェクトを持っている特定の型を知らなくてもインターフェイス関数を呼び出します。これは素晴らしい。例: 動物のコレクションがあり、すべての動物の機能を呼び出しeatます。犬を食べるのか、猫を食べるのかは気にしません。継承と実装クラス以外から-しかし、同じクラス階層には、追加を持っている動物持ってAnimal、例えばmakeEggs、getBackFromTheFreezedStateようにしています。そのため、関数の一部のケースでは、追加の動作を呼び出す特定のタイプを知りたい場合があります。 たとえば、朝の時間で、動物だけの場合はを呼び出しますeat。それ以外の場合は、人間の場合は最初washHandsに呼び出し、次に呼び出しgetDressedますeat。この場合の対処方法は?多型が死ぬ。コードの匂いのように聞こえるオブジェクトのタイプを調べる必要があります。このケースを処理する一般的なアプローチはありますか?

1
「関数を返す関数」パターンにはJavaScriptで名前がありますか?
JavaScriptでこのパターンを頻繁に使用します。以下に例を示します。 const comments = [ { text: 'Hello', id: 1 }, { text: 'World', id: 4 }, ]; const byId = id => element => element.id === id; const comment = comments.find(byId(1)); 時々、このパターンはコードを読みやすく、モジュラーにすることができます。このパターンは何と呼ばれていますか?

7
クライアントアプリケーションからユーザー認証を設計する方法は?
私は多くのユーザーをサポートするアプリケーションを開発しています。問題は、クライアント/ユーザーを認証する方法がわからないことです。 私はhttp://quickblox.com/のようなアプリを構築しています。そこでユーザーに資格情報を提供し、ユーザーはそれらを使用してユーザー名とパスワードを入れて認証を取得できないNアプリケーションを構築します。 それが次のようになると仮定しましょう。(QuickBloxと同じように) 1.ユーザーが私のWebサイトでアカウントを作成します。 2.ユーザーはN個のAPIキーを作成し、資格情報を秘密にすることができます。(複数のアプリの場合) 3.ユーザーは、アプリケーション(Android、iOS、Javascriptなど)でこれらの資格情報を使用して、REST APIと通信します。(REST APIには読み取りおよび書き込みアクセスがあります。) 私の懸念? ユーザーは自分が作成したアプリケーションに資格情報(APIキーと秘密キー)を入れます。誰かがこれらのキーを取得して、ユーザーをまねようとするとどうなりますか?(APKを逆コンパイルするか、JavaScriptコードを直接調べます。 どこか間違ってる?この3つのレベルのユーザーメカニズムを設計するのは混乱しています。

4
必要なときにソリューションに到達する方法の説明を出力するアルゴリズムのパターン
次のシナリオが何度か起こりました。 特定の問題を解決するアルゴリズムをプログラムしました。正常に機能し、正しい解決策を見つけます。今、私はアルゴリズムに「あなたが解決策に到達した方法の完全な説明を書く」ことを伝えるオプションが欲しいです。私の目標は、オンラインデモ、チュートリアルクラスなどでアルゴリズムを使用できるようにすることです。説明なしでリアルタイムにアルゴリズムを実行するオプションが引き続き必要です。使用する良いデザインパターンは何ですか? 例:最大公約数を見つけるためにこのメソッドを実装するとします。現在実装されているメソッドは正しい答えを返しますが、説明はありません。次のようなメソッドのアクションを説明するオプションが必要です。 Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0. a and b are both even, so we divide them by 2 and increment d by 1. Now, a=3 and b=2. a is odd but b is even, so we divide b by 2. …

4
単一責任パターンはクラスに対してどの程度具体的である必要がありますか?
たとえば、コンソールとの間のあらゆる種類の入出力メソッドを備えたコンソールゲームプログラムがあるとします。でしょうが、すべてのシングルでそれらを保つためにスマートにinputOutputクラスなど、より具体的なクラスにそれらを打破startMenuIO、inGameIO、playerIO、gameBoardIO各クラスが1-5程度のメソッドを持っていることなど、? また、同じメモで、それらを分解する方が良い場合は、IO名前空間に配置して、呼び出しをもう少し冗長にするのが賢明でしょうIO.inGameか?

4
適切なModel-View -_____デザイン
モデルビューコントローラー、モデルビュープレゼンター、モデルビューViewModelなどについて読んでいますが、一般的に、基本的な概念は非常に理解しやすいようです。可能。デザインチョコレートにロジックピーナッツバターは含まれていません。クール、私はそれが好きです。 問題は、その3番目の部分についてはまだ少し曖昧だということです...モデルまたはビューではありません。誰もがそれを何と呼ぶべきか、何をすべきか、何が適切で、何が間違っているのか、自分の考えを持っているようです...それはプレゼンターの仕事だからです。 私はとりとめのないです。 それらの違いを誰かに説明するように頼むのではなく、すでに何度も行われているので(私は知っています;数え切れないほど多くの記事を読んでいます)-私は私は自分でモデルを作った少数のプログラマーです。 そうは言っても、このデザインをどのように分類しますか?そしておそらくもっと重要なことですが、これについて明らかに悪いことはありますか?確かに、これが本当に堅実な設計であれば、私は良いことをしていると聞きたいと思いますが、賞賛よりもむしろ堅実なアドバイスを与えられるでしょう。 注:Model-View-の神秘的な3番目の部分に「ブリッジ」を使用しますか?それが「すべき」であるという潜在意識の提案を避けるため。 モデル データに対する権限です。 リクエストされた変更に関する情報をブリッジから受け取ります。 データが他のデータにどのように関連するかについてのすべてのロジックを含み、実行します。 データが変更されたときにブリッジに通知します(ブリッジが関心を示したデータについて)。表現の編集:外部のサブスクライバー(何も知らない)が、その状態または計算結果をモニターできるようにします。 ビューに関する知識がありません。 見る ユーザーにデータを表示および操作する方法を提供することに関心があります。 ブリッジからデータ更新に関する情報を受け取ります。 ユーザーにデータとコントロールを提示する方法のすべてのロジックを含み、実行します。 ユーザーがモデルに(おそらく)影響を与えるアクションを実行したときに、ブリッジに通知します。 興味のある情報をブリッジに通知します。 モデルに関する知識がありません。 ブリッジ モデルとビューの間のコーディネーターおよびトランスレーターです。 モデルとビューの間で受け渡される情報に適切なフォーマット変更を加えます。 「誰が何を知る必要があるか」に関する情報を保持します。 モデルとビューの両方の知識がある。 その他の注意事項 より複雑なプログラムでは、複数のモデルが存在するのが一般的です。この状況では、ブリッジは通常、複数のモデル間の調整/翻訳の仕事を引き受けるため、protocall / API / designモデルの構築対象の権限になります。(たとえば、カードゲームプログラムを構築し、代替のデッキシャッフルモデルを構築する場合、ブリッジを使用して、ブリッジとの適切な通信に必要な機能を決定する必要があります。) ビューとモデルが1つだけの小さな単純なプログラムでは、ブリッジがどちらの側でどの機能を使用できるかを「想定」するのが一般的です。ただし、プログラムがより複雑になると、非効率性とバグのある仮定を回避できるように、ビューとモデルが機能をブリッジに報告することをお勧めします。 ほぼカバーしていると思います。どうしても、私が使用する傾向のあるデザインについて質問がある場合は歓迎します。また、提案をお勧めします。 そしていつものように、お時間をいただきありがとうございます。

4
アプリケーションをそのフレームワークに疎結合することは可能ですか?
Webアプリケーションを開発しているとしましょう。私の最初の選択肢は、Fat-Free Framework(F3)およびMVCパターンでPHPを使用することです。来年、Zend Frameworkに切り替えるか、ASP.NET MVCに切り替えることを決定するかもしれません。フレームワークに疎結合されるような方法でアプリケーションを設計しようとするのは理にかなっていますか、それともフレームワークがあまりにも統合されすぎて現実的ではありませんか? 私が尋ねる唯一の理由は、最近の仲間との会話の中で出てきたからです。仲間は、私のパイを空からF3に疎結合するというアイデアを批判しました。

4
さまざまなソースタイプおよびさまざまな宛先タイプへのデータインポートのデザインパターン
次を処理できるインポートスクリプト(C#)を設計および構築する必要があります。 さまざまなソース(XML、XSLX、CSV)からデータを読み取る データを検証する データをさまざまなオブジェクトタイプ(顧客、住所)に書き込む データは多数のソースから取得されますが、ソースには常に1つのインポート形式(csv、xml、xslxのいずれか)があります。インポート形式はソースごとに異なる場合があります。将来、新しいインポート形式が追加される可能性があります。宛先オブジェクトの種類は常に同じです(顧客、アドレスなど)。 私はジェネリックを使用することを考えていて、ファクトリーパターンについて何かを読みましたが、私はこの分野でかなり大きな初心者なので、アドバイスは大歓迎です。 この問題を解決するための適切な設計パターンは何ですか?

2
ASP.NET MVCサイトをモジュール化する方法
ASP.NET MVC 4を使用して従業員イントラネットシステムを構築する計画段階にあります。このサイトは、メッセージング、給与の変更など、異なる機能を提供する個別の「モジュール」で構成されています。 。これらのモジュールをコンパイル時に有効または無効にできるようにしたいと思います。ホームページには、ロードされた各モジュールにリンクするナビゲーションが表示されます。 これまでは簡単ですが、ナビゲーション機能がモジュールについて事前に知る必要はありません。言い換えれば、モジュールを動的に検出できるようにします。新しいモジュールのコードを記述し、ソースの他の場所でコードを変更せずにナビゲーションバーにリンクを追加できるようにしたいのです。各モジュールには、ナビゲーションバーに自分自身を登録する何らかの方法が必要です。さらに重要なことですが、これは、ロードされた各モジュールに対して行う必要があります。 MVCのエリアはサイトのレイアウトが事前にわかっている場合のために設計されているため、MVCのエリアを使用することはできません。MEFは適切であると思われますが、MEFとMVCを組み合わせることに成功した人はいませんでした。MEFは実際にここに行く方法ですか、それとも私が必要なことを達成するためのより良い方法がありますか?

1
リポジトリパターンを使用していますか?
-repositoryデータベースからデータを取得するために、接尾辞が付いた一連の個別のクラスを使用しています。各テーブルごとに独自のリポジトリ。 たとえば、customerrepository顧客を取得するためのあらゆる種類のメソッドを持つクラスと、vacancyrepository空席を取得するためのあらゆる種類のメソッドを持つクラスがあります。 このことを行う方法について2つの質問があります。 複数のテーブルにまたがるデータを取得するのはどうですか?たとえば、私はまだ空席を作成していないすべての顧客を表示する画面を持っています。のcustomerrepositoryメソッドを使用できますか、vacancyrespository両方のリポジトリが結果を返すdataserviceことができますか?両方のリポジトリから結果を取得して1つの結果に結合する階層の上位にクラスを付けますか? そのようなリポジトリはどのくらいのロジックを処理できますか? リポジトリに「where active == true」を実装してアクティブなレコードのみを取得してもよいと思いますか、またはその単純なロジックでさえ、階層の上位のクラスで処理する必要があります(名前を付けましょうdataservice)? 私が今遭遇した例はこれです: 1つ以上の質問を含む質問リストがあります。 質問には結果があり、別のテーブルに保持されます。 したがって、質問リストの合計結果を取得するには、questionlistテーブル、質問テーブル、およびテーブルのデータを結合する必要がありquestionstatusます。 現在、これらのテーブルには3つの異なるリポジトリがあります。 questionlistrepositoryリスト番号12の合計結果を尋ねると、他の2つのリポジトリからデータを取得する必要があり、そのため何らかのロジックが必要になります。 またはquestionlistdataservice、使用するリポジトリを知っているものはありますか? もう1つ:リポジトリは結果を生成できるIQueryableため、呼び出し元のサービスは結果を簡単に結合できますが、そうでない場合は、3つのテーブルすべてのコンテンツをすべて取得することは良い考えではないと思いますデータベース。

4
テンプレート方式と戦略の組み合わせ
私のソフトウェアエンジニアリングクラスの課題は、特定のゲームでさまざまな形式でプレイできるアプリケーションを設計することです。問題のゲームはMancalaです。これらのゲームのいくつかはWariまたはKalahと呼ばれます。これらのゲームはいくつかの面で異なりますが、私の質問では、ゲームが以下の点で異なる可能性があることを知っておくことが重要です。 移動の結果が処理される方法 ゲームの終了が決定される方法 勝者が決定される方法 これを設計するために最初に思いついたのは、戦略パターンを使用することでした。アルゴリズムのバリエーション(ゲームの実際のルール)があります。デザインは次のようになります。 それから私は、マンカラとワリのゲームで勝者が決定される方法はまったく同じであり、コードが複製されるだろうと思いました。これは、定義によって、「1つのルール、1つの場所」またはDRY原則の違反であるとは思わない。マンカラのルールの変更は、Wariのルールも自動的に変更されることを意味しない。それにもかかわらず、教授から得たフィードバックから、私は別のデザインを見つける印象を受けました。 それから私はこれを思いついた: 各ゲーム(Mancala、Wari、Kalahなど)には、各ルールのインターフェイスのタイプの属性があります。つまりWinnerDeterminer、Mancala 2.0バージョンがあり、Mancala 1.0と同じ場合は、勝者が決定される方法を除きます。 Mancalaバージョンを使用します。 戦略パターンとしてのこれらのルールの実装は確かに有効だと思います。しかし、本当の問題は、さらに設計したいときに起こります。 テンプレートメソッドパターンについて読んで、すぐにこの問題に適用できると思いました。ユーザーが移動したときに実行されるアクションは常に同じであり、同じ順序で、すなわち: 穴に石を置く(これはすべてのゲームで同じであるため、テンプレートメソッド自体に実装されます) 移動の結果を決定する 前の動きのためにゲームが終了したかどうかを判断する ゲームが終了したら、誰が勝ったかを判断する これらの最後の3つの手順は、すべて上記の私の戦略パターンに含まれています。これら2つを組み合わせるのに苦労しています。私が見つけた1つの可能な解決策は、戦略パターンを放棄し、以下を行うことです: 戦略パターンとこれの間のデザインの違いは本当に見られませんか?しかし、テンプレートメソッドを使用する必要があることは確かです(ただし、戦略パターンを使用する必要があることは確かです)。 また、誰がTurnTemplateオブジェクトの作成を担当するかを判断することもできませんが、戦略パターンでは、抽象的なファクトリパターンを使用して簡単に作成できるオブジェクトのファミリ(3つのルール)があると感じています。私はそれからだろうMancalaRuleFactory、WariRuleFactoryなどと彼らは私がバックアップ規則や手の正しいインスタンスを作成することになりRuleSet、オブジェクトを。 戦略+抽象ファクトリパターンをRuleSet使用し、3つのルールのアルゴリズムを持つオブジェクトがあるとします。これでテンプレートメソッドパターンを使用できると感じる唯一の方法は、このRuleSetオブジェクトをに渡すことTurnTemplateです。そのとき表面化する「問題」は、の具体的な実装を必要としないことでありTurnTemplate、これらのクラスは時代遅れになります。の保護されたメソッドでは、TurnTemplate単に呼び出すことができますruleSet.determineWinner()。結果として、TurnTemplateクラスは抽象的ではなくなりますが、具体的になる必要がありますが、それでもテンプレートメソッドパターンですか? 要約すると、私は正しい方法で考えているのですか、それとも簡単な何かを見逃していますか?順調に進んでいる場合、戦略パターンとテンプレートメソッドパターンをどのように組み合わせるのですか?

3
複合パターンを使用するか、ツリー構造を使用するか、3番目の実装を使用するかをどのように判断できますか?
「オブザーバー」タイプと「サブジェクト」タイプの2つのクライアントタイプがあります。それらは両方ともグループの階層に関連付けられています。 オブザーバーは、異なる階層全体で関連付けられているグループから(カレンダー)データを受信します。このデータは、データを収集しようとしているグループの「親」グループからのデータを組み合わせて計算されます(各グループは1つの親のみを持つことができます)。 サブジェクトは、関連付けられているグループにデータ(オブザーバーが受信するデータ)を作成できます。グループでデータが作成されると、グループのすべての「子供」もデータを持ち、データの特定の領域の独自のバージョンを作成できますが、作成された元のデータにリンクされます(私の特定の実装では、元のデータには期間と見出しが含まれますが、サブグループは、それぞれのグループに直接リンクされた受信者の残りのデータを指定します)。 ただし、サブジェクトがデータを作成するとき、影響を受けるすべてのオブザーバーがこれと競合するデータを持っているかどうかを確認する必要があります。つまり、理解できる限り、巨大な再帰関数を意味します。 したがって、これは、上下に移動できる階層を持たせる必要があるという事実に要約できると思いますし、いくつかの場所はそれらを全体として扱うことができます(基本的に再帰)。 また、私は単に機能するソリューションを目指しているわけではありません。比較的理解しやすく(少なくともアーキテクチャ的には)、将来的に追加機能を簡単に受信できる柔軟性を備えたソリューションを見つけたいと思っています。 この問題または同様の階層の問題を解決するための設計パターン、または実行すべき優れたプラクティスはありますか? 編集: 私が持っているデザインは次のとおりです。 「Phoenix」クラスは、適切な名前をまだ考えていなかったため、そのように命名されています。 しかし、これに加えて、グループを通じて特定のオブザーバーに関連付けられている場合でも、特定のオブザーバーに対して特定のアクティビティを非表示にする必要があります。 少しオフトピック: 個人的には、この問題をより小さな問題に切り詰めることができるはずだと感じていますが、それは私をどのように回避します。相互に関連付けられていない複数の再帰機能と、さまざまな方法で情報を取得する必要があるさまざまなクライアントタイプが関係しているためだと思います。本当に頭を包むことはできません。階層の問題をカプセル化する方法を改善する方向に誰かが私を導くことができれば、それを受け取ることも非常にうれしいです。

9
大規模な密結合クラスを分割する方法は?
私は、2k行を超えるコード(および成長中)の巨大なクラスをいくつか持っており、可能であればリファクタリングして、より軽くてクリーンなデザインにしたいと考えています。 それが非常に大きい理由は、主にこれらのクラスがほとんどのメソッドがアクセスする必要があるマップのセットを処理し、メソッドが互いに非常に接続されているためです。 非常に具体的な例を挙げServerます。着信メッセージを処理するというクラスがあります。それはのようなメソッドを持っているjoinChatroom、searchUsers、sendPrivateMessage、これらの方法のなどすべてがマップする操作などusers、chatrooms、servers、... チャットルームに関するメッセージを処理するクラス、ユーザーに関するすべてを処理するクラスなどがあればいいかもしれませんが、ここでの主な問題は、ほとんどのメソッドですべてのマップを使用する必要があることです。これらがすべてServerこれらの共通マップに依存しており、メソッドが互いに非常に関連しているため、今のところそれらはすべてクラスに固執している理由です。 クラスChatroomsを作成する必要がありますが、他の各オブジェクトへの参照があります。クラスは、他のすべてのオブジェクトへの参照などを使用して再びユーザーになります。 私は何か間違ったことをしているような気がします。

8
MVCはWebにのみ適用されますか
Model View Controller(MVC)について開発者と話すと、サーバーがエンティティ(MODEL)を構築し、そのモデルの視覚的表現を提供するURLへのリクエストを行うと言うとき、それはほぼ瞬時です。 これは、MVC がWeb専用であることを意味しますか、それともWebアプリケーションを作成するためにMVCを使用する開発者だけの人と会ったことがありますか? デスクトップスタイルのアプリケーションでMVCの使用法はありますか? 私は、パラダイムが初めてであり、MVCのスーパーセットについて知りたい

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