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

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

4
同様のデータを取得するデータアクセスメソッドの重複を防ぐ方法は?
私がチームで取り組んでいるほぼすべてのプロジェクトで、同じ問題が侵入しているようです。誰かがデータを必要とするUIコードを書き、データアクセスメソッドを書きます。 AssetDto GetAssetById(int assetId) 1週間後、他の誰かがアプリケーションの別の部分で作業してAssetDtoいて、「承認者」を含む必要がありますが、次のように書きます: AssetDto GetAssetWithApproversById(int assetId) 1か月後、誰かがアセットを必要としていますが、現在は「質問」(または「所有者」または「実行中のリクエスト」など)が含まれています。 AssetDto GetAssetWithQuestionsById(int assetId) AssetDto GetAssetWithOwnersById(int assetId) AssetDto GetAssetWithRunningRequestsById(int assetId) そして、そのようなメソッドGetAssetWithOwnerAndQuestionsByIdが出現し始めると、さらに悪化します。 現れるパターンが表示されます。オブジェクトは大きなオブジェクトグラフにアタッチされており、このグラフのさまざまな部分をさまざまな場所に配置する必要があります。 もちろん、ほとんど同じことをするメソッドがたくさんあるのを防ぎたいです。それは単にチームの規律の問題ですか、それともこれを防ぐために使用できるパターンがありますか?場合によっては、個別のメソッドを使用することが理にかなっている可能性があります。つまり、実行中のリクエストでアセットを取得するのはコストがかかるため、常にこれらを含めたくありません。そのような場合の対処方法は?

2
IRepositoryからIQueryableを返す
リポジトリパターンを使用して、一般的な使用のために、データセット(テーブル)のIQueryableを返すことは適切ですか? これは多くの場合に非常に便利です。特に、そのインターフェイスを利用する外部ライブラリ、たとえば、UI要素をソート/フィルタリングしてバインドするプラグインを使用する場合に便利です。 ただし、IQueryableを公開すると、デザインにエラーが発生しやすくなる場合があります。これと遅延読み込みの誤った使用を組み合わせると、パフォーマンスが大幅に低下する可能性があります。 一方、使用方法ごとにアクセスメソッドを用意することは冗長であり、多くの作業(ユニットテストなど)も必要です。

2
どうすれば「知る」ことができますか?
私の会社は私を助けてもらうために求人情報を投稿しました。今日採用担当者から電話があり、彼が言い続けたのは「MVC this Entity Framework that ...」だけでした-プロジェクトがWinFormsとASP.NET WebFormsでDataSetsとLinq2Sqlを使用すると言ったとき、彼はショックを受けました。 それから私は自動化されたウェブサイトのテストのためのオプションを探していて、ここでこれに出くわしました:そして私は興奮し始めました。 「知っている」ほとんどの人は、プレゼンテーションレイヤーを使用してASP.NETを非常に薄くしているため、NUnitAspのようなツールは役に立ちません。 この人は知っている、そして彼の友人は明らかに知っている。知らないうちにいると不安になり、少し悲しくなります。 この1年で時代に対応するための取り組みの中で、Linq2SqlとUnityコンテナーの大きなメリットを実感しました。どちらも私にとっては良いものでした-何年にもわたって私には明らかだったギャップを埋めることです。 その後、WinForms GUIのModel-View-Preseneterに移動しましたが、同じ理由で再びとても満足していました-長い間、私はシッククライアントとWebを分離できるように物事を分離する方法を求めていましたクライアントは共通のコードベースで共通のロジックを共有します。 しかし、私は次のことに苦労しています。そして、私は無数の人々が間違っていることはないことを知っています、そして私は大衆より賢くありませんが、私は見るために助けが必要です: WebFormsの進化としてのMVC WinFormsの進化としてのWPF Linq2Sqlの進化としてのエンティティフレームワーク(そして、さらに言えば 、データセットの非推奨) (これはすべて、これまでのところ、テストファーヴェルニュゲンを入手できなかったことに起因していると思います) したがって、私は自分自身に尋ねてきました。 WebアプリケーションでMVCを使用すると何が得られますか?追加のソースコードアーティファクトと新しいDSLを習得することを知っています。ほかに何か? MVVMパターンなしでWPFオブジェクトを使用するとどうなりますか?どこか他の場所に就職するチャンスを傷つけませんか? それに関して、WinFormsは本当に壊れているのですか?それは私ですか、それとも、8ギガのRAMを搭載したデュアルコア2.8 GHZマシンでVisual Studioに顕著な視覚的遅れがありますか?私はきびきびと好きです。エンドユーザーにはいつでもスッキリと体験して欲しい。 データセットが「古い方法」である理由 それらは、私が解決しなければならない多くの中小規模の問題に対して、迅速かつ効率的で簡潔に見えます(ただし、Silverlightにさえありません)。 プレートには複雑な山がたくさんあり、それを広げても消えないように感じます。本質的な量の複雑さは正面から向き合う必要があり、おそらくソフトウェアエンジニアリングは電気工学や機械工学、または脳外科手術のようになるはずです。

