从一个舆论调查的制作谈面向对象的编程思路(一)

一般的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 &gt; 0 &amp;&amp; a_intID &lt; 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 &lt; 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 &lt; 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 &lt; 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>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus