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

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

5
日付と時刻の2つのデータベースフィールド-マージする必要がありますか?
次の質問では、フィールドとテーブルの名前がIDを保護するために変更されています。 2つのデータベース列がある場合: MONKEY_DATE DATETIME NULL (with data e.g. 2012-05-14 00:00:00.000) MONKEY_TIME DATETIME NULL (with data e.g. 1753-01-01 16:30:53.025) 時間フィールドの日付コンポーネントは、ほとんどが1753年1月1日に設定されています...しかし、一部のデータは1899年1月1日で、一部は1900年1月1日です。 これらの列をクエリおよびレポートするコードを維持すると、私(および私たちのチーム)は2つの列をマージすることで簡単に解決できる頭痛の種を引き起こします。しかし、経験(およびTerry Goodkind)は、決して簡単なことはないことを教えてくれました。これが頭痛の原因であるいくつかの例を以下に示します。 私のアプローチ 次のアプローチには、2つの列をマージするという望ましい効果があると思います。 SQLを使用してデータを更新し、日付フィールドの値と時間フィールドの値の両方を同じ値に設定します。これは、日付フィールドの日付コンポーネントと時間フィールドの時間コンポーネントの混合です。 MONKEY_DATEフィールドのみを使用して新しいコードを記述します 最終的にMONKEY_TIMEフィールドと日付/時刻コンポーネントSQLを段階的に廃止します(例を参照) MONKEY_TIMEをドロップ これは、すぐに行ってシステム全体に遡及的な変更を加える必要がないことを意味します。既存のコードはすべて引き続き機能します...そして、正しい方法で作業を開始できます。 #1のSQLは(Oracle)の場合があります。 UPDATE MONKEY SET MONKEY_DATE = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') || TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), 'MM/DD/YYYY HH24:MI:SS') MONKEY_TIME = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') || TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), …

2
大量のデータを処理する低カップリング
通常、それらの間でリスト、セット、およびマップを交換するクラスを作成することにより、低結合を実現します。現在、Javaバッチアプリケーションを開発していますが、十分なメモリがないため、すべてのデータをデータ構造内に配置できません。データの1つのチャンクを読み取って処理し、次のチャンクに進む必要があります。したがって、読み取るデータがまだあるかどうかなどをどこかで確認する必要があるため、カップリングを低くすることははるかに困難です。 私が今使っているのは: ソース->プロセス->持続 処理するクラスは、読み込む行がまだあるかどうかをソースクラスに問い合わせる必要があります。 そのような状況でのベストプラクティスや有用なパターンは何ですか? 私に言わなければ、自分自身を説明しているといいのですが。

1
ビジネスルールがMVCでの表示に影響する場合
MVC設計パターンは、ビジネスルールをプレゼンテーションから分離することにつながります。 ただし、ビジネスルールがプレゼンテーションに影響を与えることがあります。これに対処する最良の方法は何ですか?ViewModelを使用する必要があるのはそのときですか? たとえば、存在しないライブラリアプリケーションに戻って、図書館員が返却された本をスキャンしています。システムは、本が遅れていることを示し、その常連客に罰金を課します。 特定の従業員は、特定の条件に基づいて罰金を無効にするセキュリティを持っている場合があります。 ライブラリアプリケーションのプレゼンテーションレイヤーでは、従業員が罰金を0に設定するか、ボタンをクリックして罰金を上書きする必要があります。 しかし、これを行うためのセキュリティがない従業員は、料金を無効な入力またはおそらく読み取り専用として見る必要があります。 セキュリティだけがビジネスルールではない場合があることに注意してください。これは単なる例です。たとえば、アプリケーションのどこかに設定情報が設定されていて、画面のフィールドが不要になるなどです。 このコードでは、誰でも罰金を変更してから検証メッセージを表示することができますが、それは良いユーザーエクスペリエンスではありません。 これを達成するための良い習慣は何ですか?(ASP.NET MVCを使用して)考えられるオプションは次のとおりです。 ビュー自体にビジネスルールをチェックさせ、フィールドを無効または有効にします。 ファインフィールドのプレゼンテーションを実装するHTMLHelper関数を使用し、そのヘルパー関数にビジネスルールをチェックさせます。 コントローラーにビジネスルールを確認させ、別のビューを使用してもらいます。 コントローラーにビジネスルールをチェックさせ、フィールドが有効かどうかを示すプロパティをViewBagに設定します。 ViewModelを使用して、ビジネスルールをチェックし、フィールドが有効であることを示す情報を設定します。 オプション1と2では、プレゼンテーションレイヤーでビジネスルールの検証を行わなければならず、混乱を招きます。 オプション3では、2つのビューが定義されているため、作業が重複します。 オプション4および5では、プレゼンテーションレイヤーがフィールドが有効または無効になっていることを認識している必要がありますが、理由は認識できません。私は4または5が一番好きだと思います。 私が考えていない他のオプションはありますか?