12
厳しい納期で設計パターンを実装できましたか?
厳しい締め切りで、誰がデザインパターンを実装する時間があるのか​​と思います。初めて正しく時間枠内に収めるには、作業とプログラミングのオーバーヘッドがはるかに多くなります。それには長期的な利点があることは知っていますが、クライアントが頭に座っていてプレッシャーが高まっているときに、設計パターンを正しく実装できましたか。 最初のバージョンがリリースされて、次のリリースに十分な時間があれば、デザインパターンを使用してコードの品質と管理性を向上させることはできないと思います。

6
継承を使用してコードを再利用する場合、再利用の利点を飲み込むのが難しいと思いませんか?
私は約8年間コーディングを行ってきましたが、継承は柔軟性が高すぎるため、作成したコードと完全に混同されることがあります。最も簡単な例は次のとおりです。 abstract class AClass { protected void method1() { if(check()) { do1(); } else { do2(); } } protected abstract void do1(); protected abstract void do2(); } クラスの目的は、do1()とdo2()を実装してさらにロジックを実行できるようにすることですが、method1()をオーバーロードすることを決定すると、状況はすぐに複雑になります。 私は戦略パターンでのみコードを見つけます。コードは継承を通じてよく再利用されます。ほとんどの場合、基本クラスの設計者はそのサブクラスを非常によく知っており、その継承は完全にオプションです。 IoHandlerの4つのクラスによって継承されるクラスがあり、サーバーサイド、クライアントサイド、エッジサーバー、オリジンサーバーのサブクラスであり、私を狂わせ始めています。私はいつもコードのリファクタリングをしていました。うまくいくと思うアイデアを思いついたのですが、うまくいかなかったのです。人間の脳は一度に7つの情報しか保持できないと言われています。

