7

例:

SQL Server を使用してレンタル サービスを構築しています。レンタルできるアイテムに関する情報は、テーブルに格納されます。各アイテムには、「利用可能」、「レンタル」、「壊れた」のいずれかの状態があります。さまざまな状態がルックアップ テーブルに存在します。

ItemState テーブル:

id name
1 「利用可能」
2 「レンタル」
3 「壊れた」

これに加えて、アイテムが返却されるたびに、その状態が「レンタル」から「利用可能」に変更されるというビジネス ルールがあります。
これは、「update Items set state=1 where id=@itemid」のような更新ステートメントで実行できます。アプリケーション コードでは、ItemState id:s にマップされる列挙型がある場合があります。ただし、これらにはハード コードされた値が含まれているため、後でメンテナンスの問題が発生する可能性があります。開発者が一連の状態を変更する必要があったが、関連するビジネス ロジック レイヤーを修正するのを忘れたとします...

この種の設計上の問題に対処するために、どのような良い方法または代替設計がありますか?
直接の回答に加えて、関連記事へのリンクも歓迎します。

4

10 に答える 10

4

私が見たほとんどのシステムは、ルックアップ テーブルの値をハード コーディングし、それを使用しています。これは、実際には、コード テーブルが思ったほど変更されることはめったにないためです。また、それらが変更された場合は、通常、その DDL に依存するすべてのプログラムを再コンパイルする必要があります。

とはいえ、コードを保守可能 (称賛に値する目標) にしたい場合は、値をプロパティ ファイルに外部化するのが最善の方法です。その後、アプリ全体を再コーディングすることなく、後でこのファイルを編集できます。

ここでの制限要因は、アプリ自体の内部状態がルックアップ テーブルから取得した値に依存することです。これは、ある程度の結合を意味します。

アプリがそのコードに依存しないルックアップの場合 (たとえば、住所ドロップダウンで使用する 2 文字の州コードのリストがコード テーブルに格納されている場合)、コードをオブジェクトに遅延ロードできます。必要な場合にのみアクセスします。しかし、それはあなたがしていることにはうまくいきません。

于 2009-10-30T15:04:02.797 に答える
1

これは一般的な問題であり、妥当な懸念事項だと思います。そのため、最初にグーグル検索してこの記事を見つけました。

すべてのルックアップ値を保持する public static クラスを作成し、ハードコーディングする代わりに、アプリケーションのロード時にこれらの値を初期化し、名前を使用してそれらを参照するのはどうでしょうか?

私のアプリケーションでは、これを試してみましたが、うまくいきました。また、いくつかのチェックを行うこともできます。たとえば、コード内のルックアップのさまざまな可能な値の数は、db と同じである必要があります。そうでない場合は、log/email/etc. しかし、40 以上のビジネス エンティティのステータスについて、これを手動でコーディングしたくありません。

さらに、これは OR マッピングのより大きな問題の一部になる可能性があります。永続層の詳細があまりにも多く公開されているため、それを処理する必要があります。Entity Framework などのテクノロジでは、自動化されているため、「同期」の部分について心配する必要はありませんよね?

ありがとう!

于 2010-03-18T15:56:49.317 に答える
0

値はハードコーディングする必要があります。つまり、データベースで値を変更することはできません。つまり、値をデータベースに保存するのは冗長です。

したがって、それらをハードコーディングし、データベースにルックアップテーブルを持たないようにします。代わりに、アイテムの状態をアイテムテーブルに直接保存します。

于 2011-02-23T04:20:35.447 に答える
0

あなたが説明しているものと同様の方法を使用しました-値と説明(レポートなどに役立つ)を含むデータベース内のテーブルとコード内の列挙型。プログラマーがデータベースを更新する必要があることを認識できるように、「これらの値はデータベース ABC のテーブル X から取得されます」などのコードのコメントで同期を処理しました。対応するコードの変更なしにデータベース側からの変更を防ぐために、テーブルにアクセス許可を設定して、特定の人 (コードも変更する必要があることを覚えていることを願っています) のみがアクセスできるようにします。

于 2009-10-30T15:03:38.897 に答える