3
オーバーロードされた関数を正しくチェーンする方法は?
次のように増加するオプションのパラメーター(およびオプションのパラメーターと任意の数のパラメーターを許可しない疑似言語)を取る関数があるとします。 function doStuff(Param a) function doStuff(Param a, Param b) function doStuff(Param a, Param b, Param c) それらを単一の呼び出しに統合する良い方法は何ですか?2つのデザインを想像できます。 すべて落ちる: function doStuff(Param a) doStuff(a, defaultB) function doStuff(Param a, Param b) doStuff(a, b, defaultC) function doStuff(Param a, Param b, Param c) // magic goes here メリット:コードの重複が少なく、単一のデフォルトパラメータを簡単に変更できます。 欠点:多くの関数呼び出しにより、スタックトレースが読みにくくなるか、役に立たなくなる可能性があります。 または、「最後の」関数を直接呼び出します。 function doStuff(Param a) doStuff(a, defaultB, …

3
MVC Webアプリケーションで複雑なビュー(複数の部分から構成される)を処理する方法
MVCパターンを使用してブログWebアプリケーションを作成しているとしましょう。ブログアプリケーションのメインページの一般的なレイアウトは、メイン部分にある種の投稿インデックスであり、それ以外に、タイムライン、タグナビゲーションパネル、サブスクライブパネルなど、いくつかの追加部分があります。これらのコントロールは、単一の投稿ビュー。他のビューに表示される場合があります。 私の質問は-私のビューとコントローラーでこれらのパネルを別に処理する方法です。ここには3つのアプローチがあります。 ビュー(インデックスまたは単一の投稿)のレンダリングに必要なすべての情報を含む大きなviewmodelクラスを作成します。その場合、これらのサイドパネルを部分ビューにして、その大きなビューモデルの一部を渡してレンダリングされるビューから呼び出すことができます。欠点は、コードが重複していることを意味する、さまざまなコントローラーメソッド間でコードを埋めるviewmodelを使用することです。それはかなり悪いです。 ビューレンダリングの別のレイヤーを作成します。たとえば、レンダリングの最上位のレイヤーが、HTMLのレンダリング済みの部分、または呼び出されたときにHTMLを出力する関数を受け取ります。この「結合パーシャルレイヤー」の下のレイヤーは、メインコンテンツを含め、必要な各パネルのパーシャルビューを提供します。ここの欠点-メモリ使用量。ほとんどの最新のフレームワークはHTMLを直接出力ストリームにレンダリングしますが、このアプローチでは、部分ビューが最初に文字列オブジェクトにレンダリングされ、メモリのオーバーヘッドが発生します。 ビューからコントローラーメソッドを呼び出すasp.net mvcの「RenderAction」のようなものを使用します。これはMVCアプローチを落とすため、与えられた3の最悪のソリューションだと思います。 質問は特定のフレームワークに縛られているわけではありません。そのようなことを行う一般的な方法を理解したいと思います。 更新 答えが出た後、投稿が明確でないことがわかりました。ここで合理的な更新: 下でのviewmodelの用語私は、特定のビューをレンダリングするために必要なすべてのデータを含むオブジェクトを理解しています。 3つのアプローチはすべて、独自のビューモデルを使用して部分ビューを構築することを含みます。例(C#構文を使用): class SinglePostViewModel { string Text {get;set;} string Title {get;set;} string Slug {get;set;} DateTime PublishedDate {get;set;} ... } class TagNavigationPanelViewModel { string TagText {get;set;} int PostsCount {get;set;} } class CalendarNavigationPanelViewModel { DateTime YearAndMonth {get;set;} int PostsCount {get;set;} } 私の質問は、これらの部分的なビューをうまく組み合わせる方法です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.