3
CSSクラスをデコレーターとして使用する-良いパターン?
私はかなり複雑なGUIを備えたWebアプリを構築してきました-多くの小さな要素を並べて、さまざまな動作(ドラッグ、クリック、ただし状況依存)を必要とする他の要素内に。 私のコードは次のように機能する傾向があります: コントロールはhtmlタグとして始まります <li> 次に、クラスをタグに追加します <li class = 'static passive included'> 一部のクラスは、CSSスタイリングが外観に影響を与えるためのものである可能性があります .static {background: blue; float: left;} 他の人は、jQueryに基づいて、関連するDOMイベントの動作を提供します $("#container").delegate(".passive", function {onclick : //do-stuff}) そして、他のものは、ドキュメントをスキャンするとき、通常のJavaScriptによって拾われるかもしれません 'included'クラスを持つすべてのノードのテキスト値を収集します。したがって、特定のDOM要素は、cssとjQueryの組み合わせによって定義されたクラスを実装するGUIオブジェクトです。 私の質問は、これは良い方法ですか?そして、これらは本当に「装飾者」でもあります-彼らは確かに「動的にオブジェクトに追加の責任を追加します」が、私はその用語についてはわかりません。最後に、このパターンを自分のサイトで使用していますか?

4
パイプラインを処理するためのモジュール式アーキテクチャ
私はC ++で実装するシステムのアーキテクチャを設計しようとしていますが、人々が良いアプローチを考えたり、これまでに設計したアプローチを批評したりできるのではないかと考えていました。 まず、一般的な問題は画像処理パイプラインです。これにはいくつかの段階が含まれており、目標は高度にモジュール化されたソリューションを設計することです。これにより、任意の段階を簡単に入れ替えてカスタムコードに置き換えることができます(ユーザーが知っている場合は速度を上げることができます)。特定の段階が彼または彼女の問題において特定の方法で制約されていること)。 現在の考え方は次のようなものです: struct output; /*Contains the output values from the pipeline.*/ class input_routines{ public: virtual foo stage1(...){...} virtual bar stage2(...){...} virtual qux stage3(...){...} ... } output pipeline(input_routines stages); これにより、人々はinput_routinesをサブクラス化し、必要なステージをオーバーライドできます。とは言っても、私は以前このようなシステムで働いたことがあり、サブクラス化やデフォルトのものが面倒になりがちで使いにくいことがわかったので、自分で書くのはめまいがしません。また、さまざまなステージ(6または7がある)がデフォルトのテンプレートパラメーターになる、よりSTL的なアプローチについても考えていました。 誰もが上記のパターンの批評、テンプレートアプローチに関する考え、または頭に浮かぶ他のアーキテクチャを提供できますか?

6
「戦略」デザインパターンの理解を深める
しばらくデザインパターンに興味があり、「Head First Design Patterns」を読み始めました。最初は「戦略」パターンと呼ばれるパターンから始めました。下の画像で概説されている問題を調べ、最初に自分で解決策を提案しようとしたので、パターンの重要性を本当に理解できました。 だから私の質問は、以下の問題に対する私の解決策がなぜ十分ではないということです。パターンに対するソリューションの良い点と悪い点は何ですか?パターンが明らかに唯一の実行可能なソリューションになるのはなぜですか? 私の解決策 親クラス:DUCK <?php class Duck { public $swimmable; public $quackable; public $flyable; function display() { echo "A Duck Looks Like This<BR/>"; } function quack() { if($this->quackable==1) { echo("Quack<BR/>"); } } function swim() { if($this->swimmable==1) { echo("Swim<BR/>"); } } function fly() { if($this->flyable==1) { echo("Fly<BR/>"); } …

2
Ruby(およびその他の動的言語)プログラマーはIoC / Dependency Injectionを使用していますか?
私は主にASP.NET開発者であり、私が最近紹介した1つのことは、記述するコードの品質に最も劇的な影響を与えたもので、IoCコンテナーを使用して異なるレイヤー間の依存関係を管理する方法を学びましたアプリケーションの効率。 私は最近、個人的なプロジェクトのためにRuby(およびRails)を学ぶことを趣味にしており、今のところこの言語が大好きです。ただし、私が使用してきたさまざまなチュートリアルやリファレンスから気付いたことの1つは、IoCの使用についてまだ言及されていないことです。これは、初期段階で開発者にドラムされている(およびそうでないはずである).NETとはまったく対照的です。 Rubyで依存性注入が必要ない理由の1つは、クラス内のすべてがパブリックで仮想であり、変更が自由にできるため、優れた単体テストを作成するために実際には必要ないことです。ただし、IoCコンテナを使用することには、他にも多くのメリットがあります。たとえば、これによってもたらされるデカップリングオプション、オブジェクトの作成とライフタイムの管理などです。 Rubyで依存性注入が使用されていますか?そうでない場合、なぜこれが問題ではないのですか?

6
非常にスケーラブルで動的な「ルールベース」のアプリケーションですか?
大規模なエンタープライズアプリの場合、変更に対応できることがデザインの最も重要な側面の1つであることは誰もが知っています。ビジネスロジックの変化に対応するために、多くの場合、ルールベースのアプローチを使用しており、各ルールはDBに格納されています。これにより、厄介な詳細に飛び込むことなく、簡単に変更を加えることができます。C#はEval( "foo(bar);")を実行できないため、これは行に格納されたフォーマットされた文字列を使用して実行され、実行時にJavaScriptで処理されます。これは正常に機能しますが、エレガントではなく、レガシーになると、他の人が手に入れるのが最も楽しいものではありません。 これに対するよりエレガントな解決策はありますか?かなり頻繁に変更される何千ものルールに遭遇すると、それは本当のことになりますが、これは、誰かがこれを行うためのより良い方法を考えていない問題の珍しいことではありません。助言がありますか?この現在の方法は防御可能ですか?代替案は何ですか? 編集:明確にするために、これは大規模なエンタープライズアプリであるため、どのソリューションが機能しても、ルールとデータ(約10)を常に維持している人はたくさんいます。また、データは頻繁に変更されるため、ある種の集中サーバーシステムは基本的に必須であると言えます。

2
オブジェクト指向ではないパラダイムのためのデザインパターンの本、論文、またはリソース?
機能設計パターンに関するInfoQでこのビデオを視聴した後、オブジェクト指向ではないパラダイムの設計パターンに関するリソースはどこにあるのだろうと思いました。OOの世界(GOFなど)やアーキテクチャ(EoEAAなど)についてはたくさんありますが、関数、ロジック、その他のプログラミングパラダイムについて何があるのか​​はわかりません。何かありますか?ビデオ中のコメントはおそらくそうではないことを示唆しています-誰かがよりよく知っていますか? (ちなみに、デザインパターンとは、言語機能やデータ構造ではなく、リンクされたビデオで説明されているように、アプリケーションを設計するためのより高いレベルのアプローチを意味します)

5
ソフトウェア開発のベストプラクティスを、ソフトウェアのバックグラウンドを持たない人々にとってより興味深いものにするにはどうすればよいですか?
私が働いている場所には、ソフトウェアのバックグラウンドを持つ経験豊富なソフトウェア開発者が何人かいますが、開発者の大多数は、優れたドメイン知識はあるものの、高品質で保守可能なソフトウェアの開発に関して限られた経験を持つ物理学者または化学者です。これに対処するために、私たちは定期的な話し合いやワークショップを開催し始めました。 これらの人々をより効果的なソフトウェア開発者にするのに役立つように、どのようなトピックについて話し合うべきだと思いますか? 特に、多くの開発者はソフトウェアを興味深いテーマと見なしていないため、これらの講演に熱心に取り組むのに苦労しています。 ソフトウェアのバックグラウンドを持たない人々にとって、これらをどのようにもっと面白くできるでしょうか? ありがとう

1
Mementoデザインパターンの「Memento」クラスは何ですか?
ギャングオブフォーの「メメント」デザインパターンでは、Mementoクラスは実際には私に値を提供しない役に立たないラッパーのように見えます。 それはなんのためですか?String(ウィキペディアの例のように)オブジェクトを単に渡すことができない理由はありますか?

8
STLはOOで実装されていますか?
Adaptor、STLに実装されたIteratorなど、いくつかの設計パターンがあります。 それは、STLがOOの概念で実装されているということですか? OOとC ++のテンプレートパーツの関係は何ですか? オブジェクト指向を正当化する仮想メンバー関数がテンプレートと矛盾することを知りましたが、これは正しいですか?

3
Ajax競合状態
Ajaxの競合状態を処理するためのパターンまたは標準的な方法はありますか?次の例を見てください。2つのテーブルがあります。テーブル1の行をクリックすると、DBからデータが削除され、テーブル2が更新されます(テーブル1のすべての行から、クリックされた行を差し引いたものが表示されます)。 誰かが一連の行を連続してクリックする場所がある場合、タイミング/ラグの問題に対するすべてのクリックでテーブル2が更新されないシナリオが発生する可能性があります。 これに取り組む良い方法は何でしょうか?私は可能なキューを使用することを考えていましたが、それは非同期で実行する目的を無効にします。ただし、UIがロックされないという利点はあります。

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