我如何看待DIV+CSS架构(一)

来源:互联网 发布:计算机二级java题库 编辑:程序博客网 时间:2024/05/29 04:40

+++ 每搞IT的人都知道B/S系统的DIV+CSS结构,知道它的好。但如果你问,DIV+CSS结构是什么?好在哪里?实际项目应该如何体现或实现?每个人都能和你白伙几句,有些人甚至会滔滔不绝,而往往这些滔滔不绝的人也只是听另一些滔滔不绝的人说的,仅仅是“接收”并“接受”了信息,That is all,就像一张磁盘,也许连磁盘都不如……
+++ 他们究竟对DIV+CSS结构了解多少?我比较讨厌那些狗屁不懂,却又在那夸夸其谈、口若悬河、没事糊弄人、装逼的人……可是我们身边恰恰就有很多这样的人。所以,我希望还没有多少编程经验、热心于编写代码,并希望在这个领域有所作为的你,谦恭地向身边的“高手”求教,对事物抱有一定的审视态度,并认真对待那些只会装逼的“磁盘”人。
+++ 本文及其之后的几篇文章,在不断改进的过程中,演示DIV+CSS结构。这些东西完全是自己的体会,如有不妥之处请指证。下面从一个最最简单的例子开始。
+++ 程序描述
功能很简单,根据用户输入的条件,进行检索并显示检索结果。程序的组成如下:
1) 一个自定义类Oracle.cs。Oracle.cs类位于项目的App_Code里;
2) 一个页面Default.aspx;
3) 在Web.Config文件里加入数据库链接字符串,如下:
<appSettings>
  <add key="ConnectString" value="Data Source=orc11;User ID=scott;Password=tiger;Unicode=True;Persist Security Info=false;"/>
</appSettings>
+++ 页面设计
<body>
    <form id="form1" runat="server">
        <asp:Label ID="lbl_empno" runat="server" Text="员工编号
        <asp:TextBox ID="txtc_empno" runat="server"></asp:TextBox></td>
        <asp:Button ID="btn_query" runat="server" Text="检索" OnClick="btn_query_Click" />
        <asp:GridView ID="gv_result" runat="server"></asp:GridView>
    </form>
</body>

