千萬不要被標題嚇倒,其實很簡單。不然只能一輩子寫面條式的程序了。特別是asp程序員大多寫都是3 in 1 (超白金版:p)的程序,勉強能寫成分層式的也是高手中的高手,這種大蝦估計早就轉型當系統分析員了。
一般來說系統大多分為三層(據說分三層很好):用戶層、邏輯層、數據層。也可能不叫這幾個名字,但是不管怎么說功能大體應該一樣。說到功能請看下面
用戶層:就是主要與用戶打交道,也就是用戶界面。什么輸入框啊、提示信息啊的都在上面。因為用戶對于系統而言都是foolish用戶(不是用戶都是fool,而是業務邏輯、數據關系不是每個用戶都能了解的,如果都能了解就可以不用寫程序,直接讓用戶操作數據庫就好了),你不得不在這個層面上做出諸多限制和提示以便用戶能正確的數據輸入。這個層面一般都是原始數據采集以及數據最終的輸出目標。這個就像一個商品的包裝一樣是給別人看的。跟業務邏輯數據處理沒多大關系,不參與邏輯運算數據處理,說白了只能看啊!有人說了不是還有輸入框嗎?那不是只看啊?其實能輸入框只是邏輯層的外延。因為邏輯層沒有用戶界面,只能依靠別人了。就像釣魚,鉤子就是用戶層是用來看的,魚桿、魚線和繞線器還有釣魚的人是邏輯層。魚簍就是數據層了(不是很形象將就著用拉)。
邏輯層:是背地里進行的,用戶毫無所知。系統要做的判斷啊、截斷原始數據啊、對原始數據進行算術運算啊、輸出錯誤信息到用戶層啊等等的。也就是說,用戶輸入“abc”邏輯層要做的是,判斷“abc”是否符合業務邏輯需要,是則繼續否則就是非法數據。邏輯層還要決定是提取“abc”的“a”還是提取“b”傳給數據層以保證數據層的正確運行。當然邏輯層還干很多事就不一一羅嗦了。當邏輯層完成了所有數據的處理判斷,她就數據傳遞給數據層。
數據層:這里是跟數據庫打交道,對于傳入的數據,數據層決定寫入還是添加到數據表中,添加到a表還是b表中。完成了返回成果或者錯誤信息或者數據集合給邏輯層。他就算完事了,其他什么都管。
好了介紹完了(一頭汗啊:~)現在說好處,最典型的例子就是當業務邏輯發生變動的時候,只需要修改邏輯層就可以了其他各層不必改動。比如原來業務邏輯要求把用戶輸入的a加上b得數存入數據庫。后來業務邏輯變了要求a減去b得數存入數據庫。這時候就只需要修改業務邏輯層了。還有當數據庫表字段類型變了,如果沒有分層的話要把所有代碼翻出來看那里用到這個字段,都要改(改完出錯不出錯那就不可知了)。有分層就簡單了,對邏輯層傳入的數據直接轉類型就好了,一切照舊。真是居家旅游、殺人放火必備啊~~~:)
說了這么多到底怎么做才算是分層了?下面寫個小例子
其實用.net的就直接分了層了,用戶界面和邏輯數據兩層。
創建一個新項目,創建一個名為test.aspx的文件。創建一個名為dbtest.cs的類。打開test.aspx成如下樣子
<%@ page language="c#" codebehind="test.aspx.cs" autoeventwireup="false" inherits="movieadmin.test" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html>
<head>
<title>test</title>
<meta name="generator" content="microsoft visual studio .net 7.1">
<meta name="code_language" content="c#">
<meta name="vs_defaultclientscript" content="javascript">
<meta name="vs_targetschema" content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body ms_positioning="gridlayout">
<form id="form1" method="post" runat="server">
<asp:textbox id="textbox1"
runat="server"></asp:textbox>
<asp:textbox id="textbox2"
runat="server"></asp:textbox>
<asp:button id="button1" runat="server"
text="button"></asp:button>
</form>
</body>
</html>
就是兩個文本框一個提交按紐
打開test.cs(就是查看test.aspx的代碼)
寫如下
using system;
using system.collections;
using system.componentmodel;
using system.data;
using system.drawing;
using system.web;
using system.web.sessionstate;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.htmlcontrols;
namespace movieadmin
{
/// <summary>
/// test 的摘要說明。
/// </summary>
public class test : system.web.ui.page
{
protected system.web.ui.webcontrols.textbox textbox1;
protected system.web.ui.webcontrols.textbox textbox2;
protected system.web.ui.webcontrols.button button1;
private void page_load(object sender, system.eventargs e)
{
// 在此處放置用戶代碼以初始化頁面
}
#region web 窗體設計器生成的代碼
override protected void oninit(eventargs e)
{
//
// codegen: 該調用是 asp.net web 窗體設計器所必需的。
//
initializecomponent();
base.oninit(e);
}
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void initializecomponent()
{
this.button1.click += new system.eventhandler(this.button1_click);
this.load += new system.eventhandler(this.page_load);
}
#endregion
private void button1_click(object sender, system.eventargs e)
{
string text1 = textbox1.text.trim();
string text2 = textbox2.text.trim();
string text3 = text1 + test2;
dbtext td = new dbtext();
td.insert(text3);
}
}
}
再寫dbtest.cs類為如下
using system;
using system.data.sqlclient;
namespace movieadmin
{
/// <summary>
/// dbtext 的摘要說明。
/// </summary>
public class dbtext
{
public dbtext()
{
//
// todo: 在此處添加構造函數邏輯
//
}
public string insert(string tempstr)
{
sqlconnection conn = db.dbopen() ;
strsql = "insert into [table](aaa) values('"+tempstr+"')" ;
publib.db.dbexecute(conn, strsql) ;
conn.close();
return "成功" ;
}
}
}
現在大功告成,恭喜你終于寫出了一個毫無用處的分層式程序。:p
這個只是一個粉簡單的例子,結構的表示。真正應用還有很多套路,我也在摸索中....
有什么問題留言吧,不過別指望太多,我也是半桶水:p
新聞熱點
疑難解答
圖片精選