2013-07-24 26 views
0

我一直在做長時間的醫療數據收集的Web應用程序。客戶總是有這樣的要求:在表單中添加一個新字段,例如他們想要以人口統計形式添加「性別」。如何(設計模式)處理添加新字段?

每次他們要求時,我必須
1.在頁面上添加一個新的文本框。
2.在我的人口統計表單類中添加一個新字段(屬性)。
3.更改我的業務邏輯以將表單保存到數據庫。
4.更改我的業務邏輯以從DB加載表單。
5.在數據庫表中添加一個新列。
6.更改插入和更新人口統計表的存儲過程。

我必須對每一層,每個模塊(UI,業務層,數據訪問層,數據庫)進行更改,我覺得它很愚蠢。

我該如何處理這種變化?我應該使用什麼樣的模式?

回答

1

類似ORM的東西在這裏會很有幫助。我會給你從Django framework的例子。我並不是說你應該特別使用這個,但是它的教程很好地說明了這個概念。

這就是我們的模型類:

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類中添加一個字段時,它會自動傳播到數據庫創建和提取查詢,並且表單將合併新添加的字段。

當然,不同的框架行爲會略有不同,因此您需要在使用前檢查它們。他們通常都會提供解決問題的工具,並調整通用解決方案不足的地方。

+0

感謝鮑爾泰克!我正在使用ASP.NET。凌到SQL(ORM)和反射爲我節省了很多時間。但業務邏輯層仍然需要修改。 – etlds

+0

@etlds我沒有看到爲什麼它不應該能夠在模型更改時自動創建適當的查詢。 –

+0

是的。但是如果我不想讓我的UI層直接調用DAL,我會有BLL。我的BLL將調用自動生成的新查詢。 – etlds

0

不完全是一個模式,但這裏有一個想法:

你可以在地圖/表/字典中的所有表單字段存儲在您的人口統計類。

  1. 添加字段在UI
  2. 增加它的價值類圖/字典預定義的關鍵
  3. 保存地圖/字典,您的數據庫使用每一對的鍵作爲列名
  4. 填寫你的地圖/字典DB插入一對列名作爲密鑰
  5. 保存時檢查是否有該列的密鑰。如果沒有 - 使用這種方法添加一個
  6. 通知你的邏輯,地圖/字典進行了更新和更新您創建查詢使用新列(鍵)
+0

感謝您的解決方案。我使用映射以外的映射。雖然它會失去一點表現。 – etlds