一般的web程序員剛剛轉到.net或jsp時,往往編程觀念轉不過來,還是按照以前那種結構化的編程思 路來,而不從面向對象的角度考慮,造成業務邏輯與頁面html代碼混雜在一起,一旦頁面原型改變,相應 的程序也要修改,這樣造成代碼的可重用性太低。而asp.net或jsp比asp最大的一個進步就是面向對象, 使代碼可重用性達到最高。作為一個典型的web程序來說,一般把它分為三層比較理想,業務層,數據層 和頁面顯示層。下面以一個輿論調查的例子來講一下。 讓我們先來看一下如果一個輿論調查從面向對象的角度來考慮應該是怎樣的。首先,從數據方面來說 ,一個輿論調查應該有一個調查主題,然后應該有幾個調查項,最后還應該有參加調查的用戶以及比如調 查起止時間等等;其次,從輿論調查的方法來說,很簡單,一個投票的方法,然后就是顯示調查結果的方 法。知道了上面這些,我們就可以這樣來構造一個調查類: namespace MyClass.Util { using System; using System.Collections ; using System.Drawing ; using MyClass.Util ; /// <summary> /// 一個通用的調查類 /// </summary> public class Survey : object { /// <summary> /// 調查編號 /// </summary> /// <remarks> /// 在數據庫中是varchar型,20字節 /// </remakrs> protected string m_strID ; /// <summary> /// 調查標題 /// </summary> protected string m_strTitle ; /// <summary> /// 調查開始時間 /// </summary> protected DateTime m_datBeginTime ; /// <summary> /// 調查截止時間 /// </summary> protected DateTime m_datEndTime ; /// <summary> /// 點擊數 /// </summary> /// <remarks> /// 瀏覽人數 /// </remarks> protected int m_intHits ; /// <summary> /// 調查項 /// </summary> protected ArrayList m_arrItems ; //屬性 /// <summary> /// 調查標題 /// </summary> public string Title { get { return m_strTitle ; } set { m_strTitle = value ; } } /// <summary> /// 總共點擊數 /// </summary> public int Hits { get { return m_intHits ; } set { m_intHits = 0 ; } } /// <summary> /// 調查開始時間屬性 /// </summary> public DateTime BeginTime { get { return m_datBeginTime ; } set { m_datBeginTime = value ; } } /// <summary> /// 調查截止時間屬性 /// </summary> public DateTime EndTime { get { return m_datEndTime ; } set { m_datEndTime = value ; } } /// <summary> /// 調查項集合 /// </summary> /// <remarks>是一個SurveyItem類的集合</remarks> public ArrayList Items { get { return m_arrItems ; } set { m_arrItems = value ; } }
/// <summary> /// 調查編號 /// </summary> public string SurveyID { get { return m_strID ; } set { m_strID = value ; } } /// <summary> /// 構造函數 /// </summary> public Survey() { // // TODO: Add Constructor Logic here // m_strTitle = "" ; m_arrItems = new ArrayList() ; }
/// <summary> /// 重載構造函數 /// </summary> /// <param name="a_strTitle">調查標題 </param> /// <remarks>適用于沒有截止時間的調查</remarks> public Survey(string a_strTitle) { m_strTitle = a_strTitle ; m_datBeginTime = DateTime.Today ; m_datEndTime = DateTime.Today ; m_arrItems = new ArrayList() ; }
/// <summary> /// 重載構造函數 /// </summary> /// <param name="a_strTitle">調查標題 </param> /// <param name="a_datBeginTime">開始時間 </param> /// <param name="a_datEndTime">結束時間 </param> /// <remarks>適用于有截止時間的調查</remarks> public Survey(string a_strTitle , DateTime a_datBeginTime , DateTime a_datEndTime) { m_strTitle = a_strTitle ; m_datBeginTime = a_datBeginTime ; m_datEndTime = a_datEndTime ; } /// <summary> /// 增加調查項 /// </summary> /// <param name="a_objItem"> </param> public void AddItem(object a_objItem) { if (a_objItem is SurveyItem) { m_arrItems.Add(a_objItem) ; } } /// <summary> /// 虛函數 /// </summary> /// <param name="a_intID">該項編號 </param> public virtual void Vote(int a_intID) {
} /// <summary> /// 虛函數,保存到數據庫 /// </summary> /// <param name="a_objItem"> </param> public virtual void SaveItem(object a_objItem) {
} /// <summary> /// 虛函數,保存調查到數據庫 /// </summary> public virtual void SaveToDatabase(string m_strSurveyID) { throw(new Exception("基類函數不能直接使用")) ; }
/// <summary> /// 從數據庫中取得調查及調查項 /// </summary> /// <param name="a_intID">對應數據庫中的id </param> public virtual void LoadFromDatabase(string a_strID) {
} /// <summary> /// 查找調查項 /// </summary> /// <param name="a_intID">調查項編號 </param> public SurveyItem GetItem(int a_intID) { if (a_intID > 0 && a_intID < m_arrItems.Count) { return (SurveyItem)(m_arrItems[a_intID]) ; } else { throw(new Exception("調查項下標越界")) ; } } /// <summary> /// 查找調查項 /// </summary> /// <param name="a_strText">調查項標題 </param> /// <remarks>根據標題查找調查項,找到就返回它的序號,否則就返回-1</remarks> public int IndexOf(string a_strText) { for (int i = 0 ; i < m_arrItems.Count ; i ++) { if (a_strText == ((SurveyItem)m_arrItems[i]).Text) { return i ; } }
return -1 ; } /// <summary> /// 查找調查項 /// </summary> /// <param name="a_intID">調查項編號 </param> /// <remarks> /// 根據調查項標號來查找調查項,如果找到返回序號,否則返回-1</remarks> public int IndexOf(int a_intID) { for ( int i = 0 ; i < m_arrItems.Count ; i ++) { if (a_intID == ((SurveyItem)m_arrItems[i]).ID) { return i ; } } return - 1 ; } /// <summary> /// 顯示結果 /// </summary> /// <param name="a_strFileName">生成圖片的保存位置 </param> public void CreateResultImage(string a_strFileName , MyChart.ChartType
a_intChartType , int a_intWidth , int a_intHeight , Color a_objBackColor) { //定義一個顏色數組 ArrayList ItemColors = new ArrayList() ; ItemColors.Add(Color.Red) ; ItemColors.Add(Color.Black) ; ItemColors.Add(Color.Blue) ; ItemColors.Add(Color.DeepSkyBlue) ; ItemColors.Add(Color.Firebrick) ; ItemColors.Add(Color.Orange) ; ItemColors.Add(Color.Green) ; ItemColors.Add(Color.WhiteSmoke) ; ItemColors.Add(Color.Tan) ; ItemColors.Add(Color.DarkSeaGreen) ; ItemColors.Add(Color.Fuchsia) ; ItemColors.Add(Color.Goldenrod) ; MyChart myChart = new MyChart(m_strTitle , a_objBackColor , a_intWidth , a_intHeight , a_intChartType , "人次") ; for (int i = 0 ; i < m_arrItems.Count ; i++) { //調查項 SurveyItem item = (SurveyItem)m_arrItems[i] ; //圖表項 myChart.AddItem(new ChartItem(item.Text , item.Count , (Color)ItemColors[i])) ; } try { myChart.Create(a_strFileName) ; } catch(Exception e) { throw(new Exception(e.ToString())) ; } }
} /// <summary> /// 調查項類 /// </summary> public class SurveyItem : object { /// <summary> /// 調查項編號,對應將來數據庫中的id /// </summary> protected int m_intID ; /// <summary> /// 調查項標題 /// </summary> protected string m_strText ; /// <summary> /// 調查項描述 /// </summary> protected string m_strDescription ; /// <summary> /// 調查項數量 /// </summary> protected int m_intCount ; public int ID { get { return m_intID ; } set { m_intID = value ; } } /// <summary> /// 構造函數 /// </summary> public SurveyItem() { m_strText = "" ; m_strDescription = "" ; m_intCount = 0 ; } //屬性 /// <summary> /// 調查項標題屬性 /// </summary> public string Text { get { return m_strText ; } set { m_strText = value ; } } /// <summary> /// 調查項描述屬性 /// </summary> public string Description { get { return m_strDescription ; } set { m_strDescription = value ; } } /// <summary> /// 調查項數量屬性 /// </summary> public int Count { get { return m_intCount ; } set { m_intCount = value ; } } //函數 /// <summary> /// 重載構造函數 /// </summary> /// <param name="a_intID">調查項編號 </param> /// <param name="a_strText">調查項標題 </param> /// <param name="a_strDescription">調查項描述 </param> /// <param name="a_intCount">調查項數量 </param> public SurveyItem(int a_intID , string a_strText , string a_strDescription , int a_intCount) { m_intID = a_intID ; m_strText = a_strText ; m_strDescription = a_strDescription ; m_intCount = a_intCount ; }
public SurveyItem(string a_strText) { m_strText = a_strText ; } } }
一個基本的調查類就做好了,這個可以作為業務層。但是你可以發現實際上這個類現在什么都做不了,原 因很簡單,因為沒有同數據庫掛接。眾所周知,沒有數據庫的支持什么都是白搭,那么,我們現在如何來 掛接數據庫,也就是做數據層呢?
|