1

私は長い間、医療データ収集のための Web アプリを行ってきました。クライアントは常にこの種の要求を持っています: フォームに新しいフィールドを追加します。たとえば、人口統計フォームに「性別」を追加したいなどです。

彼らが要求するたびに、私はしなければなりません
1. ページに新しいテキストボックスを追加します。
2. 人口統計フォーム クラスに新しいフィールド (プロパティ) を追加します。
3. フォームを DB に保存するためのビジネス ロジックを変更します。
4. DB からフォームをロードするためのビジネス ロジックを変更します。
5. データベース テーブルに新しい列を追加します。
6. ストア プロシージャを変更して、デモグラフィック テーブルを挿入および更新します。

すべてのレイヤー、すべてのモジュール (UI、ビジネス レイヤー、データ アクセス レイヤー、データベース) を変更する必要があり、それはばかげていると感じています。

この種の変更をどのように処理できますか? どのパターンを使用すればよいですか?

4

2 に答える 2

1

ORM のようなものがここで役に立ちます。Django フレームワークの例を示します。特にこれを使用する必要があると言っているわけではありませんが、そのチュートリアルは概念をうまく説明しています。

それが私たちのモデルクラスです:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published)

次の DB クエリが生成されます。

BEGIN;
CREATE TABLE "polls_poll" (
    "id" integer NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" datetime NOT NULL
);
COMMIT;

次に、すべての投票を簡単に表示できます。

class IndexView(generic.ListView):
    model = Poll                        # specifies model
    template_name = 'polls/index.html'  # specifies HTML template

テンプレートは次のようになります。

{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

代わりに、自動フィールド反復を使用して、入力のデータを表示できます。Django は、データのタイプに一致する適切なタイプの入力を自動的に選択します。

これで、フィールドをPollクラスに追加すると、データベースの作成および抽出クエリに自動的に反映され、新しく追加されたフィールドがフォームに組み込まれます。

もちろん、フレームワークが異なれば動作もわずかに異なるため、使用する前に確認する必要があります。それらのすべては通常、問題を解決するためのツールを提供し、一般的なソリューションでは不十分なところを微調整します。

于 2013-07-24T14:28:42.037 に答える
0

正確なパターンではありませんが、ここにアイデアがあります:

Demographic クラスのマップ/テーブル/辞書にすべてのフォーム フィールドを格納できます。

  1. UI にフィールドを追加する
  2. 事前定義されたキーのクラスのマップ/辞書にその値を追加します
  3. 各ペアのキーを列名として使用して、マップ/辞書をDBに保存します
  4. 列名をキーとしてペアを挿入して、DB からマップ/辞書を作成します。
  5. 保存時に、そのキーの列があるかどうかを確認します。そうでない場合 - 追加
  6. このアプローチを使用して、マップ/辞書が更新されたことをロジックに通知し、CREATE クエリを新しい列 (キー) で更新します。
于 2013-07-24T14:39:05.683 に答える