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

编程|对象

    一般的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 ;
        }

    }
}

一个基本的调查类就做好了,这个可以作为业务层。但是你可以发现实际上这个类现在什么都做不了,原

因很简单,因为没有同数据库挂接。众所周知,没有数据库的支持什么都是白搭,那么,我们现在如何来

挂接数据库,也就是做数据层呢?

时间: 2024-08-01 13:48:55

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

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

编程|对象 好了,现在万事俱备,只欠东风了,让我们看看现在做一个舆论调查多么简单: file : vote.aspx <%@ Page language="c#" Codebehind="vote.cs" AutoEventWireup="false" Inherits="Football.vote" %> <html>  <head>  <title>532.com.cn --

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

编程|对象      现在你是不是发现已经可以用这个类来进行舆论调查的操作了?但这个类里还没有任何的页面html 输出,所以现在的问题就是做页面显示层了,但现在又面临一个问题,那就是如何显示调查结果的问题, 比较流行的做法是用图表来表示,可以根据需要选择条形图.饼性图或折线图等等,那么如果在这个调查 类里来做也可以,但实在太不上算,应该单独做这么一个图表类,可以根据条件画这种图表,下面就是这 个类的定义: namespace MyClass.Util{    using System;    u

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

编程|对象 首先,我们要来定义一个数据库表,以保存舆论调查的想关数据,看下面这个表:/*新闻调查表*/if exists(select * from sysobjects where id = object_id('Survey'))   drop table Surveygo create table Survey(  ID        int         identity Primary key    not null ,  SurveyID    varchar(20)    def

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

编程|对象         public MyChart()        {            //            // TODO: Add Constructor Logic here            //            m_arrItems = new ArrayList() ;            m_strTitle = "" ;            m_objBackColor = Color.White ;            m_intW

Javascript基础与面向对象基础~第八讲 从人类的起源谈面向对象

我很荣幸来写这个结局,有时,我们看人,物,事需要用心去看,而不是用眼睛,因为用眼睛看到的往往是事物的假像,在这里对我最可爱的兄弟说一声,对不起. 从人类的起源谈面向对象,事实上主要说的是面向对象,现在我简单来说一下面向对象的特性吧,当你把一个程序写成面向对象的之后,它将有三个好处,即 封装,继承和多态,这是所有面向对象语言的一个共性,而对于JS这个语言来说,也可以借鉴一下,如JS里实现封装,JS里的继承等等. JS封装: 当我们干某件事时,需要将一些代码组织在一起,形成一个function,而这

一个用纯CSS制作的网页下拉菜单

网页特效代码实例:一个用纯CSS制作的网页下拉菜单. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN""http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"[ <!ELEMENT a (#PCDATA | table)* > ]><html xmlns="http://www.w3.org/1999/xhtml" xml:lang

从一个圈套For循环来谈软件设计[原创]

设计|循环|原创 从一个圈套For循环来谈软件设计 武汉华中师范大学信管系 谢刚 摘要:就自己的一次实际经历来谈谈软件设计过程中应该注意的一些细节 关键字:软件设计 需求分析      前段时间,跟外面公司设计一个MIS系统(使用工具是PB8.0+MSSQL),是一个关于安全生产的.为了体现我们设计人员的高质量服务,我在<需求说明>之外又帮他们设计了一个功能,就是:在每次这个功能窗口打开时,到数据库中去自动检测看看有没有冲突数据:也就是说,两个一模一样的器材是否被安装了到了两个不同的机器上.这

用ASP学做一个在线调查

关于在线调查大家一定不会陌生吧,给出一个问题和数个答案,让用户填写,然后把结果保存到数据库,自动进行统计,最后给出个统计的图.这期的跟我学做就来做一个在线调查系统. 一.功能设计 这么简单的系统也要做功能设计?有的人也许会觉得奇怪,不过话说回来不管怎么样的系统,先做功能设计总是能对系统有个比较清析的了解.让我们来看看在线调查的功能吧.基本的功能上面已经说了,就是要给出一个问题和数个答案,然后统计,最后给出图.在这个基础上,我们可以考虑给一个调查加上一个时间段(有效期),在这个时间段里调查是有效的

一个在C#以及类似的面向对象系統(Java中估计也是如此)中常见的错误

错误|对象   using System; namespace demo{    class ClassA    {        protected string a = "test";         public void Display()        {            Console.WriteLine(a);        }    }     class ClassB:ClassA    {        protected string a = "a