++ 说明
1) 页面有四个控件:Label ,TextBox,Button和GirdView。给这它们起好名字,位置无所谓。
+++ 后台代码
添加Page_Load和btn_query_Click事件。根据自定义类Oracle,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string sql = @"select * from emp";
        Oracle ora = new Oracle();
        DataTable dt = ora.ExecuteSQL2DT(sql);
        this.gv_result.DataSource = dt;
        this.gv_result.DataBind();
    }
}
protected void btn_query_Click(object sender, EventArgs e)
{
    string value = string.Empty;
    string sql = string.Empty;
    value = txtc_condition.Text.ToString();
    sql = @"select * from emp t where t.empno=" + "'" + value + "'";
    Oracle ora = new Oracle();
    DataTable dt = ora.ExecuteSQL2DT(sql);
    this.gv_result.DataSource = dt;
    this.gv_result.DataBind();
}
++ 说明
1) Page_Load事件里的代码是在页面显示时,列出数据库中emp表的所有内容;
2) btn_query_Click事件里的代码是检索并显示结果。
+++ 自定义类Oracle.cs
对于一个如此简单的例子,你能很容易想到下面这个类。该类具体代码省略,你可以自己下载,后面我会给出下载地址。
public class Oracle
{
    private static string _connectString;
    private OracleDataAdapter _adp;
    private OracleConnection _conn;
    private OracleCommand _cmd = null;
    public Oracle()
    {        ……    }
    public Oracle(string connString)
    {        ……    }
    public DataRow ExecuteSQL2DR(string Sql)
    {        ……    }
    public DataTable ExecuteSQL2DT(string Sql)
    {        ……    }
    public DataSet ExecuteSQL2DS(string Sql)
    {        ……    }
    public string ExecuteSQL2String(string Sql)
    {        ……    }
    public bool ExecuteDMLSql(string Sql)
    {        ……    }
    public object ExecuteScalar(string Sql)
    {        ……    }
    private void CreateOpenCon()
    {        ……    }
    private void BeginTransaction()
    {        ……    }
    private void CommitTransaction()
    {        ……    }
    private void RollBack()
    {        ……    }
}
++ 说明
1) 该自定义类可以看作一个最最基本的数据库层;
2) 既然这个类相当于一个数据库层,那它至少具备两个大功能:一是执行INSERT、UPDATE、DELETE操作,如成员函数public bool ExecuteDMLSql(string Sql);二是执行SELECT操作,并且提供不同的返回值,比如DataTable、DataSet、Stirng、DataRow和Object;
3) 该自定义类中没有关于执行存储过程的代码,实际项目中是不可能的。存储过程可以大大提高数据库执行SQL的效率。如果你项目中有一个复杂的统计SQL,那么与其在程序中执行,倒不如把它写成存储过程;
4) 该自定义类中没有关于执行带参数的OracleCommand代码,实际项目中是不可能的。如果数据库中的表字段涉及到大对象,比如clob,blob,Oracle数据库统称它们为OracleLob,在这种情况下,肯定要使用带参数的OracleCommand来执行数据库的增删改操作;
5) 该自定义类中没有关于将数据库操作的错误信息写入日志的代码,实际项目中是不可能的。数据库的错误日志必须要写,尤其是对于大项目来说。通常使用委托,在异常处理中写入错误日志,然后正常关闭数据库,释放调资源;
6) 因为本例是个最最简单的例子,所有暂时省略掉以上那些没有的东西,在以后的文章中慢慢加上;
7) 该自定义类在每个成员函数中都加入了try…catch。我在最初工作的时候,虽然知道但凡是容易出错的地方都要加try…catch,但当你动手写的时候,你会发现——不知道应该在哪加,总不能都加吧!本来不想在这个简单的例子里加try…catch,但还是先加吧,既然这个类相当于数据库层,那有try…catch应该算是一个规范的。以后你明白,在数据库层,这是必须有的。
8) 该自定义类的写法不是必须的,完全取决于个人风格和项目需要;
+++ 总结
1) 在我说下面的内容前,请你先想想,这么写行吗?如果不行,你能想到些什么?我只有几个如果来回答这个问题;
2) 如果最终用户输入的检索条件有两个,那么你可能会在btn_query_Click事件里写如下代码:
string value1 = string.Empty;
string value2 = string.Empty;
string sql = string.Empty;
value1 = txtc_condition1.Text.ToString();
value2 = txtc_condition2.Text.ToString();
if (value1.Length <= 0 && value2.Length <= 0)
{
    Response.Write("<script>alert('请输入条件!');</script>");
}
else if (value1.Length > 0)
{
    sql = @"select * from emp t where t.***=" + "'" + value1 + "'";
}
else if (value2.Length > 0)
{
    sql = @"select * from emp t where t.***=" + "'" + value2 + "'";
}
else
{
    sql = @"select * from emp t where t.***=" + "'" + value1 + "'" +" and " + "t.***=" + "'" + value2 + "'";
}
Oracle ora = new Oracle();
DataTable dt = ora.ExecuteSQL2DT(sql);
this.gv_result.DataSource = dt;
this.gv_result.DataBind();


如果真这么写了,那首先整体代码是不是太长了点,其次实际项目中,一个按钮事件里应该不仅仅只有这个功能而已吧,那代码又长了点。你如何维护呢?噩梦。维护代码的工作绝对不仅仅是写这段代码一个人的事,而是参与这个项目的所有人,再者变量是不是多了点,在维护代码时,你花多长时间才能理清每个变量都是干什么用的,人的记忆可是呈半数衰减的,你又觉得别人看这段代码时会花多长时间才能理清楚——噩梦。如果用户输入三个、四个或是更多的条件怎么办;
3) 如果这个页面需要权限控制,也就是说,某些用户可以进行这个查询,某些用户则不可以,那么你可能在Page_Load事件里这样写,首先,从Session里获得用户名,根据用户名从数据库中获得该用户的权限,比如哪个按钮可用的信息,最后设置这些按钮的状态。假如这个用户只有查询的权限;
btn_query.Visible = true;
btn_add.Visible = false;
btn_update.Visible = false;
btn_del.Visible = false;

这样,Page_Load事件里的代码有长了一点——噩梦;
4) 如果页面上需要权限控制的东西比较多,你得写多少行false或true这样的赋值呢?而且每个页面都会有这样的代码,你觉得好吗——噩梦;
5) 也许你会说,把他们封装成函数,静态函数或是搞个类,写成成员函数,都放里边不就行了吗?真是这样吗,那估计你要写很多了,因为参数类型、参数个数和返回的值可能会不同,简直就是换汤不换药——噩梦。你又说了,既然参数类型和返回值的类型不同,直接把形式参数和返回值类型改成object不就得了,在搞个枚举,什么时候转成什么类型,参数个数不同也没关系,直接设成最大的……恩,如果你真这么做,我只能说你很有想法,至少你知道所有的数据类型都继承了object,除此之外我还能说什么呢;
6) 还要我再给出“如果”吗,光是第二条的那个“如果”就已经够受了;
7) 总之,代码没有行与不行的分别,而只有好与不好的差距。
+++ 代码下载
ARCHITECTUREExample01.rar 下载地址:
http://pickup.mofile.com/5994860540828249