一般的web程序员刚刚转到.net或jsp时,往往编程观念转不过来,还是按照以前那种结构化的编程思
路来,而不从面向对象的角度考虑,造成业务逻辑与页面html代码混杂在一起,一旦页面原型改变,相应
的程序也要修改,这样造成代码的可重用性太低。而asp.net或jsp比asp最大的一个进步就是面向对象,
使代码可重用性达到最高。作为一个典型的web程序来说,一般把它分为三层比较理想,业务层,数据层
和页面显示层。下面以一个舆论调查的例子来讲一下。
让我们先来看一下如果一个舆论调查从面向对象的角度来考虑应该是怎样的。首先,从数据方面来说
,一个舆论调查应该有一个调查主题,然后应该有几个调查项,最后还应该有参加调查的用户以及比如调
查起止时间等等;其次,从舆论调查的方法来说,很简单,一个投票的方法,然后就是显示调查结果的方
法。知道了上面这些,我们就可以这样来构造一个调查类:
namespace MyClass.Util
{
using System;
using System.Collections ;
using System.Drawing ;
using MyClass.Util ;
///
1<summary>
2/// 一个通用的调查类
3/// </summary>
public class Survey : object
{
///
1<summary>
2/// 调查编号
3/// </summary>
///
1<remarks>
2/// 在数据库中是varchar型,20字节
3///
4protected string m_strID ;
5
6/// <summary>
7/// 调查标题
8/// </summary>
9protected string m_strTitle ;
10
11/// <summary>
12/// 调查开始时间
13/// </summary>
14protected DateTime m_datBeginTime ;
15
16/// <summary>
17/// 调查截止时间
18/// </summary>
19protected DateTime m_datEndTime ;
20
21/// <summary>
22/// 点击数
23/// </summary>
24/// <remarks>
25/// 浏览人数
26/// </remarks>
27protected int m_intHits ;
28
29/// <summary>
30/// 调查项
31/// </summary>
32protected ArrayList m_arrItems ;
33
34//属性
35/// <summary>
36/// 调查标题
37/// </summary>
38public string Title
39{
40get
41{
42return m_strTitle ;
43}
44set
45{
46m_strTitle = value ;
47}
48}
49
50/// <summary>
51/// 总共点击数
52/// </summary>
53public int Hits
54{
55get
56{
57return m_intHits ;
58}
59set
60{
61m_intHits = 0 ;
62}
63}
64
65/// <summary>
66/// 调查开始时间属性
67/// </summary>
68public DateTime BeginTime
69{
70get
71{
72return m_datBeginTime ;
73}
74set
75{
76m_datBeginTime = value ;
77}
78}
79
80/// <summary>
81/// 调查截止时间属性
82/// </summary>
83public DateTime EndTime
84{
85get
86{
87return m_datEndTime ;
88}
89set
90{
91m_datEndTime = value ;
92}
93}
94
95/// <summary>
96/// 调查项集合
97/// </summary>
98/// <remarks>是一个SurveyItem类的集合</remarks>
99public ArrayList Items
100{
101get
102{
103return m_arrItems ;
104}
105set
106{
107m_arrItems = value ;
108}
109}
110
111/// <summary>
112/// 调查编号
113/// </summary>
114public string SurveyID
115{
116get
117{
118return m_strID ;
119}
120set
121{
122m_strID = value ;
123}
124}
125
126
127/// <summary>
128/// 构造函数
129/// </summary>
130public Survey()
131{
132//
133// TODO: Add Constructor Logic here
134//
135m_strTitle = "" ;
136m_arrItems = new ArrayList() ;
137}
138
139
140/// <summary>
141/// 重载构造函数
142/// </summary>
143/// <param name="a_strTitle"/>调查标题
144/// <remarks>适用于没有截止时间的调查</remarks>
145public Survey(string a_strTitle)
146{
147m_strTitle = a_strTitle ;
148m_datBeginTime = DateTime.Today ;
149m_datEndTime = DateTime.Today ;
150m_arrItems = new ArrayList() ;
151}
152
153/// <summary>
154/// 重载构造函数
155/// </summary>
156/// <param name="a_strTitle"/>调查标题
157/// <param name="a_datBeginTime"/>开始时间
158/// <param name="a_datEndTime"/>结束时间
159/// <remarks>适用于有截止时间的调查</remarks>
160public Survey(string a_strTitle , DateTime a_datBeginTime , DateTime
161
162a_datEndTime)
163{
164m_strTitle = a_strTitle ;
165m_datBeginTime = a_datBeginTime ;
166m_datEndTime = a_datEndTime ;
167}
168
169/// <summary>
170/// 增加调查项
171/// </summary>
172/// <param name="a_objItem"/>
173public void AddItem(object a_objItem)
174{
175if (a_objItem is SurveyItem)
176{
177m_arrItems.Add(a_objItem) ;
178}
179}
180
181/// <summary>
182/// 虚函数
183/// </summary>
184/// <param name="a_intID"/>该项编号
185public virtual void Vote(int a_intID)
186{
187
188}
189/// <summary>
190/// 虚函数,保存到数据库
191/// </summary>
192/// <param name="a_objItem"/>
193public virtual void SaveItem(object a_objItem)
194{
195
196}
197
198
199/// <summary>
200/// 虚函数,保存调查到数据库
201/// </summary>
202public virtual void SaveToDatabase(string m_strSurveyID)
203{
204throw(new Exception("基类函数不能直接使用")) ;
205}
206
207/// <summary>
208/// 从数据库中取得调查及调查项
209/// </summary>
210/// <param name="a_intID"/>对应数据库中的id
211public virtual void LoadFromDatabase(string a_strID)
212{
213
214}
215
216/// <summary>
217/// 查找调查项
218/// </summary>
219/// <param name="a_intID"/>调查项编号
220public SurveyItem GetItem(int a_intID)
221{
222if (a_intID > 0 && a_intID < m_arrItems.Count)
223{
224return (SurveyItem)(m_arrItems[a_intID]) ;
225}
226else
227{
228throw(new Exception("调查项下标越界")) ;
229}
230}
231
232
233/// <summary>
234/// 查找调查项
235/// </summary>
236/// <param name="a_strText"/>调查项标题
237/// <remarks>根据标题查找调查项,找到就返回它的序号,否则就返回-1</remarks>
238public int IndexOf(string a_strText)
239{
240for (int i = 0 ; i < m_arrItems.Count ; i ++)
241{
242if (a_strText == ((SurveyItem)m_arrItems[i]).Text)
243{
244return i ;
245}
246}
247
248return -1 ;
249}
250
251/// <summary>
252/// 查找调查项
253/// </summary>
254/// <param name="a_intID"/>调查项编号
255/// <remarks>
256/// 根据调查项标号来查找调查项,如果找到返回序号,否则返回-1</remarks>
257public int IndexOf(int a_intID)
258{
259for ( int i = 0 ; i < m_arrItems.Count ; i ++)
260{
261if (a_intID == ((SurveyItem)m_arrItems[i]).ID)
262{
263return i ;
264}
265}
266
267return - 1 ;
268}
269
270
271/// <summary>
272/// 显示结果
273/// </summary>
274/// <param name="a_strFileName"/>生成图片的保存位置
275public void CreateResultImage(string a_strFileName , MyChart.ChartType
276
277a_intChartType ,
278int a_intWidth , int
279
280a_intHeight , Color a_objBackColor)
281{
282
283//定义一个颜色数组
284ArrayList ItemColors = new ArrayList() ;
285ItemColors.Add(Color.Red) ;
286ItemColors.Add(Color.Black) ;
287ItemColors.Add(Color.Blue) ;
288ItemColors.Add(Color.DeepSkyBlue) ;
289ItemColors.Add(Color.Firebrick) ;
290ItemColors.Add(Color.Orange) ;
291ItemColors.Add(Color.Green) ;
292ItemColors.Add(Color.WhiteSmoke) ;
293ItemColors.Add(Color.Tan) ;
294ItemColors.Add(Color.DarkSeaGreen) ;
295ItemColors.Add(Color.Fuchsia) ;
296ItemColors.Add(Color.Goldenrod) ;
297
298MyChart myChart = new MyChart(m_strTitle , a_objBackColor ,
299
300a_intWidth ,
301a_intHeight , a_intChartType
302
303, "人次") ;
304for (int i = 0 ; i < m_arrItems.Count ; i++)
305{
306//调查项
307SurveyItem item = (SurveyItem)m_arrItems[i] ;
308
309//图表项
310myChart.AddItem(new ChartItem(item.Text , item.Count ,
311
312(Color)ItemColors[i])) ;
313
314}
315
316try
317{
318myChart.Create(a_strFileName) ;
319}
320catch(Exception e)
321{
322throw(new Exception(e.ToString())) ;
323}
324
325}
326
327}
328
329/// <summary>
330/// 调查项类
331/// </summary>
332public class SurveyItem : object
333{
334
335/// <summary>
336/// 调查项编号,对应将来数据库中的id
337/// </summary>
338protected int m_intID ;
339
340/// <summary>
341/// 调查项标题
342/// </summary>
343protected string m_strText ;
344
345/// <summary>
346/// 调查项描述
347/// </summary>
348protected string m_strDescription ;
349
350/// <summary>
351/// 调查项数量
352/// </summary>
353protected int m_intCount ;
354
355public int ID
356{
357get
358{
359return m_intID ;
360}
361set
362{
363m_intID = value ;
364}
365}
366
367/// <summary>
368/// 构造函数
369/// </summary>
370public SurveyItem()
371{
372m_strText = "" ;
373m_strDescription = "" ;
374m_intCount = 0 ;
375}
376
377//属性
378/// <summary>
379/// 调查项标题属性
380/// </summary>
381public string Text
382{
383get
384{
385return m_strText ;
386}
387set
388{
389m_strText = value ;
390}
391}
392
393/// <summary>
394/// 调查项描述属性
395/// </summary>
396public string Description
397{
398get
399{
400return m_strDescription ;
401}
402set
403{
404m_strDescription = value ;
405}
406}
407
408/// <summary>
409/// 调查项数量属性
410/// </summary>
411public int Count
412{
413get
414{
415return m_intCount ;
416}
417set
418{
419m_intCount = value ;
420}
421}
422
423
424//函数
425/// <summary>
426/// 重载构造函数
427/// </summary>
428/// <param name="a_intID"/>调查项编号
429/// <param name="a_strText"/>调查项标题
430/// <param name="a_strDescription"/>调查项描述
431/// <param name="a_intCount"/>调查项数量
432public SurveyItem(int a_intID , string a_strText ,
433string a_strDescription , int a_intCount)
434{
435m_intID = a_intID ;
436m_strText = a_strText ;
437m_strDescription = a_strDescription ;
438m_intCount = a_intCount ;
439}
440
441public SurveyItem(string a_strText)
442{
443m_strText = a_strText ;
444}
445
446
447}
448}
449
450一个基本的调查类就做好了,这个可以作为业务层。但是你可以发现实际上这个类现在什么都做不了,原
451
452因很简单,因为没有同数据库挂接。众所周知,没有数据库的支持什么都是白搭,那么,我们现在如何来
453
454挂接数据库,也就是做数据层呢?</remarks>